2004年07月26日

おうちでサーバ(その6: gcc-3.3 for SH4)

gcc-3.3 の夜なべ完了

延々とやっているLANDISK用の夜なべdebパッケージ作成.とうとうgcc-3.3のdeb化に成功… したと言い切るのはちょっとはばかられるほど無理矢理だけど,とりあえず "gcc-3.3_3.3.4-2_sh4.deb" という名前のパッケージはできた.

まだ検証は十分にできてないが,とりあえず簡単なソースはコンパイルできた.まあ,gcc 一式のセルフビルドができるくらいには動いているのでよしとしよう.

gcc-3.3 無理矢理パッケージ生成手順

あまり人様に胸を張って公開できるやり方ではないが,とりあえず似たようなことをやっている方々の参考と自分自身の備忘のために, どういうはまり道をたどったのか書いておく.強調されている部分は,無理矢理な解決手段をとったところ.

  • 依存関係の問題回避
    • gnat-3.2がないとgnat(Adaコンパイラ)がbuildできない → gnatを構築対象から外す. そのほか,FortranとかPascalとか使いそうもないものはすべて外す.C, C++, Java および関連ライブラリのみとする.
    • libcのバージョンが古すぎ → バージョン依存関係を無視
  • コンパイル時の不具合回避
    • stage2とstage3のバイナリ生成結果が2つほど一致しない(たしかdwarf2out.oあたりだと思うが忘れた ^^;) → stage3のバイナリをstage2にコピーしてごまかす
    • jv-convertなどlibgcj関係の実行ファイルを生成する際,libffiがリンクされない → libffi.laをlibtoolに食わせるようMakefileを直接変更
  • パッケージ生成時の問題回避
    • libgcc_s.*がdebian/tmp/usr/libにコピーされず, libgccのパッケージ生成に失敗する(ここらへん,元々のmakefileのロジックが怪しい)→ debian/rules実行中の適当なタイミングでコピーする(わはははは). これはさすがにひどすぎる回避法と思うが,どこを修正するべきかわからなかった.
    • test-summaryが生成されていない(無理矢理ごまかしたせい?)→ touchしてごまかす

ここまでで,各種パッケージは生成できた(つもり).

gcc-3.3-base_3.3.4-2_sh4.deb        libgcc1_3.3.4-2_sh4.deb
cpp-3.3_3.3.4-2_sh4.deb             protoize_3.3.4-2_sh4.deb
fixincludes_3.3.4-2_sh4.deb         libffi2_3.3.4-2_sh4.deb
libffi2-dev_3.3.4-2_sh4.deb         gij-3.3_3.3.4-2_sh4.deb
libgcj4_3.3.4-2_sh4.deb             gcj-3.3_3.3.4-2_sh4.deb
libgcj4-dev_3.3.4-2_sh4.deb         fastjar_3.3.4-2_sh4.deb
g++-3.3_3.3.4-2_sh4.deb             libstdc++5_3.3.4-2_sh4.deb
libstdc++5-3.3-dev_3.3.4-2_sh4.deb  libstdc++5-3.3-pic_3.3.4-2_sh4.deb
libstdc++5-3.3-dbg_3.3.4-2_sh4.deb  gcc-3.3_3.3.4-2_sh4.deb

導入時の問題 - libgcc1について *** 重要 ***

無理矢理パッケージ化したせいか,もともとのDODES成果物の仕様による影響かはわからないが, libgcc1をそのままインストールすると,lsなど多くのプログラムで実行時に "/lib/libgcc_s.so.1: version `GLIBC_2.0' not found (required by ls)" などといわれてしまい, 動かなくなってしまう.lsやmvなどの基本的なプログラムにも影響が出てしまうので,かなり致命的.ただ, chroot環境の外には影響はないので,いざそうなってしまってもなんとかならないことはないが(実際になんとかなった).

そのため,libgcc1 を dpkg -i する前に, あらかじめ以下のようにして元のlibgcc_s.so.1も使えるようにしておく.(本来はpreinst script等で対処すべきなのかなぁ).

  1. cp /lib/libgcc_s.so.1 /lib/libgcc_s_glibc20.so.1
  2. echo /lib/libgcc_s_glibc20.so.1 >> /etc/ld.so.preload
  3. ln -sf /lib/libgcc_s_glibc20.so.1 /usr/lib/gcc-lib/sh4-linux/3.0.4/libgcc_s.so

ちなみに,すでにlibgcc1をインストールしてしまった場合は,元のlibgcc_s.so.1 が base-sh4-020728.tar.gzに入っているのでそれを使えば良い.

導入時の問題2 - g++が使えない

せっかくg++を作ってみたのだが,libstdc++5がlibcのバージョン依存関係でインストールできないので使えない. 意味ないじゃん.結局libcも夜なべしないとだめか.ただ,さすがにそれはちょっと怖くて躊躇してしまう.

あああ,aptitudeまでの道のりはまだ遠い…….

この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。