make
可以将变量赋值作为其命令行的一部分。 DEBUG=1 make
与make DEBUG=1
相同吗?使用这个简单的Makefile,都打印echo 1
。
$ cat Makefile
all:
echo ${DEBUG}
在后一种情况下很明显,DEBUG=1
是make
的参数的一部分,但第一个似乎只是shell中的变量赋值。所以我假设make
获得的价值不同。关于差异的一些澄清将有所帮助。
答案 0 :(得分:3)
DEBUG=1 make
与make DEBUG=1
相同吗?
不是。
DEBUG=1 make
中:make
从环境获取变量。也就是说,shell设置变量DEBUG
,然后执行make
并且它(运行make
的进程)继承该环境变量。make DEBUG=1
中:make
从命令行获取变量(即:make
设置变量本身。)从命令行获取的变量覆盖从环境中获取的变量。也就是说,在:
DEBUG=0 make DEBUG=1
DEBUG
为1
,而不是0
。
另请注意,从命令行获取的变量覆盖在makefile中设置的变量(除非使用override
指令),而环境变量不包括(除非选项-e
or --environment-override
将传递给make
)。
因此,如果makefile设置了一个名为DEBUG
的变量,如下所示:
DEBUG = 0
all:
@echo ${DEBUG}
然后:
make DEBUG=1
回应1
,而:
DEBUG=1 make
回应0
。
origin
内置函数您可以使用origin
内置函数找出变量的来源。考虑一下makefile的这个修改:
$ cat Makefile
all:
@echo DEBUG is from $(origin DEBUG)
然后:
$ make DEBUG=1
DEBUG is from command line
但:
$ DEBUG=1 make
DEBUG is from environment