Makefile - 指令

有许多指令以各种形式提供。您系统上的 make 程序可能不支持所有指令。因此,请检查您的 make 是否支持我们在此处解释的指令。GNU make 支持这些指令。

条件指令

条件指令为 −

  • ifeq 指令开始条件,并指定条件。它包含两个参数,以逗号分隔并用括号括起来。对两个参数执行变量替换,然后进行比较。如果两个参数匹配,则遵循 makefile 中 ifeq 后面的行;否则,它们将被忽略。

  • ifneq 指令开始条件,并指定条件。它包含两个参数,以逗号分隔并用括号括起来。对两个参数执行变量替换,然后进行比较。如果两个参数不匹配,则遵循 makefile 中 ifneq 后面的行;否则,它们将被忽略。

  • ifdef 指令开始条件,并指定条件。它包含单个参数。如果给定的参数为真,则条件变为真。

  • ifndef 指令开始条件,并指定条件。它包含单个参数。如果给定的参数为假,则条件变为真。

  • 如果前一个条件失败,则 else 指令会导致遵循以下行。在上面的例子中,这意味着当第一个替代方案未使用时,将使用第二个替代链接命令。在条件中可以选择使用 else。

  • endif 指令结束条件。每个条件语句都必须以 endif 结尾。

条件指令的语法

没有 else 的简单条件语句的语法如下 −

conditional-directive
   text-if-true
endif

text-if-true 可以是任意文本行,如果条件为真,则将其视为 makefile 的一部分。如果条件为假,则不使用任何文本。

复杂条件的语法如下 −

conditional-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,然后再继续。该指令是 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 处理包含指令时,它会暂停读取 makefile 并依次读取每个列出的文件。完成后,make 会继续读取出现该指令的 makefile。

覆盖指令

如果已使用命令参数设置变量,则 makefile 中的普通赋值将被忽略。如果您想在 makefile 中设置变量,即使它是使用命令参数设置的,也可以使用覆盖指令,该指令是一行如下所示的指令s−

override variable = value

or

override variable := value