(文章目录)


前言

本篇文章开始讲解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 的基本语法和规则,同时根据实际情况选择合适的条件判断语句,并且注意语法和变量的正确使用。