Skip to content

LV100-条件判断

本文主要是makefile——条件判断相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

一、基本语法

1. 语法格式

Makefile 编译文件时,可能会遇到需要分条件执行的情况,比如在一个工程文件中,可编译的源文件很多,但是它们的类型可能是不相同的,所以编译文件使用的编译器也可能是不同的。这个时候就用到了条件判断。

条件表达式语法如下:

shell
# 1.语法格式一
<conditional-directive>
<text-if-true>
endif

# 2.语法格式二
<conditional-directive>
<text-if-true>
else
<text-if-false>
endif

<conditional-directive> 表示的是条件关键字。在这一行上,多余的空格是被允许的,但是不能以 Tab 键做为开始(不然就被认为是命令)。注释符 # 同样也是安全的。 else 和 endif 也一样,只要不 是以 Tab 键开始就可以。

关键字功能
ifeq判断参数是否相等,相等为 true,不相等为 false。
ifneq判断参数是否不相等,不相等为 true,相等为 false。
ifdef判断是否有值,有值为 true,没有值为 false。
ifndef判断是否有值,没有值为 true,有值为 false。
【注意】

(1)在 make 读取 Makefile 文件时就会计算表达式的值,并根据表达式的值决定判断语句中的哪一个部分作为此 Makefile 所要执行的内容。因此在条件表达式中不能使用自动化变量,自动化变量在规则命令执行时才有效。

(2)为了避免混乱, make 不允许把整个条件语句分成两部分放在不同的 Makefile 的文件中。

2. 引号

ifeq/ifneq 用于判断参数是否相等,参数一般会用引号括起来,make层单引号和双引号作用相同:

makefile
# 以下几种写法效果一样
ifeq ($(DEBUG),1)
ifeq '$(DEBUG)' '1'
ifeq "$(DEBUG)" "1"
ifeq '$(DEBUG)' "1"
ifeq "$(DEBUG)" '1'

引号只是为了防止参数被空格分割,特别是当值包含空格时:

makefile
# 不带引号 - 错误,make 会把 "hello world" 当作两个参数
ifeq ($(MSG), hello world)

# 带引号 - 正确
ifeq "$(MSG)" "hello world"

二、使用实例

1. ifeq

1.1 基本用法

ifeq 判断参数是否相同,相同为 true

makefile
ifeq (<arg1>, <arg2>)
ifeq '<arg1>' '<arg2>'
ifeq "<arg1>" "<arg2>"
ifeq "<arg1>" '<arg2>'
ifeq '<arg1>' "<arg2>"

比较参数 ARG1 和 ARG2 的值是否相同,相同为 true ,不相同为 false 。当然,参数中我们还可以使用 make 的函数。如:

makefile
ifeq ($(strip $(foo)),)
<text-if-empty>
endif

这个示例中使用了 strip 函数,如果这个函数的返回值是空(Empty),那么 就 生效。

1.2 示例

makefile
CC = a
test:
ifeq ($(CC),gcc)
	@echo "True"
else
	@echo "False"
endif

.PHONY: clean
clean:
	rm -rf *.o main

在终端执行 make test ,会看到输出了以下内容:

shell
False

2. ifneq

2.1 基本用法

ifneq 判断参数是否不相等,不相等为 true

makefile
ifneq (<arg1>, <arg2>)
ifneq '<arg1>' '<arg2>'
ifneq "<arg1>" "<arg2>"
ifneq "<arg1>" '<arg2>'
ifneq '<arg1>' "<arg2>"

比较参数 ARG1 和 ARG2 的值是否不相同,不相同为 true ,相同为 false 。

2.2 示例

makefile
CC = a
test:
ifneq ($(CC),gcc)
	@echo "True"
else
	@echo "False"
endif

.PHONY: clean
clean:
	rm -rf *.o main

在终端执行 make test ,会看到输出了以下内容:

shell
True

3. ifdef

3.1 基本用法

ifdef 判断参数是否非空,非空值为 true

makefile
ifdef <variable-name>

判断参数 VARIABLE_NAME 是否非空值,非空值表达式为 true ,若为空值则表达式为 false。

3.2 示例

例如

makefile
a:=
test:
ifdef a
	@echo "True"
else
	@echo "False"
endif

.PHONY: clean
clean:
	rm -rf *.o main

在终端执行 make test ,会看到输出了以下内容:

shell
False

4. ifndef

4.1 基本用法

ifndef 判断参数是否是非空值,空值为 true

makefile
ifndef VARIABLE_NAME

判断参数 VARIABLE_NAME 是否为空值,若为空值表达式为 true ,非空值的话表达式为 false 。

4.2 示例

makefile
a:=
test:
ifdef a
	@echo "True"
else
	@echo "False"
endif

.PHONY: clean
clean:
	rm -rf *.o main

在终端执行 make test ,会看到输出了以下内容:

shell
True