gpt4 book ai didi

parallel-processing - 来自一个配方和并行执行的多个目标

转载 作者:行者123 更新时间:2023-12-04 01:23:01 24 4
gpt4 key购买 nike

我有一个项目,其中包含一个代码生成器,它从一个输入文件生成多个 .c 和 .h 文件,只需调用一次代码生成器。我有一个规则,将 .c 和 .h 文件作为多个目标,输入文件作为先决条件,配方是代码生成器的调用。然后我有进一步的规则来编译和链接生成的 .c 文件。

这在 -j 因子为 1 时可以正常工作,但是如果我增加 j 因子,我发现我会多次调用代码生成器,直到 -j 因子或预期目标文件的数量,以最小者为准。这很糟糕,因为代码生成器的多次调用可能会由于生成的代码被多次编写而导致失败。

我不打算在这里发布我的实际(大)代码,但我已经能够构建一个小示例,它似乎演示了相同的行为。

Makefile 看起来像这样:

output.concat: output5 output4 output3 output2 output1
猫 $^ > $@

输出1 输出2 输出3 输出4 输出5:输入
./frob 输入

干净的:
rm -rf 输出*

对于这个例子,我没有编写代码生成器,而是编写了一个简单的 shell 脚本,frob它从一个输入文件生成多个输出文件:

#!/bin/bash

对于 {1..5} 中的 i;做
{
echo "这是输出${i},从${1}生成。输入是:"
猫 ${1}
} > 输出${i}
完毕

当我使用非 unity -j 因子运行这个 Makefile 时,我得到以下输出:

$ make -j2
./frob 输入
./frob 输入
cat output5 output4 output3 output2 output1 > output.concat
$

我们看到./frob这里被调用了两次,这很糟糕。有什么方法可以构建这个规则,即使使用非统一 -j 因子,配方也只会被调用一次?

我已经考虑过更改规则,以便只有一个预期的输出文件是目标,然后添加另一个没有配方的规则,使其目标是剩余的预期输出文件,而先决条件是第一个预期的输出文件。但我不确定这是否可行,因为我不知道我是否可以保证生成文件的顺序,因此最终可能会出现循环依赖。

最佳答案

这就是 make 被定义为工作的方式。像这样的规则:

foo bar baz : boz ; $(BUILDIT)

与编写以下三个规则完全等效:
foo : boz ; $(BUILDIT)
bar : boz ; $(BUILDIT)
baz : boz ; $(BUILDIT)

没有办法(在 GNU make 中)定义具有您想要的特征的显式规则;也就是说,对配方的一次调用将构建所有三个目标。

然而,如果你的输出文件和你的输入文件共享一个共同的基础,你可以写一个这样的模式规则:
%.foo %.bar %.baz : %.boz ; $(BUILDIT)

奇怪的是,对于具有多个目标的隐式规则,GNU make 假定对配方的单次调用将构建所有目标,并且它将完全按照您的意愿运行。

关于parallel-processing - 来自一个配方和并行执行的多个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822435/

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