从命令行传递额外的变量

我可以将变量作为命令行参数传递给GNU Makefile吗? 换句话说,我想传递一些参数,这些参数最终会成为Makefile中的变量。


你有几个选项来设置makefile外部的变量:

  • 从环境 - 每个环境变量被转换成具有相同名称和值的makefile变量。

    你可能还想设置-e选项(又名--environments-override ),你的环境变量将覆盖makefile中的赋值(除非这些赋值本身使用了override指令)。但是,这不是建议的,它更好,灵活使用?=赋值(条件变量赋值运算符,只有在变量尚未定义时才有效):

    FOO?=default_value_if_not_set_in_environment
    

    请注意,某些变量不会从环境中继承:

  • MAKE是从脚本的名字中获得的
  • SHELL可以在makefile中设置,或者默认为/bin/sh (基本原理:命令在makefile中指定,并且它们是shell特定的)。
  • 从命令行 - make可以将变量赋值作为其命令行的一部分,并与目标混合在一起:

    make target FOO=bar
    

    但是,除非在赋值中使用override指令,否则将忽略makefile中FOO变量的所有赋值。 (效果与环境变量的-e选项相同)。

  • 从父级Make导出 - 如果从Makefile调用Make,通常不应该像这样显式编写变量赋值:

    # Don't do this!
    target:
            $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
    

    相反,更好的解决方案可能是导出这些变量。 导出一个变量使其进入每个shell调用的环境,并且使得来自这些命令的调用按照上面的指定选择这些环境变量。

    # Do like this
    CFLAGS=-g
    export CFLAGS
    target:
            $(MAKE) -C target
    

    您也可以通过使用导出所有变量export不带参数。


  • 最简单的方法是:

    make foo=bar target
    

    然后在你的makefile中你可以引用$(foo) 。 请注意,这不会自动传播给子版本。

    如果您使用子版本,请参阅此文章:将变量传递给子版本


    假设你有这样的makefile:

    action:
        echo argument is $(argument)
    

    然后你会把它叫做make action argument=something

    链接地址: http://www.djcxy.com/p/30423.html

    上一篇: Passing additional variables from command line to make

    下一篇: line arguments in PowerShell