前言
本篇文章开始讲解Makefile中的条件判断语句,在各种编程语言中都存在条件判断语句,Makefile作为一种脚本语言也是有条件判断语句的,那么现在就让我们来学习一下在Makefile中是如何使用的吧。
一、条件判断语句概念讲解
Makefile 中有多个条件判断语句,可以根据不同条件执行不同的命令。以下是常见的 Makefile 条件判断语句:
1.ifeq 和 ifneq
ifeq 和 ifneq 分别表示等于和不等于的条件判断语句,用法如下:
ifeq ($(VARIABLE),value) ... else ... endif ifneq ($(VARIABLE),value) ... else ... endif
其中,$(VARIABLE) 是需要被判断的变量名,value是需要和变量比较的值。如果判断是正确的,则执行第一组命令;否则执行第二组命令。
2.ifdef 和 ifndef
ifdef 和 ifndef 用于判断变量是否被定义,用法如下:
ifdef VARIABLE ... else ... endif ifndef VARIABLE ... else ... endif
如果变量 VARIABLE 被定义,则执行第一组命令;否则执行第二组命令。
3.ifeq 的比较操作符
ifeq 还支持比较操作符,如 >、<、>=、<=、!= 等。例如:
ifeq ($(NUM1), $(NUM2)) ... endif ifeq ($(NUM1), 10) ... else ifeq ($(NUM1), 20) ... else ... endif ifeq ($(strip $(SOME_VAR)),) ... endif
这里用到了比较两个变量的值,根据不同条件执行不同命令。第三个例子中,使用了 strip 函数,去掉变量值中的所有空格,并且判断是否为空。
需要注意的是,在 Makefile 中使用条件判断语句时,整个语句块必须以 Tab 键开头。否则会引发语法错误。
二、条件判断语句的使用
代码示例:
var := A var1 := $(var) var2 := test : ifeq ($(var),$(var1)) @echo "var == var1" else @echo "var != var1" endif ifneq ($(var),$(var1)) @echo "var != var1" else @echo "var == var1" endif ifdef var2 @echo "var2 is define" else @echo "var2 is not define" endif ifndef var2 @echo "var2 is not define" else @echo "var2 is define" endif
执行结果:
三、条件判断语句使用的注意事项
在使用条件判断语句时,需要注意以下事项:
1.语法:条件判断语句必须以 Tab 键开头,并以 endif 结束,否则会出现语法错误。
2.变量括号:在条件判断语句中,变量必须使用括号包含起来,否则可能会引起错误。例如,正确的写法是 $(VARIABLE),而不是 $VARIABLE。
3.空格问题:在使用条件判断语句时,可能会遇到空格的问题。为了避免这些问题,可以使用 $(strip) 函数来去除变量值两端的空格;也可以使用双引号 "$(VARIABLE)" 来避免因空格错误导致语法非法的情况。
4.多行语句:在条件判断语句中,可以使用多行语句来表示不同的命令,但是需要注意语法。
例如:
ifeq ($(VARIABLE),value) command1 \ command2 else command3 endif
在上面的代码中,使用了多行语句表示条件判断的两个命令。需要注意,第二行和第三行命令必须以 Tab 键开头,否则会出现语法错误。
5.变量赋值:在条件判断语句中,可以使用变量赋值语句。如果需要在条件判断语句中定义变量,需要使用 := 进行赋值。例如:
ifeq ($(VARIABLE),value) NEW_VARIABLE := some value else NEW_VARIABLE := another value endif
在上面的代码中,根据 VARIABLE 的值,定义了一个新的变量 NEW_VARIABLE,并分别赋值为 some value 或者 another value。
四、条件判断语句只在预处理阶段有效
Makefile 语言是分为读取阶段和解释执行阶段的。在读取阶段,Makefile 会将 Makefile 中所有的变量和规则读取进来,同时对所有的预处理命令进行处理,包括条件判断语句。在解释执行阶段,Makefile 会根据具体的规则执行相关的命令。
因此,条件判断语句只在 Makefile 文件读取阶段有用,在解释执行阶段并不会生效。换句话说,条件判断语句的作用是决定 Makefile 文件中哪些规则会被解释执行,哪些规则不会被执行。
需要注意的是,在 Makefile 文件读取阶段,Makefile 会对条件判断语句进行预处理,并根据条件判断语句的结果生成不同的 Makefile 文件。因此,如果在条件判断语句中使用了动态变量或者命令,它们的值并不会被保留到解释执行阶段。如果想要在解释执行阶段获取变量或命令的值,需要在条件判断语句中将它们保存到变量中,并在后续的解释执行阶段中使用这些变量。
这个注意事项这里我们举一个例子来说明:
var1 := var2 := $(var1) var3 = var4 = $(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
运行结果:
那么导致这样的结果是为什么呢?
因为递归赋值也是在 Makefile 文件读取阶段进行处理的,也就是在预处理的时候处理的,当预处理到var4的时候并不会认为var4是空的,会认为var4已经被定义了,所以就会得出这样的结果。
总结
总之,在使用条件判断语句时,需要先了解 Makefile 的基本语法和规则,同时根据实际情况选择合适的条件判断语句,并且注意语法和变量的正确使用。