makefile - 如何编写Makefile以使用GNU Make自动检测并并行化构建?

标签 makefile parallel-processing

不知道单独在一个Makefile中是否可以实现,但是我希望以一种方式编写Makefile,以便尝试在文件中构建任何目标会自动神奇地检测当前系统上的处理器数量并并行构建目标处理器数量。

类似于下面的“伪代码”示例,但是更干净吗?

all:
    @make -j$(NUM_PROCESSORS) all

要么:
all: .inparallel
    ... build all here ...

.inparallel:
    @make -j$(NUM_PROCESSORS) $(ORIGINAL_TARGET)

在这两种情况下,您只需输入:
% make all

希望这是有道理的。

更新:仍然希望上面的示例Makefile。对查找进程数并不真正感兴趣,但对如何编写不带-j命令行选项的并行构建makefile感兴趣。

最佳答案

检测部分将取决于操作系统。这是一个可以在Linux和Mac OS X上运行的片段:

NPROCS:=1
OS:=$(shell uname -s)

ifeq($(OS),Linux)
  NPROCS:=$(shell grep -c ^processor /proc/cpuinfo)
endif
ifeq($(OS),Darwin) # Assume Mac OS X
  NPROCS:=$(shell system_profiler | awk '/Number Of CPUs/{print $4}{next;}')
endif

要使其正常工作,您可能必须重新调用make。然后,您的问题是防止无限递归。您可以通过拥有两个makefile(第一个仅重置-j值)来解决这一问题,但是可能可以精打细算。

关于makefile - 如何编写Makefile以使用GNU Make自动检测并并行化构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527496/

相关文章:

r - 在 R : Segmentation fault (core dumped) warning 的 foreach 循环中调用可执行文件

并行处理多个文件的 bash 脚本

python - multiprocessing.Pool.map_async() 的结果是否以与输入相同的顺序返回?

c# - 异步任务 'Clogging'

c++ - 在 CLion 中导入非 cmake GitHub 项目

colors - 如何使一个屏幕上的颜色看起来与另一个屏幕上的颜色相同

c - 奇数 "undefined reference"错误

c - 我的 makefile 试图编译一个目录

makefile - Fortran 生成文件

latex - 推荐的 latex 构建系统?