- Makefile 教程
- Makefile - 首页
- Makefile - 为什么使用 Makefile?
- Makefile - 宏
- Makefile - 依赖关系
- Makefile - 规则
- Makefile - 后缀规则
- Makefile - 指令
- Makefile - 重新编译
- Makefile - 其他特性
- Makefile - 示例
- Makefile 快速指南
- Makefile - 快速指南
- Makefile - 有用资源
- Makefile - 讨论
Makefile - 指令
各种形式的指令有很多。您系统上的 make 程序可能不支持所有指令。因此,请检查您的 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-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 处理 include 指令时,它会暂停读取 Makefile 并依次从每个列出的文件中读取。完成后,make 会恢复读取包含该指令的 Makefile。
override 指令
如果使用命令参数设置了变量,则忽略 Makefile 中的普通赋值。如果希望在 Makefile 中设置变量,即使它是使用命令参数设置的,也可以使用 override 指令,它是一行,如下所示:
override variable = value or override variable := value