【发布时间】:2010-12-03 14:18:40
【问题描述】:
我如何告诉 gnu make 不要并行构建一些配方。假设我有以下生成文件:
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 命令会创建具有固定名称的临时文件(我无法更改)。如果我只使用不带-j 参数的make,这可以正常工作。但是,如果使用 -j 选项,构建有时会失败,因为 my-pre-processor 的两个并发调用会覆盖它们的临时文件。
我想知道是否有办法告诉 make 它不能构建 try 以并行化 %.cpp : %.xxx 配方的执行。
【问题讨论】:
-
对于这个特殊问题(临时文件被程序的多个副本覆盖)另一个解决方案可能是创建一个具有随机名称的临时目录(例如
mktemp -d)并运行该工具从里面。然后您可以并行运行该工具的多个副本,从而加快构建速度,并假设它将其文件写入当前目录,它们不会被覆盖。
标签: makefile parallel-processing gnu-make