makefile 的strip,filter,ifeq,ifneq基础使用

目录

  • 一、strip
    • 1.1 语法
    • 1.2 示例
    • 1.3 使用场景
  • 二、filter
    • 2.1 语法
    • 2.2 示例
    • 2.3 使用 * 和 ? 通配符
    • 2.4 结合使用
    • 2.5 使用场景
  • 三、ifeq 和 ifneq
    • 3.1 ifeq
      • 3.1.1 语法
      • 3.1.2 示例
    • 3.2 ifneq
      • 3.2.1 语法
      • 3.2.2 示例
    • 3.3 典型使用场景
      • 3.3.1 根据版本控制编译选项:
      • 3.3.2 选择不同的源文件:
    • 3.4 逻辑运算符
    • 3.5 具体注意事项
  • 四、参考链接


一、strip

strip 函数是一个用于处理字符串的函数。它主要用于去除字符串的空格或特定字符,常用于构建或定义变量时进行字符串清理。

1.1 语法

strip(STR)
  • 参数: STR 表示要处理的输入字符串。

  • 返回值: 返回去除字符串两端空白字符后的字符串。

  • 功能
    strip 函数删除输入字符串开头和结尾的空格(包括制表符和换行符),并保留中间的空格。
    这个函数通常用于确保字符串在使用前没有多余的空格,避免在构建过程中出现意外的格式问题。

1.2 示例

MY_VAR :=    Hello, World!   
STRIPPED_VAR := $(strip $(MY_VAR))

在这个例子中:

MY_VAR 的值是   Hello, World! (包围在空格中的字符串)。
使用 strip 函数,STRIPPED_VAR 的值将变成 Hello, World!,即前后的空格被移除。

1.3 使用场景

  • 清理输入变量:
    在定义变量时,确保其值干净整洁(无多余空格)。

  • 组合字符串:
    当动态生成字符串时,例如根据其他变量组合多个部分,可以使用 strip 来清除多余的空格,确保最终生成的字符串格式正确。

  • 避免构建错误:
    在自动化构建过程中,残留的空格可能导致依赖或文件路径错误,使用 strip 可以帮助避免这些问题。

  • 注意事项
    strip 只移除字符串两端的空白字符,不会改变中间字符之间的空格。
    在使用 strip 时,要确保理解变量的作用和期望输出,有时候保留中间的空格是必要的。


二、filter

filter 函数用于从一组字符串中筛选出符合特定模式的字符串。这对于处理和管理编译文件或目标文件非常有用。

2.1 语法

filter(PATTERN1 PATTERN2 ... , STRING1 STRING2 ...)
  • 参数:
    PATTERN1 PATTERN2 …:一系列模式,可以使用通配符(如 * 和 ?)。
    STRING1 STRING2 …:要筛选的字符串列表。
  • 返回值: 返回与所有模式匹配的字符串。
  • 功能
    filter 函数遍历指定的字符串列表,并返回所有匹配提供模式的字符串。
    如果没有任何字符串与模式匹配,返回空字符串。

2.2 示例

FILES := file1.o file2.o file3.o fileA.o fileB.o  
# 筛选出以 file1 和 fileA 开头的文件  
FILTERED_FILES := $(filter file1.o fileA.o, $(FILES))

在这个例子中:

变量 FILES 包含多个文件名。
FILTERED_FILES 将仅包含 file1.o 和 fileA.o,因为这些字符串符合提供的模式。

2.3 使用 * 和 ? 通配符

filter 函数支持通配符,以便更灵活地筛选文件。例如:

FILES := src/file1.cpp src/file1.h src/file2.cpp src/fileA.java  
# 筛选出以 file1 结尾的文件  
FILTERED_FILES := $(filter %file1.*, $(FILES))

在这里:
%file1.* 表示八个字符串中任何以 file1 结尾的文件(扩展名可以是 .cpp, .h 等)。

2.4 结合使用

filter 函数可以与其他函数结合使用,以实现更复杂的逻辑。例如,您可以先使用 wildcard 函数获取某目录下的所有文件,随后使用 filter 来筛选出特定文件:

