make可以将变量赋值作为命令行的一部分。是DEBUG=1 make一样的make DEBUG=1吗?使用这个简单的 Makefile,两者都打印echo 1.
$ cat Makefile
all:
echo ${DEBUG}
Run Code Online (Sandbox Code Playgroud)
很明显,在后一种情况下,DEBUG=1是 的参数的一部分make,但第一个似乎只是 shell 中的变量赋值。所以我假设make以不同的方式获得价值。对差异进行一些澄清会有所帮助。
是
DEBUG=1 make一样的make DEBUG=1吗?
并不真地。
DEBUG=1 make:make从环境中获取变量。也就是说,shell 设置变量DEBUG,然后make执行它(正在运行的进程make)继承该环境变量。make DEBUG=1:从命令行make获取变量(即:设置变量本身)。make从命令行获取的变量会覆盖从环境中获取的变量。也就是说,在:
DEBUG=0 make DEBUG=1
Run Code Online (Sandbox Code Playgroud)
DEBUG是1,不是0。
还要注意,从命令行获得的变量会覆盖makefile 中设置的变量(除非使用该override指令),而环境变量不会(除非选项-e或被--environment-override传递给make)。
因此,如果 makefile 设置了一个DEBUG如下命名的变量:
DEBUG = 0
all:
@echo ${DEBUG}
Run Code Online (Sandbox Code Playgroud)
然后:
make DEBUG=1
Run Code Online (Sandbox Code Playgroud)
echoes 1,而:
DEBUG=1 make
Run Code Online (Sandbox Code Playgroud)
回声0。
origin内置功能您可以使用origin内置函数找出变量的来源。考虑对您的 makefile 进行以下修改:
$ cat Makefile
all:
@echo DEBUG is from $(origin DEBUG)
Run Code Online (Sandbox Code Playgroud)
然后:
$ make DEBUG=1
DEBUG is from command line
Run Code Online (Sandbox Code Playgroud)
但:
$ DEBUG=1 make
DEBUG is from environment
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |