如何正确使用make并行构建?

时间:2013-07-12 13:51:05

标签: build parallel-processing makefile build-automation

我遇到make中的并行构建问题,即有这个定义

 rmlink:
         $(RM) $(ALIB)
         $(RM) $(BLIB)
         $(RM) $(CLIB)
         $(RM) $(DLIB)
         $(RM) $(ELIB)

 mklink:
         ln -sf $(ALIB_WITHPATH) $(ALIB)
         ln -sf $(BLIB_WITH_PATH) $(BLIB)
         ln -sf $(CLIB_WITH_PATH) $(CLIB)
         ln -sf $(DLIB_WITH_PATH) $(DLIB)
         ln -sf $(E_LIB) $(ELIB)

并使用make启动构建我将构建这些目标

$ make
/bin/rm -f libA.so
/bin/rm -f libB.so
/bin/rm -f libC.so
/bin/rm -f libD.so
/bin/rm -f libE.so
ln -sf ../libA.so libA.so
ln -sf ../libB.so libB.so
ln -sf ../libC.so libC.so
ln -sf ../libD.so libD.so
ln -sf ../libE.so libE.so

但是使用make -j 2(或更多)的并行构建启动它,我会得到:

$ make -j 2
/bin/rm -f libA.so
ln -sf ../libB.so libB.so
/bin/rm -f libB.so
/bin/rm -f libC.so
/bin/rm -f libD.so
ln -sf ../libD.so libD.so
/bin/rm -f libE.so
ln -sf ../libA.so libA.so
ln -sf ../libC.so libC.so
ln -sf ../libE.so libE.so
g++: libB.so: No such file or directory

在这种特殊情况下会删除我libB.so的链接,而不会再次创建它 - 打破生效。

如何修复此问题才能启动并行构建?

修改

mklink目标添加类似内容似乎可以解决问题:

mklink: rmlink

请评论这是否正确。

1 个答案:

答案 0 :(得分:3)

在考虑并行构建时,make决定由先决条件列表构建 的顺序。如果目标FOO未被定义为目标BAR的先决条件,那么make将可以同时构建FOO和BAR。

请记住,将两个目标列为同一目标的先决条件,如TARGET : FOO BAR,这意味着必须在TARGET之前构建FOO和BAR。它 NOT 意味着FOO和BAR与每个其他有任何关系。所以如果你有:

foo: rmlink mklink

然后make可以同时运行rmlink和mklink。如果你想在mklink启动之前总是完成rmlink,你必须在它们之间声明一个必要的关系,如:

mklink: rmlink

当然,请记住,您必须确保mklink目标是任何需要存在这些链接的链接器目标的先决条件。

这里可能会有更多错误,但考虑到你所展示的makefile的部分内容以及你提出的问题,应该修复它。

相关问题