Makefile 在使用并行执行时,如何使用特定于目标的变量值并调用其他规则?

Makefile 在使用并行执行时,如何使用特定于目标的变量值并调用其他规则?,makefile,parallel-processing,gnu-make,Makefile,Parallel Processing,Gnu Make,我有一个包含以下行的makefile: debug: CFLAGS += $(DEBUGFLAGS) debug: clean all 我要做的是使用特定于目标的变量值运行“clean”和“all”。这很好,正如预期的那样 但是如果我以并行执行的方式运行它,“clean”可能会破坏“all”创建的文件 所以,如果我做了如下的事情: debug: CFLAGS += $(DEBUGFLAGS) debug: $(MAKE) clean $(MAKE) all 这将确保遵守规则的

我有一个包含以下行的makefile:

debug: CFLAGS += $(DEBUGFLAGS)
debug: clean all
我要做的是使用特定于目标的变量值运行“clean”和“all”。这很好,正如预期的那样

但是如果我以并行执行的方式运行它,“clean”可能会破坏“all”创建的文件

所以,如果我做了如下的事情:

debug: CFLAGS += $(DEBUGFLAGS)
debug:
    $(MAKE) clean
    $(MAKE) all
这将确保遵守规则的顺序。但是特定于目标的变量不会被纳入make的新调用中


所以我想知道如何使用目标特定变量和并行执行。

为什么不同时传递这些值呢

debug: CFLAGS += $(DEBUGFLAGS)
debug:
        $(MAKE) clean CFLAGS='$(CFLAGS)'
        $(MAKE) all CFLAGS='$(CFLAGS)'

不确定是哪个版本的make引入了它(3.8?4.0?),但如果将“clean”添加到伪目标.NOTPARALLEL,则clean不会并行运行,其他目标也会并行运行。我使用make-j clean all,这似乎像预期的那样工作

e、 g

。。。。。。
全部:$(目标)
清洁:;rm-rf$(目标)。。。
......
.骗子:都是干净的
.不平行:干净

嗨!这很有效。我不知道你能做到。为了澄清,当我这样做时,变量CFLAGS是否未被make的新调用编辑?同时,并行执行标志是否包含在“$(make)all…”调用中,如果不是,您将如何添加它(仅在并行调用时)?它未被编辑。命令行变量设置覆盖makefile中的任何设置。请参见,只要您在配方中使用
$(MAKE)
(或
${MAKE}
)变量,而不是调用原始
MAKE
命令,父MAKE的所有相关标志和其他命令行设置都将传递到其子MAKE。看见
...<variables defined here>...

all: $(TARGETS)
clean:; rm -rf $(TARGETS) ...

...<rules defined here>...

.PHONY: all clean
.NOTPARALLEL: clean