makefile 中支持条件判断语句
- 可以根据条件的值来决定 make 的执行
- 可以比较两个不同变量或者变量值和常量值
注意事项:
条件判断语句只能用于控制 make 实际执行的语句;不能控制规则中命令的执行过程。
语法说明
- 常用形式
- ifxxx (arg1, arg2)
- 其他合法形式
- ifxxx “arg1” “arg2”
- ifxxx ‘arg1’ ‘arg2’
- ifxxx “arg1” ‘arg2’
- ifxxx ‘arg1’ “arg2”
条件判断关键字
关键字 | 功能 |
---|---|
ifeq | 判断参数是否相等,相等为 true,否则为 false |
ifneq | 判断参数是否不相等,不相等为 true,相等为 false |
ifdef | 判断变量是否有值,有值为 true,否则为 false |
ifndef | 判断变量是否没有值,没有值为 true,否则为 false |
1 | # 示例 |
注意,在使用上述条件判断语句时候,前面就不能使用 [Tab] 了,要改为使用空格
一些工程经验
- 条件判断语句之前可以有空格,但不能有 [Tab] 字符(’\t’)
- 在条件语句中不要使用自动变量($@、$^、$<)
- 一条完整的条件语句必须位于同一个 makefile 中
- 条件判断语句类似 C 语言中的宏,预处理阶段有效,执行阶段无效
- make 在加载 makefile 时
- 首先计算表达式的值(赋值方式不同,计算方式不同)
- 根据判断语句的表达式决定执行的内容
此处的预处理阶段是指 make 解释器加载 makefile 的时候,在加载的时候就对条件判断语句进行处理了;除了完成后才会实际去执行 makefile 中的规则;
1 | # 示例 |
这里 make 解释器认为 var4 已经定义了,是为什么呢?
因为在预处理阶段 make 解释器在加载 makefile 的时候,根本就无法判断出 var4 的值应该是什么,此时 make 解释器只能判断出var3 的值是空的,但 var4 的值要延迟到加载 makefile 文件的时候才能够得知,所以他就认为 var4 是有值的。
当 var3 = 3 时,二者就都是有值的。
小结
- 条件判断根据条件的值来决定 make 的执行
- 条件判断可以比较两个不同变量或者变量和常量的值
- 条件判断在预处理阶段有效,执行阶段无效
- 条件判断不能控制规则中命令的执行过程