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

qwe*_*iop 5 makefile gnu-make

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以不同的方式获得价值。对差异进行一些澄清会有所帮助。

眠りネ*_*ネロク 6

DEBUG=1 make一样的make DEBUG=1吗?

并不真地。

  • In DEBUG=1 makemake环境中获取变量。也就是说,shell 设置变量DEBUG,然后make执行它(正在运行的进程make)继承该环境变量。
  • make DEBUG=1从命令行make获取变量(即:设置变量本身)。make

相关差异

从命令行获取的变量会覆盖从环境中获取的变量。也就是说,在:

DEBUG=0 make DEBUG=1
Run Code Online (Sandbox Code Playgroud)

DEBUG1,不是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)