Makefile中有许多指令可用,如条件指令、include指令等。
条件指令
条件指令起的作用与c语言中的if语句类似。
- ifeq – 如果条件相等
- ifneq – 如果条件不相等
- ifdef – 如果条件已经定义(为真)
- ifndef – 如果条件未定义(为假)
- else – 如不满足条件
- endif – 结束条件指令
条件指令的语法
简单条件句的语法如下:
if-directive
text-if-true
endif
text-if-true
可以是任意文本,如果条件为true
,则被视为makefile的一部分。如果条件为false
,则不使用文本。
复合条件句的语法如下:
if-directive
text-if-true
else
text-if-false
endif
如果条件为真,则使用text-if-true;否则,将使用text-if-false。text-if-false可以是任意文本。
条件指令的参数格式可以有多种:
ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq "arg1" 'arg2'
ifeq 'arg1' "arg2"
上述条件的相反条件:
ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq "arg1" 'arg2'
ifneq 'arg1' "arg2"
条件指令例子
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
include 指令
include指令允许make导入其他makefile文件内容,作为当前makefile一部分。
include 文件名...
文件名可以包含shell文件名模式(如*.mk),在行首允许有空格,但不允许有制表符。
例如,如果你有3个.mk
文件,即a.mk
, b.mk
, c.mk
, 然后$(var)
的值为 ddd eee
。
include fff *.mk $(var)
可转换为:
include fff a.mk b.mk c.mk ddd eee
make处理include指令时,会暂停对当前makefile的读取,先处理include指令导入的文件内容,完成后再继续处理当前makefile的内容。
override 指令
如果使用命令行参数设置了变量,则会忽略makefile中的变量赋值。
如果在上述情况下,你仍想让makefile中变量赋值生效,可以使用override指令,如下所示:
override var = value
或者
override var := value