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

时间:2018-02-20 15:30:59

标签: makefile gnu-make

make可以将变量赋值作为其命令行的一部分。 DEBUG=1 makemake DEBUG=1相同吗?使用这个简单的Makefile,都打印echo 1

$ cat Makefile
all:
        echo ${DEBUG}

在后一种情况下很明显,DEBUG=1make的参数的一部分,但第一个似乎只是shell中的变量赋值。所以我假设make获得的价值不同。关于差异的一些澄清将有所帮助。

1 个答案:

答案 0 :(得分:3)

  

DEBUG=1 makemake 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 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