条件判断语句

makefile 中支持条件判断语句

  • 可以根据条件的值来决定 make 的执行
  • 可以比较两个不同变量或者变量值和常量值

tiaojianpanduanyuju

注意事项:

条件判断语句只能用于控制 make 实际执行的语句;不能控制规则中命令的执行过程。

语法说明

  • 常用形式
    • ifxxx (arg1, arg2)
  • 其他合法形式
    • ifxxx “arg1” “arg2”
    • ifxxx ‘arg1’ ‘arg2’
    • ifxxx “arg1” ‘arg2’
    • ifxxx ‘arg1’ “arg2”

xiaotieshi

条件判断关键字

关键字 功能
ifeq 判断参数是否相等,相等为 true,否则为 false
ifneq 判断参数是否不相等,不相等为 true,相等为 false
ifdef 判断变量是否有值,有值为 true,否则为 false
ifndef 判断变量是否没有值,没有值为 true,否则为 false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 示例

.PHONY : test

var1 := A
var2 := $(var1)
var3 :=

test:
ifeq ($(var1),$(var2)) # # 这里前面是空格而不是一个 [Tab]
@echo "var1 == var2"
else
@echo "var1 != var2"
endif

ifneq ($(var2),)
@echo "var2 is NOT empty"
else
@echo "var2 is empty"
endif

ifdef var2
@echo "var2 is NOT empty"
else
@echo "var2 is empty"
endif

ifndef var3
@echo "var3 is empty"
else
@echo "var3 is NOT empty"
endif

注意,在使用上述条件判断语句时候,前面就不能使用 [Tab] 了,要改为使用空格

一些工程经验

  • 条件判断语句之前可以有空格,但不能有 [Tab] 字符(’\t’)
  • 在条件语句中不要使用自动变量($@、$^、$<)
  • 一条完整的条件语句必须位于同一个 makefile 中
  • 条件判断语句类似 C 语言中的宏,预处理阶段有效,执行阶段无效
  • make 在加载 makefile 时
    • 首先计算表达式的值(赋值方式不同,计算方式不同)
    • 根据判断语句的表达式决定执行的内容

此处的预处理阶段是指 make 解释器加载 makefile 的时候,在加载的时候就对条件判断语句进行处理了;除了完成后才会实际去执行 makefile 中的规则;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 示例
.PHONY : test

var1 :=
var2 := $(var1)

var3 =
var4 = $(var3)

#var3 = 3

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

# make
# var1 is NOT defined
# var2 is NOT defined
# var3 is NOT defined
# var4 is defined

这里 make 解释器认为 var4 已经定义了,是为什么呢?

因为在预处理阶段 make 解释器在加载 makefile 的时候,根本就无法判断出 var4 的值应该是什么,此时 make 解释器只能判断出var3 的值是空的,但 var4 的值要延迟到加载 makefile 文件的时候才能够得知,所以他就认为 var4 是有值的。

当 var3 = 3 时,二者就都是有值的。

小结

  • 条件判断根据条件的值来决定 make 的执行
  • 条件判断可以比较两个不同变量或者变量和常量的值
  • 条件判断在预处理阶段有效,执行阶段无效
  • 条件判断不能控制规则中命令的执行过程