前言
一、条件判断语句的语法说明
- makefile 中支持条件判断语句。
- 可以根据条件的值决定 make 的执行。
- 可以
比较
两个不同变量或者变量和常量值。
条件判断语句只能用于控制 make 实际执行的语句;但是,不能控制规则中命令的执行过程。
- 常用形式:
if xxx (arg1,arg2) - 其他合法格式:
if xxx “arg1” “arg2”
if xxx ‘arg1’ ‘arg2’
if xxx “arg1” ‘arg2’
if xxx ‘arg1’ “arg2”
注意:
中间不可以有空格。
二、ifeq / ifneq
- ifeq : 判断参数
是否相等
,相等为 true, 否则是 false. - ifndef : 判断参数
是否不等
,不等为 true, 否则为 false.
ifeq (arg1,arg2) # 如果 arg1 等于 arg2,则执行这里的命令 else # 否则执行这里的命令 endif ifneq (arg1,arg2) # 如果 arg1 不等于 arg2,则执行这里的命令 else # 否则执行这里的命令 endif
三、ifdef / ifndef
- ifdef : 判断参数
是否有值
,有值为 true, 否则是 false. - ifndef : 判断参数
是否没有值
,没有值为 true, 否则为 false.
ifdef variable # 如果 variable 被定义,则执行这里的命令 else # 否则执行这里的命令 endif
代码讲解:
.PHONY : test var1 := A var2 := $(var1) # 将var1 赋值给 var2 var3 := # var3 为空 test : ifeq ($(var1),$(var2)) # 判断var1 和var2 是否相等 @echo "var1 == var2" else @echo "var1 != var2" endif ifdef var3 # 判断var3 是否为空 @echo "var3 is NOT empty" else @echo "var3 is empty" endif
注意:
- 条件判断语句之前可以有空格, 但不能有 Tab 字符
(' \ t ')
. - 在条件语句中
不要使用自动变量
。($@, $^, $<) - 一条完整的条件语句必须位于同一个 makefile 中。
四、经典示例
提问 :
下面这两段代码的执行结果相同吗?
实践出真知,下面就来实际实现一下:
.PHONY : test var1 := var2 := $(var1) # 对 var2 进行简单赋值 var3 = var4 = $(var3) # 对 var3 进行递归赋值 test : ifdef var1 # 判断变量是否存在 @echo "var1 is defined" else @echo "var1 is NOT defined" endif ifdef var2 @echo "var2 is defined" else @echo "var2 is NOT defined" endif ifdef var3 @echo "var3 is defined" else @echo "var3 is NOT defined" endif ifdef var4 @echo "var4 is defined" else @echo "var4 is NOT defined" endif
结果是不同的,这是由于我们的 条件判断类似于 C 语言中的宏,预处理阶段有效,执行阶段无效。
:= 简单赋值 和 = 递归赋值 是不同的。简单赋值会发生在 Makefile 解析的过程中。简单赋值会发生在 Makefile 解析的过程中
总结
下一篇介绍 函数的定义于调用。