首页 > 解决方案 > 为什么在配方中使用 $(MAKE) 制作“--dry-run”会导致错误?

问题描述

当我继续make --dry-run奔跑

all:
    false  # $(MAKE)

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

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

标签: makefilegnu-make

解决方案


https://www.gnu.org/software/make/manual/make.html#Instead-of-Execution

-n和选项不影响以字符开头-t或包含字符串或.-q+$(MAKE)${MAKE}

(--dry-run是 的别名-n。)

https://www.gnu.org/software/make/manual/make.html#MAKE-Variable

subsystem:
        cd subdir && $(MAKE)

[...]

作为一项特殊功能,MAKE在规则的配方中使用变量会改变-t( --touch)、-n( --just-print) 或-q( --question) 选项的效果。使用变量与在配方行开头MAKE使用字符具有相同的效果。+

[...]

考虑make -t上面示例中的命令。(该-t选项将目标标记为最新而不实际运行任何配方;请参阅代替执行。)按照通常的定义-t,示例中的make -t命令将创建一个名为子系统的文件,并且不执行任何其他操作。你真正想要它做的是运行cd subdir && make -t;但这需要执行配方,并-t说不执行配方。

这个特殊的功能使它做你想做的事:只要规则的配方行包含变量MAKE,标志-t-n并且-q不适用于该行。MAKE尽管存在导致大多数配方不运行的标志,但包含的配方行仍会正常执行。

您的配方包含$(MAKE),因此尽管--dry-run. false返回退出状态 1,这被视为错误make


推荐阅读