LV100-条件判断
本文主要是makefile——条件判断相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
一、基本语法
1. 语法格式
Makefile 编译文件时,可能会遇到需要分条件执行的情况,比如在一个工程文件中,可编译的源文件很多,但是它们的类型可能是不相同的,所以编译文件使用的编译器也可能是不同的。这个时候就用到了条件判断。
条件表达式语法如下:
# 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层单引号和双引号作用相同:
# 以下几种写法效果一样
ifeq ($(DEBUG),1)
ifeq '$(DEBUG)' '1'
ifeq "$(DEBUG)" "1"
ifeq '$(DEBUG)' "1"
ifeq "$(DEBUG)" '1'引号只是为了防止参数被空格分割,特别是当值包含空格时:
# 不带引号 - 错误,make 会把 "hello world" 当作两个参数
ifeq ($(MSG), hello world)
# 带引号 - 正确
ifeq "$(MSG)" "hello world"二、使用实例
1. ifeq
1.1 基本用法
ifeq 判断参数是否相同,相同为 true
ifeq (<arg1>, <arg2>)
ifeq '<arg1>' '<arg2>'
ifeq "<arg1>" "<arg2>"
ifeq "<arg1>" '<arg2>'
ifeq '<arg1>' "<arg2>"比较参数 ARG1 和 ARG2 的值是否相同,相同为 true ,不相同为 false 。当然,参数中我们还可以使用 make 的函数。如:
ifeq ($(strip $(foo)),)
<text-if-empty>
endif这个示例中使用了 strip 函数,如果这个函数的返回值是空(Empty),那么 就 生效。
1.2 示例
CC = a
test:
ifeq ($(CC),gcc)
@echo "True"
else
@echo "False"
endif
.PHONY: clean
clean:
rm -rf *.o main在终端执行 make test ,会看到输出了以下内容:
False2. ifneq
2.1 基本用法
ifneq 判断参数是否不相等,不相等为 true
ifneq (<arg1>, <arg2>)
ifneq '<arg1>' '<arg2>'
ifneq "<arg1>" "<arg2>"
ifneq "<arg1>" '<arg2>'
ifneq '<arg1>' "<arg2>"比较参数 ARG1 和 ARG2 的值是否不相同,不相同为 true ,相同为 false 。
2.2 示例
CC = a
test:
ifneq ($(CC),gcc)
@echo "True"
else
@echo "False"
endif
.PHONY: clean
clean:
rm -rf *.o main在终端执行 make test ,会看到输出了以下内容:
True3. ifdef
3.1 基本用法
ifdef 判断参数是否非空,非空值为 true
ifdef <variable-name>判断参数 VARIABLE_NAME 是否非空值,非空值表达式为 true ,若为空值则表达式为 false。
3.2 示例
例如
a:=
test:
ifdef a
@echo "True"
else
@echo "False"
endif
.PHONY: clean
clean:
rm -rf *.o main在终端执行 make test ,会看到输出了以下内容:
False4. ifndef
4.1 基本用法
ifndef 判断参数是否是非空值,空值为 true
ifndef VARIABLE_NAME判断参数 VARIABLE_NAME 是否为空值,若为空值表达式为 true ,非空值的话表达式为 false 。
4.2 示例
a:=
test:
ifdef a
@echo "True"
else
@echo "False"
endif
.PHONY: clean
clean:
rm -rf *.o main在终端执行 make test ,会看到输出了以下内容:
True