Makefile - 指令

  • 简述

    有许多以各种形式提供的指令。make您系统上的程序可能不支持所有指令。所以请检查你的make支持我们在里解释的指令。GNU make支持些指令。
  • 条件指令

    条件指令是 -
    • ifeq指令开始条件,并指定条件。它包含两个参数,用逗号分隔并用括号括起来。对两个参数执行变量替换,然后将它们进行比较。如果两个参数匹配,则遵循 ifeq 后面的 makefile 行;否则它们将被忽略。
    • ifneq指令开始条件,并指定条件。它包含两个参数,用逗号分隔并用括号括起来。对两个参数执行变量替换,然后将它们进行比较。如果两个参数不匹配,则遵循 ifneq 后面的 makefile 行;否则它们将被忽略。
    • ifdef指令开始条件,并指定条件。它包含单个参数。如果给定参数为真,则条件为真。
    • ifndef指令开始条件,并指定条件。它包含单个参数。如果给定参数为假,则条件为真。
    • else如果前一个条件失败,指令会导致遵循以下行。在上面的示例中,意味着只要不使用第一个替代项,就会使用第二个替代链接命令。在条件中有一个 else 是可选的。
    • endif指令结束条件。每个条件都必须以 endif 结尾。
  • 条件指令的语法

    没有其他条件的简单条件的语法如下 -
    
    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 directive允许make暂停读取当前 makefile 并在继续之前读取一个或多个其他 makefile。该指令是生成文件中的一行,如下所示 -
    
    include filenames...
    
    文件名可以包含 shell 文件名模式。行首允许并忽略多余的空格,但不允许使用制表符。例如,如果你有 3 个 `.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 中设置变量,即使它是用命令参数设置的,你可以使用覆盖指令,是一行如下所示 -
    
    override variable = value
    or
    override variable := value