我怎么能告诉gnu make不要并行建立一些配方。假设我有以下makefile:
sources = a.xxx b.xxx c.xxx
target = program
all : $(target)
$(target) : $(patsubst %.xxx,%.o,$(sources))
$(CXX) -o $@ $<
%.o : %.cpp
$(CXX) -c -o $@ $<
%.cpp : %.xxx
my-pre-processor -o $@ $<
但是,
my-pre-processor
命令创建具有固定名称的临时文件(我无法更改此名称)。如果我只使用make而没有-j
参数,则此方法工作正常。但是,如果使用-j
选项,则构建有时会失败,因为两次同时调用my-pre-processor
会覆盖其临时文件。我想知道是否有一种方法可以使make一定不要尝试并行化
%.cpp : %.xxx
配方的执行。 最佳答案
这是一个可怕的冲突,但可以做到:
b.cpp: a.cpp
c.cpp: b.cpp
或者,如果实际上有很多,您可以喝一些烈性酒,然后执行以下操作:
c-sources = $(sources:.xxx=.cpp)
ALLBUTFIRST = $(filter-out $(firstword $(c-sources)), $(c-sources))
ALLBUTLAST = $(filter-out $(lastword $(c-sources)), $(c-sources))
PAIRS = $(join $(ALLBUTLAST),$(addprefix :,$(ALLBUTFIRST)))
$(foreach pair,$(PAIRS),$(eval $(pair)))
(这在GNUMake中有效,我不知道其他版本。)
关于makefile - 如何强制GNU Make不并行构建配方?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4346399/