在将GNU make用于存档文件的并行构建时,如何避免并发问题?

时间:2012-01-11 18:52:53

标签: gnu-make

我正在使用GNU make构建一组静态库,使用隐式make规则来执行此操作。这些规则运行ar(1)命令来更新库/存档。分析表明,如果我在构建期间使用-j选项来运行并行作业,则构建时间会减少。

不幸的是,GNU make手册有一节 http://www.gnu.org/software/make/manual/html_node/Archive-Pitfalls.html几乎说make不提供运行ar(1)的并发保护,因此它可以(并且确实)破坏存档。该手册进一步说明将来可能会修复此问题。

对此的一个解决方案是使用http://code.google.com/p/ipcmd,它基本上在运行命令之前执行信号量锁定,从而序列化构建存档的ar(1)命令。这个特殊的解决方案对我不利,因为我在Windows上使用基于mingw的交叉编译工具。

这个问题是否有更简单或更好的解决方案?

2 个答案:

答案 0 :(得分:3)

尝试以下方法 -

AR := flock make.lock $(AR)

clean::
    rm -f make.lock

现在ar(1)将使用对文件make.lock的独占锁执行,从而序列化对库的访问。

您可以在ranlib命令之后添加命令以删除文件make.lock。

如果需要,添加export AR以将定义传播到子品牌。

答案 1 :(得分:2)

将归档作为一个步骤进行,而不是尝试逐步更新归档:

libfoo.a: $(OBJS)
        -rm -f $@
        $(AR) rc $@ $^
        $(RANLIB) $@