协慌网

登录 贡献 社区

从命令行传递其他变量以使

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

答案

您可以通过几种方法从 makefile 外部设置变量:

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

    您可能还希望将-e选项(也称为--environments-override )设置为 on,并且您的环境变量将覆盖在 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 调用的环境,并且从这些命令进行的 Make 调用将如上所述选择这些环境变量。

    # 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