Makefile 为什么要做'--干运行';在配方中使用$(MAKE)会导致错误吗?

Makefile 为什么要做'--干运行';在配方中使用$(MAKE)会导致错误吗?,makefile,gnu-make,Makefile,Gnu Make,当我运行make--dry runon时 all: false # $(MAKE) 使用GNU Make 4.2.1,我返回以下错误。为什么? false # make all make: *** [Makefile:2: all] Error 1 : -n、-t和-q选项不会影响以+字符开头或包含字符串$(MAKE)或${MAKE}的配方行 (--dry run是-n的别名) : [……] 作为一项特殊功能,在规则配方中使用变量MAKE,可以改变-t(--touch)、-n(-

当我运行
make--dry run
on时

all:
    false  # $(MAKE)
使用GNU Make 4.2.1,我返回以下错误。为什么?

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

-n
-t
-q
选项不会影响以
+
字符开头或包含字符串
$(MAKE)
${MAKE}
的配方行

--dry run
-n
的别名)

:

[……]

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

[……]

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

该特殊功能使它可以实现您想要的功能:每当规则的配方行包含变量
MAKE
,则标志
-t
-n
-q
不适用于该行。包含
MAKE
的配方行正常执行,尽管存在导致大多数配方无法运行的标志

您的配方包含
$(MAKE)
,因此尽管
--干运行
,它还是会被执行
false
返回退出状态1,这被
make
视为错误:

-n
-t
-q
选项不会影响以
+
字符开头或包含字符串
$(MAKE)
${MAKE}
的配方行

--dry run
-n
的别名)

:

[……]

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

[……]

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

该特殊功能使它可以实现您想要的功能:每当规则的配方行包含变量
MAKE
,则标志
-t
-n
-q
不适用于该行。包含
MAKE
的配方行正常执行,尽管存在导致大多数配方无法运行的标志


您的配方包含
$(MAKE)
,因此尽管
--干运行
,它还是会被执行
false
返回退出状态1,这被
make
视为错误+1为什么这是一个特性而不是一个bug?(用例是什么?)这是一个至关重要的特性。如果您有一个递归的makefile结构,那么在顶层运行
make-n
实际上是无用的,除非它也递归地调用子make.Wow+1为什么这是一个特性而不是一个bug?(用例是什么?)这是一个至关重要的特性。如果您有一个递归makefile结构,那么在顶层运行
make-n
实际上是无用的,除非它也递归地调用子make。
subsystem:
        cd subdir && $(MAKE)