crosstool

crosstoolという便利なものがあることを最近知ったので試してみた。
Debianだと、どちらも

# aptitude install gcc gawk automake libtool bzip2 libgmp3-dev libmpfr-dev

くらいで使えるようになる。

crosstool

http://www.kegel.com/crosstool/
パッチとスクリプトの集まり。展開して実行するだけで、インストールは不要。
SH-4ならdemo-sh4.shの必要な部分だけ修正して実行するだけ。ダウンロードからパッチ当て、ビルドまでやってくれる優れもの。これは簡単だ。
本家版のcrosstool-0.43.tar.gz開発環境の構築 - spumone にあるcrosstool-0.43-sh4a.tar.gzとの違いは、破損ファイルが修復されているのと、GCC 3.4.5でBinutils 2.16.1を使うようになっている。
demo-sh4.shではGCC 4.1系+glibc 2.3.6までの例が入っている。それより新しいものは未知数。開発は止まっているぽい。

crosstool-NG

http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool
crosstoolにmenuconfigインターフェースを追加して書き直したもの。特別な指定がなくてもビルドログが残るので便利。
SVN版にはGCC 4.3.2へのパッチが入っているなど比較的活発にメンテナンスされているが、SH-4はメンテナがいないためEXPERIMENTALとなっている。SH-4用で使うならOBSOLETEとEXPERIMENTALの両方をYにする必要がある。

やっていること

crosstool-NGを試してみるとわかるが、非常に面倒なことをやっている。

  1. ソースのダウンロード
  2. ソースの展開とパッチ当て
  3. カーネルヘッダの準備(version.hとか)
  4. binutilsのビルド
  5. libcのヘッダの準備
  6. libcビルド用のGCCのビルド
  7. libcの基本部分のビルド
  8. GCCのビルド
  9. libcの残りの部分のビルド

glibcのビルドは非常にややこしいというのは知っていたのだけど、ここまで面倒だと手作業ではやる気がしない。
crosstool-NGがぜんぜんうまくいかないのでソースをgrepしたりしていたのだけど、結論としては--enable-kernel=2.5.63以上を指定すると失敗することが判明。「特定のバージョンの特定の組み合わせで特定の設定」でないとビルドできない感じ。なかなか厳しい。
CT_LIBC_GLIBC_MIN_KERNEL_VERSION="2.5.62"を指定したらGCC3.3.6+linuxthreads+glibc2.3.6が通るようになった。しかしGCC4系はsignal.hが見つからないとかいうエラーが出てまだ成功していない。
crosstoolだとlibcビルド用のGCCバージョンと最終的なGCCバージョンのは両方が指定できるようになっているのだが、NGの方では(EXPERIMENTALではないアーキテクチャでは必要がないからだろうか)その機能がない。両方指定できるように改造すれば通るかも。