不知道单独在一个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/