Makefile 防止两个make实例执行同一目标(并行make)

Makefile 防止两个make实例执行同一目标(并行make),makefile,Makefile,我试图在我们的构建服务器上实现并行。我在这里遇到了一个非常常见的问题,make的两个实例试图创建两个不同的目标,比如a和B,几乎同时尝试创建一个两者都需要的目标,比如C 由于两个实例都试图在不同的实例中同时生成C,C make对它们中的任何一个都失败,因为生成C时需要将一些文件四处移动,而这些实例中的任何一个都会移动或删除已创建的文件 如果已经创建了目标,是否可以使用公共构造来防止重新进入makefile 更新: 好吧,让我这样说: 我的申请需要A.lo和B.lo在场。这些A.lo和B.lo都是

我试图在我们的构建服务器上实现并行。我在这里遇到了一个非常常见的问题,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,这会导致其中一个线程失败,并出现一些奇怪的错误,例如无法识别文件(因为它可能被其他链接器实例写入)


我该如何着手解决这个问题?如果没有与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&($(命令)
不过,我很乐意看到更优雅的解决方案。

看看@