为什么在配方中用$(MAKE)进行'--dry-run'会导致错误?

时间:2018-12-10 08:03:20

标签: makefile gnu-make

当我在运行make --dry-run

all:
    false  # $(MAKE)

使用GNU Make 4.2.1,我得到以下错误。为什么?

false  # make all
make: *** [Makefile:2: all] Error 1

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时,标志-tMAKE-t都不会适用于该行。尽管存在导致大多数配方无法运行的标志,但包含-n的配方行仍能正常执行。

您的配方包含-q,因此尽管有MAKE,该配方仍被执行。 $(MAKE)返回退出状态1,--dry-run将其视为错误。