【发布时间】:2021-08-17 23:50:22
【问题描述】:
在 GNU Makefiles 中,环境变量和参数/变量/宏之间经常存在交互。还有几种不同的赋值运算符,有可以在命令行上提供的“覆盖”变量,还有一个override 指令。
这些交互的优先规则是什么?
考虑这个 Makefile:
# Use := to avoid infinite recursion of macro expansion
CFLAGS := -g -O2 $(CFLAGS)
hello: src/hello.c
cc $(CFLAGS) -o $@ $<
如果你调用CFLAGS=-pipe make hello,你会得到cc -g -O2 -pipe -o hello src/hello.c。如果你调用make CFLAGS=-pipe hello,你会得到cc -pipe -o hello src/hello.c。有什么区别?
如果您将 Makefile 更改为:
CFLAGS ?= -g -O2 $(CFLAGS)
hello: src/hello.c
cc $(CFLAGS) -o $@ $<
在这两种情况下你都会得到cc -pipe -o hello src/hello.c。
【问题讨论】:
-
也许更好的标题应该是“Makefile 变量何时从环境、命令行或 Makefile 本身获取它们的值?”。此外,
make的另一个流行标签是Makefile。
标签: environment-variables gnu-make