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

Ben*_*Ben 5 makefile gnu-make

我有一个 makefile,它将真正的构建包装在单个递归调用中,以便获取并发布围绕构建的许可证,无论构建是否成功。例子:

\n\n
.PHONY main_target\nmain_target:\n    @license_grab &\n    @sleep 2\n    -@$(MAKE) real_target\n    @license_release\n
Run Code Online (Sandbox Code Playgroud)\n\n

这非常有效,直到我想并行运行 make 为止。在某些系统上它工作正常,但在其他系统上,当将选项传递给子 make时,我遇到了 -j 标志记录的问题:

\n\n
\n

如果您的操作系统不支持上述通信,则 \xe2\x80\x98-j 1\xe2\x80\x99 始终会放入 MAKEFLAGS 而不是您指定的值。这是因为,如果将 \xe2\x80\x98-j\xe2\x80\x99 选项传递给子品牌,则并行运行的作业将比您要求的多得多。

\n
\n\n

由于我只有一次递归调用,因此我真的很想将 -j 标志原封不动地传递给子 make。我不想将 -j 标志(带有数字)硬编码到 makefile 中,因为 makefile 在具有不同数量处理器的多台机器上运行。我不想无限制地使用 -j ,因为这会立即启动一堆进程,而不是等待作业完成。我在构建时尝试使用 -l 标志,但我发现限制不会立即应用,可能是因为限制在 make 可以开始采样之前才应用

\n\n

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

\n\n

我想我可以使用 makefile 修改来完成它-@$(MAKE) $(JOBS) real_target,例如 using 和调用 make like make JOBS="-j4" main_target

\n\n

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

\n

Ben*_*Ben 2

问题是,无论出于何种原因,我make不支持作业服务器,因此它不会-j$(MAKEFLAGS)变量中传递标志。由于无法将 make 升级到确实传递该标志的版本,因此解决方案是将该-j标志传递到其他地方。就像$(MAKE) 变量可以被滥用来传递 -f 标志一样,它可以以相同的方式使用来传递该-j标志:

make MAKE="make -j4" main_target
Run Code Online (Sandbox Code Playgroud)

这将使用一项作业启动 main_target 构建,但会在子 make 进程上使用 4 个作业调用 make。显然,如果您需要一个特殊的 make 工具($(MAKE) 的正常用途),那么您需要在 MAKE 字符串以及命令中指定它。