Makefile 防止两个make实例执行同一目标(并行make)
我试图在我们的构建服务器上实现并行。我在这里遇到了一个非常常见的问题,make的两个实例试图创建两个不同的目标,比如a和B,几乎同时尝试创建一个两者都需要的目标,比如C 由于两个实例都试图在不同的实例中同时生成C,C make对它们中的任何一个都失败,因为生成C时需要将一些文件四处移动,而这些实例中的任何一个都会移动或删除已创建的文件 如果已经创建了目标,是否可以使用公共构造来防止重新进入makefile 更新: 好吧,让我这样说: 我的申请需要A.lo和B.lo在场。这些A.lo和B.lo都是与C.lo链接的库。 所以规则看起来像 附录d:A.lo B.lo(其他lo) (做链接) 在其他一些目录中,比如A(其中将包含A.lo): A.lo:C.lo(其他o和o.s) (做链接) 在其他一些目录中,比如B(它将容纳B.lo): B.lo:C.lo(其他o和o.s) (做链接) 因此,实际上,在制作应用程序d时,为目标A.lo和B.lo制作两个平行的make。 在输入目录A和B时,分别为目标C.lo分叉另外两个线程,有时这两个线程同时链接C.lo,这会导致其中一个线程失败,并出现一些奇怪的错误,例如无法识别文件(因为它可能被其他链接器实例写入)Makefile 防止两个make实例执行同一目标(并行make),makefile,Makefile,我试图在我们的构建服务器上实现并行。我在这里遇到了一个非常常见的问题,make的两个实例试图创建两个不同的目标,比如a和B,几乎同时尝试创建一个两者都需要的目标,比如C 由于两个实例都试图在不同的实例中同时生成C,C make对它们中的任何一个都失败,因为生成C时需要将一些文件四处移动,而这些实例中的任何一个都会移动或删除已创建的文件 如果已经创建了目标,是否可以使用公共构造来防止重新进入makefile 更新: 好吧,让我这样说: 我的申请需要A.lo和B.lo在场。这些A.lo和B.lo都是
我该如何着手解决这个问题?如果没有与A.lo和B.lo相对应的C.lo链接,则不可能创建A.lo和B.lo。这听起来可能有点明显,但最简单的解决方案只是安排在
A
或B
之前显式构建C
。这样,当递归使A
和B
运行时,C
将已经是最新的,并且两者都不会尝试构建它
如果顶级生成文件如下所示:
all: buildA buildB
buildA:
$(MAKE) -C A
buildB:
$(MAKE) -C B
all: buildA buildB
buildA: buildC
$(MAKE) -C A
buildB: buildC
$(MAKE) -C B
buildC:
$(MAKE) -C C
您可以这样扩展它:
all: buildA buildB
buildA:
$(MAKE) -C A
buildB:
$(MAKE) -C B
all: buildA buildB
buildA: buildC
$(MAKE) -C A
buildB: buildC
$(MAKE) -C B
buildC:
$(MAKE) -C C
您没有提供关于具体构建的很多详细信息,因此,这可能不只是顺道访问并发挥作用,而是希望您能了解这个想法。我使用“mkdir”技术解决这个问题:
SHELL = /bin/bash
all: targetC targetD
targetC: targetA
............
targetD: targetB
............
targetA targetB: source
-mkdir source.lock && ( $(command) < source ; rm -r source.lock )
$(SHELL) -c "while [ -d source.lock ] ; do sleep 0.1 ; done"
SHELL=/bin/bash
全部:target
塔吉塔
............
targetD:targetB
............
targetA targetB:来源
-mkdir source.lock&($(命令)
不过,我很乐意看到更优雅的解决方案。看看@