# 获取所有的 .cpp 和 .h 文件  
SOURCE_FILES := $(wildcard src/*.cpp) $(wildcard include/*.h)  
# 筛选出只包含 .cpp 的文件  
CPP_FILES := $(filter %.cpp, $(SOURCE_FILES))

2.5 使用场景

常用于处理文件名,尤其在构建过程中自动管理源文件和目标文件的列表。


三、ifeq 和 ifneq

ifeq 和 ifneq 是在 Makefile 中用于条件判断的指令,它们允许根据给定条件执行不同的代码块。这两个指令主要用于根据变量的值执行不同的操作。

3.1 ifeq

3.1.1 语法

ifeq (条件1, 条件2)  # 条件成立时执行的代码  
endif

作用: 如果 条件1 等于 条件2,则执行代码块。

3.1.2 示例

VERSION := 1.0  
ifeq ($(VERSION), 1.0)  $(info Version is 1.0)  
endif

在这个例子中,如果 VERSION 的值是 1.0,则会输出信息“Version is 1.0”。

3.2 ifneq

3.2.1 语法

ifneq (条件1, 条件2)  # 条件不成立时执行的代码  
endif

作用: 如果 条件1 不等于 条件2,则执行代码块。

3.2.2 示例

VERSION := 1.0  
ifneq ($(VERSION), 2.0)  $(info Version is not 2.0)  
endif

在这个例子中,如果 VERSION 的值不是 2.0,则会输出信息“Version is not 2.0”。

3.3 典型使用场景

3.3.1 根据版本控制编译选项:

TARGET_PLATFORM := android  
ifeq ($(TARGET_PLATFORM), android)  CFLAGS += -DPLATFORM_ANDROID  
else  CFLAGS += -DPLATFORM_OTHER  
endif

3.3.2 选择不同的源文件:

CONFIG := debug  
ifeq ($(CONFIG), debug)  SOURCES := main_debug.cpp  
else  SOURCES := main_release.cpp  
endif

3.4 逻辑运算符

ifeq 和 ifneq 可以与 else 和 else if 结合使用以处理更复杂的逻辑。

PLATFORM := windows  
ifeq ($(PLATFORM), windows)  OS := Windows OS  
else ifeq ($(PLATFORM), linux)  OS := Linux OS  
else  OS := Unknown OS  
endif

3.5 具体注意事项

  • 空值比较: 使用 ifeq 或 ifneq 检查空值时,确保传递的参数格式正确。例如,如果你想检查变量是否为空,可以使用:
ifeq ($(VAR),)  $(info VAR is empty)  
endif
  • 调用与空格: 使用 ifeq 和 ifneq 时,如果比较的字符串中有空格,确保在引用变量时使用括号或适当的引用(使用 $(VAR))。

  • 字符串感知: ifeq 和 ifneq 是基于字符串的比较,意味着它们不考虑数字类型的比较。如果需要进行数字比较,则需要使用 ifeq 结合数值计算。


四、参考链接

makefile 的ifeq,filter,strip 简单使用。
Android mk文件ifeq、ifneq和filter语句学习
Makefile 中 ifeq ifneq 等用法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25/2/8 <机器人基础> 阻抗控制

1. 什么是阻抗控制? 阻抗控制旨在通过调节机器人与环境的相互作用,控制其动态行为。阻抗可以理解为一个力和位移之间的关系,涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制:根据感测的外力调节机械手的动作。位置…

RKMPP依赖硬件单元

rkmpp(Rockchip Media Process Platform)主要依赖瑞芯微(Rockchip)芯片中的 VPU(Video Process Unit,视频处理单元) 和 RGA(Raster Graphic Acceleration Unit,2D图形加速…

android的ViewBinding的使用

参考: 安卓开发中的ViewBinding使用

C++线程池

使用线程情况比较频繁的地方,由于线程的创建及销毁都会产生对资源的占用及性能的损耗。为了优化性能,提升效率,在这种场景中,就应该使用线程池来处理任务。 线程池创建的关键点: 装载线程的容器,在C中使用…

一周发生AI事件总结(02.08)

本周人工智能领域发生的所有事件: Ilya Sutskever的初创公司正洽谈以约200亿美元估值进行融资:据路透社报道,由前OpenAI首席科学家Ilya Sutskever创立的人工智能初创公司Safe Superintelligence正洽谈以“至少”200亿美元的估值进行融资。该…

FFmpeg(一) 简介

FFmpeg 官网 FFmpeg 下载 ffmpeg-release-essentials.7z ffmpeg-release-full-shared.7z FFmpeg既是一款音视频编解码工具,同时也是一组音社频编解码开发套件 FFmpeg包含 多种音视频编码多种协议的流媒体多种色彩格式转换多种采样率转换多种码率转换多种丰富的…

Android内存性能优化量化指标

在 Android 开发中,对内存性能进行优化至关重要,这有助于提升应用的稳定性和流畅度,避免因内存问题导致的卡顿、崩溃等现象。以下是一些常见的 Android 内存性能优化量化指标: 内存占用指标 堆内存使用量 定义:堆内…

linux 基础知识点之工作队列workqueue

多年前就了解了workqueue着玩意,但理解上就并不是很很深刻,今天重新梳理一下,本文重点的是哪个些现成的demo代码,都是可以直接拿来用的,这就是写这文章的目的和作用,就是为了备份后续工作用到的时候&#x…

【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA

本篇,将使用CubeMXKeil,创建一个SD卡的 FatFSSDIODMA 文件系统读写工程。 目录 一、简述 二、CubeMX 配置 FatFSSDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果,如下图: 一、简述 上两篇,已循序渐进讲解了SD、…

docker环境下部署face-search开源人脸识别模型

由于我们是直接将face-search部署在docker容器中的,所以,在部署之前一定要检查一下自己的docker环境,要不然部署过程中会出现各种各样的问题 我这里的docker环境是 一、安装docker环境 如果docker版本比较低或者docker-compose的版本比较低的情况下,部署的时候docker的yml…

【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪

文章目录 【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪一、引言二、Android 开发与 AI 的融合趋势三、OpenCV 简介四、运动跟踪原理(一)光流法(二)卡尔曼滤波(三)粒子滤波 五、基于…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…

5、大模型的记忆与缓存

文章目录 本节内容介绍记忆Mem0使用 mem0 实现长期记忆 缓存LangChain 中的缓存语义缓存 本节内容介绍 本节主要介绍大模型的缓存思路,通过使用常见的缓存技术,降低大模型的回复速度,下面介绍的是使用redis和mem0,当然redis的语义…

用 Python 给 Excel 表格截图(20250207)

我搜索了网络上的方案,感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径,因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文,因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案,主要弥补…

ZooKeeper Watcher 机制详解:从注册到回调的全过程

引言 在分布式系统中,数据的实时性和一致性是至关重要的。ZooKeeper 通过其 Watcher 机制提供了一种高效的方式来监听数据变化或事件,从而使客户端能够在数据发生变化时立即收到通知。本文将深入探讨 ZooKeeper 的 Watcher 机制,具体包括客户…

继承QLineEdit类实现自动补全功能

QlineEdit类本身是没有自动补全功能的,可以使用QCompleter配合实现功能。 但是在开发过程中发现,输入的字符串如果匹配那么QCompleter类会弹窗显示匹配项,如果输入的字符串不匹配则QCompleter类会关闭弹出(这点我也倒是能理解,没有…

从量化投资到AI大模型:DeepSeek创始人梁文锋的创新之路

一、学术的启蒙:学霸的崭露头角 梁文锋的成长故事始于1985年,他出生在广东省湛江市的一个普通家庭。从小,梁文锋就展现出对知识的强烈渴望和非凡的学习能力,尤其在数学领域,他总是能够轻松解决复杂的难题,成为学校里备受瞩目的“学霸”。 2002年,年仅17岁的梁文锋以吴川…

【课程设计参考】迷宫小游戏 :基于 Python+Pygame+AI算法

一、内容 实现走迷宫 (1)游戏界面显示:迷宫地图、上下左右移动的特效。 (2)动作选择:上下左右键对应于上下左右的移动功能,遇到障碍的处理。 (3)得分统计功能&#xff…

redis高级数据结构Stream

文章目录 背景stream概述消息 ID消息内容常见操作独立消费创建消费组消费 Stream弊端Stream 消息太多怎么办?消息如果忘记 ACK 会怎样?PEL 如何避免消息丢失?分区 Partition Stream 的高可用总结 背景 为了解决list作为消息队列是无法支持消息多播问题,Redis5.0…

在stm32mp257的yocto中设置用户名和密码

在STM32MP257的Yocto环境中设置用户名和密码,通常需要修改根文件系统的用户配置。以下是详细步骤: 1. 设置root密码 默认情况下,root账户可能无密码或使用默认密码。通过以下方法修改: 方法1:在local.conf中直接设置 # 打开Yocto工程的配置文件 vi conf/local.conf# 添…