📜  Makefile-指令

📅  最后修改于: 2020-11-01 04:37:55             🧑  作者: Mango


有多种形式的指令可用。您系统上的make程序可能不支持所有指令。因此,请检查您的品牌是否支持我们在此处说明的指令。 GNU make支持这些指令。

条件指令

条件指令是-

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

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

  • ifdef指令以条件开头,并指定条件。它包含单个参数。如果给定参数为true,则条件为true。

  • ifndef指令以条件开头,并指定条件。它包含单个参数。如果给定参数为false,则条件为true。

  • 如果先前的条件失败,则else指令导致遵循以下几行。在上面的示例中,这意味着只要不使用第一种替代方法,就使用第二种替代链接命令。在条件中包含else是可选的。

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

条件指令的语法

一个没有其他条件的简单条件的语法如下-

conditional-directive
   text-if-true
endif

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

复杂条件的语法如下-

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

如果条件为true,则使用text-if-true;否则为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),则它将扩展为bash 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