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


相关文章
|
IDE Linux 开发工具
Linux添加硬盘并进行分区、格式化、挂载及卸载
Linux添加硬盘并进行分区、格式化、挂载及卸载
944 0
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
1159 0
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
|
前端开发 Go
前端量子纠缠 效果炸裂 multipleWindow3dScene
这篇文章介绍了一个前端三维窗口管理器项目,该项目通过Three.js库创建了一种量子纠缠效果的3D视窗场景,并提供了项目的GitHub地址、运行方法和部分关键源码。
前端量子纠缠 效果炸裂 multipleWindow3dScene
|
Shell Linux 编译器
Linux Makefile 全面教程:使用 Makefile 进行项目管理和构建
Linux Makefile 全面教程:使用 Makefile 进行项目管理和构建
1680 0
|
XML 算法 Java
Android Studio App开发之利用图像解码器ImageDecoder播放GIF动图、Webp、HEIF图片(附源码 简单实用)
Android Studio App开发之利用图像解码器ImageDecoder播放GIF动图、Webp、HEIF图片(附源码 简单实用)
1129 0
|
Shell
【P4】解决本地文件修改与库文件间的冲突问题
【P4】解决本地文件修改与库文件间的冲突问题
1305 0
【P4】解决本地文件修改与库文件间的冲突问题
|
Shell Linux C语言
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
603 0
|
安全 Linux 调度
倚天虚拟化:CPU虚拟化原理介绍
虚拟化技术中最关键的技术之一就是CPU虚拟化。在没有硬件辅助虚拟化技术出来之前,通常都是通过TCG(软件进行指令翻译)的方式实现CPU虚拟化。但是由于TCG方式的虚拟化层开销太大,性能太差,因此引入了硬件辅助虚拟化技术。
2310 1
|
缓存 Unix Linux
记一次探索内存cache优化之旅
本文先介绍文件的LINUX 内存和 page cache 机制,并介绍应用程序级的管理方法,最后介绍针对 应用的内存优化实践。
3171 17
记一次探索内存cache优化之旅