当我在运行make --dry-run
时
all:
false # $(MAKE)
使用GNU Make 4.2.1,我得到以下错误。为什么?
false # make all
make: *** [Makefile:2: all] Error 1
答案 0 :(得分:3)
https://www.gnu.org/software/make/manual/make.html#Instead-of-Execution:
-n
,-t
和-q
选项不会影响以+
字符开头或包含字符串$(MAKE)
或{{1 }}。
({${MAKE}
是--dry-run
的别名。)
https://www.gnu.org/software/make/manual/make.html#MAKE-Variable:
-n
[...]
作为一项特殊功能,在规则的配方中使用变量
subsystem: cd subdir && $(MAKE)
会改变MAKE
(-t
),--touch
({{1} }),或-n
(--just-print
)选项。在食谱行的开头使用-q
变量与使用--question
字符具有相同的作用。[...]
在上面的示例中考虑命令
MAKE
。 (+
选项将目标标记为最新,而不实际运行任何配方;请参见Instead of Execution。)按照make -t
的常规定义,示例中的-t
命令将创建一个名为子系统的文件,什么也不做。您真正想要执行的操作是运行-t
;但这需要执行配方,make -t
说不要执行配方。此特殊功能使它可以执行您想要的操作:每当规则的配方行包含变量
cd subdir && make -t
时,标志-t
,MAKE
和-t
都不会适用于该行。尽管存在导致大多数配方无法运行的标志,但包含-n
的配方行仍能正常执行。
您的配方包含-q
,因此尽管有MAKE
,该配方仍被执行。 $(MAKE)
返回退出状态1,--dry-run
将其视为错误。