Makefile基础教程(条件判断语句)

简介: Makefile基础教程(条件判断语句)

前言

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


相关文章
|
iOS开发 Python
Python流程控制语句-条件判断语句练习及应用详解
Python流程控制语句-条件判断语句练习及应用详解
153 0
|
Python
python之if语句的单分支,双分支,多分支,if逻辑运算符or,if逻辑运算符and,if语句的嵌套的定义及其使用方法
python之if语句的单分支,双分支,多分支,if逻辑运算符or,if逻辑运算符and,if语句的嵌套的定义及其使用方法
240 0
|
C语言
C语言语句(2)--循环语句
C语言语句(2)--循环语句
|
7月前
|
编译器 C语言
Makefile条件判断
Makefile条件判断
56 0
|
7月前
|
C语言 Python
【Python指南 | 第六篇】条件控制语句、循环语句,这一篇就够了
【Python指南 | 第六篇】条件控制语句、循环语句,这一篇就够了
80 0
makefile 条件判断语句
makefile 条件判断语句
119 0
|
Java Shell
Shell基础学习---2、运算符、条件判断、流程控制
Shell基础学习---2、运算符、条件判断、流程控制
|
Shell
【Shell编程】Shell中多分支case条件语句
【Shell编程】Shell中多分支case条件语句
112 0
|
JavaScript 索引
JS基础教程6——流程控制—循环语句与类型转换
三个语句在特定情况下都是可以升省略的,通过实际情况而定。 语句 1 在循环(代码块)开始之前执行。 语句 2 定义运行循环(代码块)的条件。 语句 3 会在循环(代码块)每次被执行后执行。