gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:25:09 29 4
gpt4 key购买 nike

我试图在我们的构建服务器上进行并行 make 工作。我在这里遇到一个非常常见的问题,即 make 的两个实例试图创建两个不同的目标,比如 A 和 B,几乎同时尝试创建一个两者都需要的目标,比如 C。
由于两个实例都试图在不同的实例中一起创建 C,因此 C make 对它们中的任何一个都失败了,因为一次创建 C 需要一些文件在这里和那里移动,而这些实例中的任何一个最终都会移动或删除已创建的文件。
如果目标已经被制作,我是否可以使用通用构造来防止重新进入生成文件?
更新:
好吧,让我这样说:
我的申请要求 A.lo 和 B.lo 存在。这些 A.lo 和 B.lo 是也链接到 C.lo 的库。
所以规则看起来像
app.d : A.lo B.lo (其他 lo s)
(做链接)
在其他一些目录中说 A (它将容纳 A.lo):
A.lo : C.lo(其他 .o s 和 .lo s)
(做链接)
在其他一些目录中说 B (它将容纳 B.lo):
B.lo : C.lo(其他 .o s 和 .lo s)
(做链接)
所以实际上,在制作 app.d 时,为目标 A.lo 和 B.lo 制作了两个平行的制作 fork 。
在进入目录 A 和 B 时,独立地为 objective-c .lo 生成另外两个线程,有时这两个线程同时链接 C.lo,这会导致其中一个失败,并出现一些奇怪的错误,例如无法识别文件(因为它可能被其他链接器实例写入)
我应该如何解决这个问题?如果没有 C.lo 链接,就不可能创建 A.lo 和 B.lo。

最佳答案

这可能听起来有点,好吧,显而易见,但最简单的解决方案就是安排 CA 之前明确构建或 B .这样,当递归产生 A 时和 B运行,C将已经是最新的,也不会费心去尝试构建它。

如果您的顶级 makefile 如下所示:

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

您没有提供有关您的特定构建的很多细节,所以这可能不会只是插入和工作,但希望您能理解。

关于makefile - 防止两个 make 实例执行同一个目标(并行 make),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5309442/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com