Makefile 在使用并行执行时,如何使用特定于目标的变量值并调用其他规则?
我有一个包含以下行的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 这将确保遵守规则的
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