_smp_mflags
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。