小编典典

从命令行传递额外的变量来制作

all

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


阅读 183

收藏
2022-03-02

共1个答案

小编典典

您有几个选项可以从 makefile 外部设置变量:

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

您可能还想设置-eoption (aka --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
    

但是,除非您在分配中使用指令,否则 将忽略 makefile 中
_对变量的所有FOO_分配。(效果与环境变量选项相同)。override-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变量。

2022-03-02