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 指令 允许 make 暂停读取当前的 makefile,并在继续之前读取一个或多个其他的 makefile。该指令是 makefile 中的一行,如下所示-
include filenames...
文件名可以包含外壳文件名模式。在行的开头允许和忽略额外的空格,但不允许使用制表符。例如,如果您有三个 `.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 中设置变量,即使它是用命令参数设置的,你可以使用 override 指令,它看起来像下面的一行-
override variable = value
or
override variable := value
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4