gpt4 book ai didi

makefile - 如何强制GNU Make不并行构建配方?

转载 作者:行者123 更新时间:2023-12-04 00:01:43 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com