教程 > Makefile > Makefile 基础 阅读:64

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 可以是任何文本行,如果条件为真,将被视为 makefile 的一部分。 如果条件为假,则不使用任何文本。

复杂条件的语法如下

conditional-directive
   text-if-true
else
   text-if-false
endif

如果条件为真,则使用 text-if-true; 否则,使用 text-if-falsetext-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 处理 include 指令时,它会暂停读取 makefile 并依次从每个列出的文件中读取。 完成后,make 继续读取指令出现的 makefile。


覆盖 override 指令

如果已使用命令参数设置变量,则忽略 makefile 中的普通赋值。 如果你想在 makefile 中设置变量,即使它是用命令参数设置的,你可以使用覆盖指令,它是如下一行:

override variable = value

或者

override variable := value

查看笔记

扫码一下
查看教程更方便