我可以将变量作为命令行参数传递给 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