条件语句可以将一个变量与其它变量的值相比较,或将一个变量与一字符串常量相比较,从而确定执行或忽略makefile文件中一部分脚本。
1. 条件语句语法
条件语句使用三个指令:ifeq、else 和 endif。
- ifeq 语句是条件的开始,并指明条件。它包含两个参数,它们被逗号分开,并被阔在圆括号内。运行时首先对两个参数变量替换,然后进行比较。跟在 ifeq 后面的是符合条件时执行的命令,否则它们将被忽略。
- 如果前面的条件失败,else 指令将导致跟在其后面的命令执行。else 指令是可选的。
- endif 指令结束条件语句。
格式:
conditional-directive
text-if-true
else
text-if-false
endif
对于 'conditional-directive’的语法有下面两种形式:
- ifeq
扩展参数arg1、arg2中的所有变量引用,并且比较它们。如果条件为真,使用 ‘text-if-true’ ,如果条件为假,使用 ‘text-if-false’ 。ifeq (arg1, arg2) ifeq 'arg1' 'arg2' ifeq "arg1" "arg2" ifeq "arg1" 'arg2' ifeq 'arg1' "arg2"
- ifneq
扩展参数arg1、arg2中的所有变量引用,并且比较它们。如果它们不同,则使用 ‘text-if-true’,否则使用 ‘text-if-false’。ifneq (arg1, arg2) ifneq 'arg1' 'arg2' ifneq "arg1" "arg2" ifneq "arg1" 'arg2' ifneq 'arg1' "arg2"
2. 与ifdef区别
注意 ifdef 可以测试变量是否定义,不能确定变量是否是非空值。使用 ifdef 测试所有定义过的变量都返回真,但像 ‘foo=’ 情况除外。例如:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
设置 frobozz 的值为 yes。而:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
设置 frobozz 为 no。
3. 测试变量是否为空
当要测试一个变量是否为空时,当经过要给复杂的扩展得到一个值时,您认为是空,实际上有可能包含空格不被认为是空值,由此可能造成混乱,可以使用 strip 函数避免空格作为非控制的干扰,常用形式:
ifeq ($(strip $(foo)),)
text-if-empty
endif
4. 测试标志
可以使用变量 MAKEFLAGS 和 findstring 函数编写一个条件语句,用它来测试make命令选项
ifneq (,$(findstring t,$(MAKEFLAGS)))
...
endif