gpt4 book ai didi

makefile - 递归调用中的并行构建作业数

转载 作者:行者123 更新时间:2023-12-05 01:00:48 40 4
gpt4 key购买 nike

我有一个 makefile,它在单个递归调用中包装了真实的构建,以便在构建周围获取和释放许可证,无论构建是否成功。例子:

.PHONY main_target
main_target:
@license_grab &
@sleep 2
-@$(MAKE) real_target
@license_release

这很好用,直到我想并行运行 make。在某些系统上它工作正常,但在其他系统上,当 passing options to a sub-make 时,我遇到了 -j 标志的记录问题。 :

If your operating system doesn’t support the above communication, then ‘-j 1’ is always put into MAKEFLAGS instead of the value you specified. This is because if the ‘-j’ option were passed down to sub-makes, you would get many more jobs running in parallel than you asked for.



由于我只有一个递归调用,我真的很想将 -j 标志原封不动地传递给子制作。我不想将 -j 标志(带有数字)硬编码到 makefile 中,因为 makefile 在多台机器上运行,具有不同数量的处理器。我不想无限制地使用 -j,因为它会立即启动一堆进程,而不是等待作业完成。我在构建时尝试使用 -l 标志,但我发现该限制不会立即生效,可能是因为 limits don't apply until make can start sampling .

有没有办法强制子制作使用多个作业?或者,一种使 -l 标志真正完成某些事情的方法?

我想我可以使用 makefile 修改来做到这一点,比如使用 -@$(MAKE) $(JOBS) real_target ,并调用 make 像 make JOBS="-j4" main_target .

但是,我更喜欢只使用标准的 make 参数,而不是添加对变量的额外依赖。我还希望尽可能少地修改 makefile。

最佳答案

在不支持作业服务器功能的系统上,无法更改此行为。有点像你的 JOBS变量是我能想到的唯一方法。

我要指出几点:首先,我假设当您说其他系统时,您指的是 Windows 系统:这是我所知道的唯一不支持 jobserver 的常用平台。如果是这样,请注意从 GNU make 4.0 版开始,在 Windows 上实现了作业服务器支持。所以另一个选择是升级到更新版本的 GNU make。

二、-l的问题选项至少在 GNU make 3.81 版中得到了部分解决,其中引入了一种额外的算法,以根据 make 调用的作业数量人为地调整平均负载。在此之后的 make 版本中,您不应再看到此问题。

关于makefile - 递归调用中的并行构建作业数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994627/

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