我怎么能告诉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/

10-10 12:26