Kernel Out Tree Building

前書き

kernelの新機能を調査するときなど
ちょっとだけconfig変えた複数のkernelを用意して
比較テストしたりするのだが・・・

この場合、kernel source は変えなくていいので
ビルド結果を置くディレクトリを指定して
ソースは複製せずに1ヶ所に置いておける。

Out Tree Building とか呼ぶ場合もあるそう。

で、linux-2.6.x使いなら当然の知識かと思ったら
ガンガン複製している後輩等がいた・・・ので別の後輩等の参考になるかもしれんのでメモしておく。

本題

tree command 風表記で例を書くと、以下のようなディレクトリ構成とする。

~/linux-research/
-- sys.src/
`-- linux-2.6.29/
-- targets/
-- beagle-preempt
`-- kernel/
-- beagle-nonpreempt
`-- kernel/
という感じの前提条件。 まず、1回目の操作。2回目以降と違うので注意。
$ cd ~/linux-research/targets/beagle-preempt/kernel
$ export ARCH=arm; export CROSS_COMPILE=arm-none-linux-gnueabi-
$ make -C ~/linux-research/sys.src/linux-2.6.29 O=`pwd` omap3_beagle_defconfig
この操作で"beagle-preempt/kernel/Makefile"が作成される。(手元で確認して欲しい) このMakefileにはカーネルソースのディレクトリが記録されるので、 以降は "-C O=" のオプションは要らない。 ではいつもの調整→ビルド
$ make menuconfig
$ make uImage
ちゃんとコンパイルできるハズ。 non-preemptiveも同様に。
$ cd ~/linux-research/targets/beagle-nonpreempt/kernel
$ make -C ~/linux-research/sys.src/linux-2.6.29 O=`pwd` omap3_beagle_defconfig
$ make menuconfig
$ make uImage
こんな感じで、kernel source を複製せずに作業していける。 生成物のうち、ターゲットで使用する"uImage"と、デバッグに使用する"vmlinux"以外は、 なくても構わないので動作確認後消してしまえばいい。 ディスク使用量が減るのでバックアップコストが下がって効果的。

補足事項:よくあるビルドエラー

もし過去に、"sys.src/linux-2.6.29" 直下でビルドしているとエラーとなる。 その場合、以下のようにして直下のオブジェクトを廃棄・cleanupしてやり直してほしい。
$ cd ~/linux-research/sys.src/linux-2.6.29
$ make distclean