kernelのSRPMを展開して得られるSPECファイルを見るとビルドのところに、_smp_mflagsというのが出てくる。例えば、kernel.specだとこんな感じ。
BuildKernel() {
MakeTarget=$1
KernelImage=$2
Flavour=$3
InstallName=${4:-vmlinuz}
<snip>
make -s ARCH=$Arch oldnoconfig >/dev/null
make -s ARCH=$Arch V=1 %{?_smp_mflags} $MakeTarget %{?sparse_mflags}
make -s ARCH=$Arch V=1 %{?_smp_mflags} modules %{?sparse_mflags} || exit 1
<snip>
で、この_smp_mflagsなんだが-jX*1に展開されるのだけど、気が向いた時、ビルドの時間を短くするためにXをCPU数の2倍位にしたりすることがあったり。で、本当気が向いた時だけやってるので、SPECを手動で書き換えているのだけど、まあよく忘れるし、適当過ぎよねということで、さらっと調べてみたのでメモしておく*2。
まず、_smp_mflagsはrpmのマクロになります。で、rpmのマクロの定義は/usr/lib/rpm/にある。マクロを定義しているファイルはいろいろあるので、grepしてみた。
$ grep -r _smp_mflags /usr/lib/rpm/ /usr/lib/rpm/platform/pentium3-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/x86_64-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/athlon-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/noarch-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/i486-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/i686-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/pentium4-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/ia32e-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/geode-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/amd64-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/i386-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/platform/i586-linux/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ /usr/lib/rpm/redhat/macros:%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\
まあ、こんな感じでたくさん出てくるわけだが、その中の/usr/lib/rpm/redhat/macrosを見てみると次のようになってた。
%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\
&& RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"; \\\
if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then echo "-j16"; \\\
elif [ "$RPM_BUILD_NCPUS" -gt 1 ]; then echo "-j$RPM_BUILD_NCPUS"; fi)
RPM_BUILD_NCPUSが0だったらgetconf _NPROCESSORS_ONLNの結果を代入する。
sysconf(3)のmanを見たら、_SC_NPROCESSORS_ONLNは現在オンラインのCPU数を返すとのことなので、getconfでも同じと思われ、_smp_mflagsには現在オンラインのCPU数が入るはず。これで_smp_mflagsの定義が分かりましたとさ。
このマクロファイルをいじってあげれば、好きに設定できると。今度は忘れないようにしましょう。
(追記) マクロの中身を確認するのに、なにも/usr/lib/rpm/以下をgrepしなくてもよいみたい。rpmコマンドで調べられる模様。
$ rpm --eval %macro
macroの部分に知りたいマクロを入れればOK。