目录
- 一、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 等用法