【发布时间】:2021-11-25 14:46:26
【问题描述】:
我有一个包含多个目标的 Makefile。其中之一就是自动生成 cpp 代码。第二个指定编译那些生成的cpp。
我已经配置了一个分布式编译集群,我只想指定一些作业用于编译 cpp 文件本身。生成部分的另一个不同数量的工作。
有可能吗?
这个想法是使用“make -j30”通过 distcc 将构建分发到几个可用的主机,但是专用于生成定义到 Makefile 中的代码的目标不能拆分为 30 个作业,因为这个目标只会在本地处理。并且本地主机没有 30 个核心来处理它们,所以机器冻结了。这就是我需要为生成阶段定义作业数量和为编译阶段定义另一数量的作业的原因。
【问题讨论】:
-
我猜你指的是 GNU make。您很可能已经安装了
gmake的完整文档,并且您可以直接从马口中阅读gmake的-j选项可以做什么或不能做什么。该文档中是否有您不清楚的部分?您是否已经阅读过文档,得出结论认为使用gmake的内置功能无法实现此类功能,或者您不知道该文档的存在? -
视情况而定,如果不查看 Makefile 的相关部分,很难给您正确的建议。如果您知道您的 Makefile 将仅使用一个活动的
make作业运行,您可以将生成的作业数编码到构建规则中。但是,如果有人使用-j选项调用您的 Makefile(并且makeitself 运行多个作业),这可能会变得很棘手。为什么你觉得首先需要使用不同的工作计数? -
为什么要拆分?编译目标可能取决于生成的源代码,而生成的源代码目标取决于它用于生成源代码的任何内容。只需描述所有依赖项并按照@SamVarshavchik 的建议使用
-j。我在我的“主要”Makefile 之一的顶部有MAKEFLAGS += -j$(shell nproc) -Orecurse,然后将$(MAKE) -C $@向下放入$(SUBDIRS)目标描述的子目录中。 -
我无法在此处显示用于机密协议的 Makefile 的内容。在不同目标之间拆分作业的原因是由于生成代码的阶段不能由 distcc 分发,但 cpp 代码的编译阶段可以。我阅读了文档,但我不知道如何清楚地做到这一点。也许我错过了什么。
-
您想使用
distcc分发构建是一个重要的细节,它会影响您将满足您的需求的答案类型。您应该编辑问题以描述您如何使用distcc或您想如何使用它。与此同时,我已经为你标记了它。