一. 前言
条件判断语句可以根据一个变量的值来控制make执行或者忽略Makefile的特定部分。条件语句可以是两个不同变量或者变量与常量值的比较。条件语句只能用于控制make实际执行的Makefile文件部分,不能控制规则的shell的执行过程。Makefile使用条件控制可以做到处理的灵活性和高效性。举例如下:
target:$(objects)
ifeq ($(ARCH),arm)
arm-linux-gcc -o target $(object)
else
gcc -o target $(objects)
endif
例子中,条件判断语句使用到了三个关键词"ifeq","else","endif",其中:
1. "ifeq"表示条件语句的开始,并指定了一个比较条件(相等)。之后用圆括号包围,使用逗号","分割两个参数,圆括号和关键字"ifeq"用空格分开。参数中的变量引用在进行变量值比较时被展开。"ifeq"之后就是当条件满足时会执行的,条件不满足忽略。
2. "else"之后就是当条件不满足时的执行部分。这个部分是可选的。
3. "endif"表示一个条件语句的结束,任何一个条件表达式都必须以"endif"结束。
二. 关键字介绍
条件判断的基本语法,如下
CONDITIONAL-DIRECTIVE
TEXT-IF-TRUE
endif
TEXT-IF-TRUE可以是若干任何文本行,当条件为真时,它就当做make执行的一部分,当条件为假,则不会执行。
包含"else"关键字的语法如下:
CONDITIONAL-DIRECTIVE
TEXT-IF-TRUE
else
TEXT-IF-FALSE
endif
如果条件为真,则"TEXT-IF-TRUE"被执行,否则,"TEXT-IF-FALSE"被执行。示例如下:
ARCH:=arm
define test
ifeq ($(ARCH),arm)
CC:=arm-linux-gcc
else
CC:=gcc
endif
endef
$(warning $(eval $(call test)))
all:
@echo CC=$(CC)
结果:
CC=arm-linux-gcc
注意:"CONDITIONAL-DIRECTIVE"这一行可以以若干个空格开始,make处理时会忽略这些空格,但是不能以TAB字符开始。
1. ifeq
格式:
ifeq (ARG1,ARG2)
判断ARG1和ARG2是否相等。
2. ifneq
格式:
ifneq (ARG1,ARG2)
与"ifeq"的作用相反。
3. ifdef
格式:
ifdef VARIABLE-NAME
注意,ifdef只测试一个变量是否有值,不会测试变量是否为空。对于变量"VARIABLE-NAME",除了"VARIABLE-NAME="情况外,使用其他方式对它定义都会使"ifdef"返回真,也就是通过其他方式给他赋了一个空值,"ifdef"也会返回真。示例如下:
bar=
foo=$(bar)
ifdef foo
frobzz = yes
else
frobozz = no
endif
结果:
frobozz=yes
foo=
ifdef foo
frobzz = yes
else
frobozz = no
endif
结果:
frobozz=no
4. ifndef
格式:
ifndef VARIABLE-NAME
作用和"ifdef"相反。
三. 总结
本文介绍了条件判断的用法和关键字"ifeq","ifneq","ifdef","ifndef",并通过举例介绍其用法。