2008年04月23日(水) [過去の今日]
#1 Debianのapt-crossでクロスコンパイル環境を作り、玄箱カーネルをビルドしてみる
おかしいなあ。sambaでいいからNASが欲しいと思ってただけなのに、なぜ手元に KURO-BOX/PRO があるのだろう……。
というわけでとりあえずDebian化は キットを配布してくれてる人がいる のでそちらへどうぞ、という感じで終了(何度かやりなおしてやっとできた)。
んでふとこないだ出たばかりのLinux 2.6.25を見てみると、Orion ImplementionsにCONFIG_MACH_KUROBOX_PROなんて設定項目が。ありまー。正式サポート入ったですか。ちょうどNFSも使いたかったし、いっちょコンパイルしてみることに。
ただ玄箱PROのCPUはとてつもなく遅いので、セルフコンパイルとかやってられません。あとせっかくDebianなんだから、make-kpkgしたいところ。
というわけでmake-kpkgでたしかクロスコンパイルできたよなーとぐぐってみると、apt-crossというパッケージがあることに気付いた。要するに別アーキテクチャのバイナリを作るためのヘッダやライブラリをaptで入れてしまおうという代物らしい。マニュアル見たりしてARMのクロスコンパイル環境をインストールしたのだが、記憶が薄らぎはじめている。いまのうちに書き留めておこう。
あ、sid環境前提ね。
# apt-cross -a arm -S unstable -m http://cdn.debian.or.jp/debian --install gcc-4.1-base cpp-4.1 libgcc1 gcc-4.1 libc6 gcc gcc-4.3 cpp cpp-4.3 gcc-4.3-base libgomp1 libc6-dev
gcc-4.1だけ欲しかったのだけど、なぜか4.3も入れないとうまく依存関係が解決しなかった。これでパッケージ名の後ろに-arm-corssと付いたクロス環境用パッケージが生成・インストールされ、/usr/arm-linux-gnuなどにライブラリ・ヘッダが展開される。
足りない依存関係はaptitude upgradeすると一覧できて見やすかった。
ただホントにヘッダとライブラリだけなので、gcc本体とbinutilsは別にコンパイルしないといけないみたい。
ringサーバからbinutils-2.18とgcc-core-4.1を拾って来て、
$ tar xjfv binutils-2.18.tar.bz2 $ cd binutils-2.18 $ ./configure --prefix=/usr/local --target=arm-linux-gnu $ make # make install
という感じにbinutilsインストール完了。
そしてgccへ。
$ tar xjfv gcc-core-4.1.1.tar.gz $ mkdir gcc_build $ cd gcc_build # ../gcc-4.1.1/configure --target=arm-linux-gnu \ --prefix=/usr/local \ --with-as=/usr/local/bin/arm-linux-gnu-as \ --with-ld=/usr/local/bin/arm-linux-gnu-ld \ --with-headers=/usr/arm-linux-gnu/include \ --with-libs=/usr/arm-linux-gnu/lib \ --enable-shared --disable-nls $ make # make install
これで準備完了。あとは普通にカーネル作る。
$ make ARCH=arm menuconfig ......... $ fakeroot make-kpkg --arch arm --cross_compile arm-linux-gnu --revision=kurobox.1.0 binary-arch
これでlinux-image-2.6.25_kurobox.1.0_arm.debとlinux-headers-2.6.25_kurobox.1.0_arm.debができあがる。あとは玄箱にscpしてdpkg -iするだけ……
とはいかないんだな。
どうやらKURO-BOX/PROで採用してるu-bootというブートローダは、普通のzImageなんかを読みこめないらしい。u-boot用の形式にしておかなければならないようだ。
幸いsid環境にはuboot-mkimageというパッケージがあるのでそれをインストールしておけばよい。あとは以下のようにしてubootイメージを作る。
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnu- uImage
これを玄箱の/bootにコピーして、u-boot環境変数kernelをuImage.buffaloからuImageに変えておく。
以上で2.6.25カーネル動作完了だ。
あ、あと2.6.25にサポートが入ったとはいえ、パッチが必要なくなったわけでもない。一部まだパッチが必要なようだ。 Linux カーネル 2.6.25-rc1-git4を試す という記事にある4つのパッチセットのうち、うちでは以下の3つをあててビルドした。
- force-match-type.patch
- sata_mv.c.diff
- usb-serial.c.diff
ただしsata_mv.c.diffはそのまま当たらなかったので、1行パッチだったし手であてた。
.configも当該サイトからひろってきたものをベースにいじった。存外素直に動くもんだ。
apt-crossはまだ依存関係を解決してくれないようだけども、それは鋭意開発中らしい。ということで今後はもっと簡単になりそうだ。クロスコンパイルどんとこいだな。
(@649)