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)