变量赋值之前与之后的赋值 make 命令



make可以将变量赋值作为命令行的一部分。DEBUG=1 makemake DEBUG=1一样吗?使用这个简单的生成文件,打印echo 1

$ cat Makefile
all:
echo ${DEBUG}

在后一种情况下很明显,DEBUG=1make参数的一部分,但第一个似乎只是 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

DEBUG1,而不是0

还要注意的是,从命令行获取的变量会覆盖makefile 中设置的变量(除非使用override指令),而环境变量不会(除非将选项-e--environment-override传递给make)。

因此,如果生成文件设置名为DEBUG的变量,如下所示:

DEBUG = 0
all:
@echo ${DEBUG}

然后:

make DEBUG=1

回显1,而

DEBUG=1 make

回声0.


内置函数origin

您可以使用origin内置函数找出变量的来源。请考虑对生成文件的以下修改:

$ cat Makefile
all:
@echo DEBUG is from $(origin DEBUG)

然后:

$ make DEBUG=1
DEBUG is from command line

但:

$ DEBUG=1 make
DEBUG is from environment

最新更新