Makefile $(MAKEFLAGS)行为与简单扩展变量

Makefile $(MAKEFLAGS)行为与简单扩展变量,makefile,gnu-make,Makefile,Gnu Make,我无法理解$(MAKEFLAGS)变量的行为。为了解释我想说的话,我编写了一个非常简单的makefile: $(info *** $(MAKEFLAGS)) STRING := $(MAKEFLAGS) all: echo MAKEFLAGS=$(MAKEFLAGS) echo STRING=$(STRING) 在命令行中使用一些变量运行make: $ make DEBUG=1 INST=/tmp *** echo MAKEFLAGS= -- INST=/tmp DEBUG=

我无法理解
$(MAKEFLAGS)
变量的行为。为了解释我想说的话,我编写了一个非常简单的makefile:

$(info *** $(MAKEFLAGS))
STRING := $(MAKEFLAGS)
all:
    echo MAKEFLAGS=$(MAKEFLAGS)
    echo STRING=$(STRING)
在命令行中使用一些变量运行make:

$ make DEBUG=1 INST=/tmp
*** 
echo MAKEFLAGS= -- INST=/tmp DEBUG=1
MAKEFLAGS= -- INST=/tmp DEBUG=1
echo STRING=
STRING=
我想知道如何将
$(MAKEFLAGS)
分配给一个简单扩展的变量(使用
:=
),以及为什么我无法使用
$(info…

我想知道如何将$(MAKEFLAGS)分配给一个简单扩展的变量(使用:=)

为什么不呢?粗略地说,“简单赋值”意味着右边的值将在适当的位置展开,直到找不到更多的
$
。因此,您可以为“简单”变量分配几乎任何内容

为什么我不能用$(info…)看到它的值

你确实看到了,它是空的。至少,在预处理makefile的“body”时它是空的(这也是为什么
STRING
总是空的原因-它是第2行的
MAKEFLAGS
的值),尽管在扩展配方时它不是空的。这毕竟是一个特殊的变量

我想知道如何将$(MAKEFLAGS)分配给一个简单扩展的变量(使用:=)

为什么不呢?粗略地说,“简单赋值”意味着右边的值将在适当的位置展开,直到找不到更多的
$
。因此,您可以为“简单”变量分配几乎任何内容

为什么我不能用$(info…)看到它的值


你确实看到了,它是空的。至少,在预处理makefile的“body”时它是空的(这也是为什么
STRING
总是空的原因-它是第2行的
MAKEFLAGS
的值),尽管在扩展配方时它不是空的。好吧,它毕竟是一个特殊变量。

如果您不确定
$(info)
的输出,请在变量内容周围放置一些分隔符,例如
$(info)
。通过这种方式,您可以判断变量中是否有空格、某物或什么都没有。如果您不确定
$(info)
的输出,请在变量内容周围放置一些分隔符,例如
$(info)
。通过这种方式,你可以判断变量中是否有空格、某物或什么都没有。说:它没有按预期工作,因为它是特殊的,没有帮助!一些关于为什么它只在配方中填充的原因的提示或指向某些文档的指针会很好。我找不到。@morty Make是一个非常古老的程序,推理“为什么”有点毫无意义。关于文档,请仔细阅读:make会自动设置此变量,以包含make received的标志字母。是的,但is没有说明这一点,甚至没有说明原因,它只在配方阶段填充。说:它没有按预期工作,因为它是特殊的,没有帮助!一些关于为什么它只在配方中填充的原因的提示或指向某些文档的指针会很好。我找不到。@morty Make是一个非常古老的程序,推理“为什么”有点毫无意义。关于文档,请仔细阅读:make自动设置此变量以包含make received的标志字母。是的,但is没有说明这一点,甚至没有说明原因,它仅在配方阶段填充。