Makefile - 指令
有多种不同形式的指令可供使用。您系统上的make程序可能不支持所有指令。因此,请检查您的品牌是否支持我们在此解释的指令。GNU make支持这些指令。
有条件指令
条件指令是 -
ifeq伪指令开始条件并指定条件。它包含两个参数,用逗号分隔并用括号括起来。对两个参数执行变量替换,然后对它们进行比较。如果两个参数匹配,则遵循 ifeq 后面的 makefile 行;否则它们将被忽略。
ifneq伪指令开始条件并指定条件。它包含两个参数,用逗号分隔并用括号括起来。对两个参数执行变量替换,然后对它们进行比较。如果两个参数不匹配,则遵循 ifneq 后面的 makefile 行;否则它们将被忽略。
ifdef伪指令开始条件并指定条件。它包含单个参数。如果给定的参数为真,则条件为真。
ifndef指令开始条件并指定条件。它包含单个参数。如果给定的参数为假,则条件为真。
如果前面的条件失败,则else指令会导致遵循以下行。在上面的示例中,这意味着只要不使用第一个替代链接命令,就使用第二个替代链接命令。条件语句中是否有 else 是可选的。
endif指令结束条件。每个条件语句都必须以 endif 结尾。
条件指令的语法
没有 else 的简单条件的语法如下 -
conditional-directive text-if-true endif
text-if-true 可以是任何文本行,如果条件为 true,则将其视为 makefile 的一部分。如果条件为假,则不使用任何文本。
复杂条件的语法如下 -
conditional-directive text-if-true else text-if-false endif
如果条件为 true,则使用 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指令允许make暂停读取当前 makefile 并在继续之前读取一个或多个其他 makefile。该指令是 makefile 中的一行,如下所示:
include filenames...
文件名可以包含 shell 文件名模式。行首允许并忽略额外的空格,但不允许使用制表符。例如,如果您有三个“.mk”文件,即“a.mk”、“b.mk”和“c.mk”,以及 $(bar),那么它会扩展为 bish bash,然后是以下内容表达。
include foo *.mk $(bar) is equivalent to: include foo a.mk b.mk c.mk bish bash
当make处理 include 指令时,它会暂停读取 makefile 并依次读取每个列出的文件。完成后,make继续读取该指令所在的 makefile。
覆盖指令
如果使用命令参数设置了变量,则 makefile 中的普通赋值将被忽略。如果您想在 makefile 中设置变量,即使它是使用命令参数设置的,您也可以使用 override 指令,该指令如下所示:
override variable = value or override variable := value