makeのときにCPU個数を自動で調べて-jオプションのジョブ数に指定する簡単な方法

makeコマンドで並列に処理するには、-jオプションでジョブ数を指定します。

$ make -j4 

ジョブの個数にはビルドするホストのCPUの個数を指定したいので、スクリプトの中で定数で書いてしまうのはかっこ悪いです。(特に他の人に渡すようなビルドスクリプトでは。)並列に処理するジョブの個数はビルドの時間にダイレクトに効いてくるので適切な個数をセットしたいものです。

昨日の記事でperfをビルドするときには、makeのジョブ数が自動でCPUの個数にセットされていました。これはどうやっているのか調べました。

linux/tools/perf/Makefile

#
# Do a parallel build with multiple jobs, based on the number of CPUs online
# in this system: 'make -j8' on a 8-CPU system, etc.
#
# (To override it, run 'make JOBS=1' and similar.)
#
ifeq ($(JOBS),)
  JOBS := $(shell grep -c ^processor /proc/cpuinfo 2>/dev/null)
  ifeq ($(JOBS),)
    JOBS := 1
  endif
endif

/proc/cpuinfo の中の先頭がprocessorで始まる行の数を数えていました。
マッチした行数を数えるにはwcコマンドを使うまでもなく、grep -c でできるとは知りませんでした。
これでJOBSにCPUの個数が入っているので、それを使用して子プロセスでmakeコマンドを起動しています。

$(MAKE) -f Makefile.perf --no-print-directory -j$(JOBS) O=$(FULL_O) $(SET_DEBUG) $@