もっとdebパッケージを!
というわけで,LANDISKのLinux BOX化の続き.我ながらよく続くものだ.
昨日の日記で,Debian/SH4な環境が構築できたことを書いた.DODESプロジェクトの成果で,
gccを含めかなりのパッケージがSH4に移植されている.
ただ,いかんせんパッケージのバージョンが古いし,すべてのパッケージが移植されているわけでもないので,不都合も出てくる.
たとえばaptitudeは入っていない.apt-getだけでもそんなには困らないけど,やっぱりちょっと不便.ソースは手に入るんだし,
ちょっくらbuildしてインストールしてみよう.
…なんてことを思ってしまったのが運のつき.
SH4用のパッケージを作ってみよう
クロス開発環境を構築して,そこでパッケージを作ってもいいし,
LANDISKのSH4の非力さを考えるとそちらのほうが最終的には早いんだろうけど,せっかくgccがあるんだし,低騒音・低消費電力・
24H稼動の強みを活かして,LANDISK自身に夜なべでパッケージをbuildしてもらうことにした.
電源を入れて翌日には24Hこき使われるなんて,うちのLANDISKってば不幸.
まずは下準備.apt-getでソースパッケージを取得できるように/etc/apt/sources.listを編集する.
バイナリパッケージ用のDODESのサイトを含め,こんな感じ.
deb http://debian.dodes.org/debian sid main non-free contrib
deb-src http://ring.asahi-net.or.jp/pub/linux/debian/debian sid main contrib non-free
deb-src http://ring.asahi-net.or.jp/pub/linux/debian/debian-jp sid-jp main contrib non-free
deb-srcの行の'sid'はお好みに合わせてstableでもtestingでもお好きなように.
あとは,apt-get updateでパッケージDBを更新したあと,
- apt-get source hogehoge で,hogehogeのソースパッケージを取ってくる.
- hogehoge-X.Y というディレクトリ(X,Yは適当な数字)ができるので,そこに移動.
- おもむろにdpkg-buildpackage -rfakerootと入力してパッケージをビルド.(rootの場合は
-rfakeroot は不要.こわいけど)
- これだけで,運がよければ親ディレクトリにhogehogeのパッケージができているので,それを dpkg -i
でインストール.
このとき,GNU screenを用いて上記の手順を実施すれば,
時間がかかるビルドの途中で端末の接続を切ったり繋ぎ戻したりが自在にできてとても便利.
screenの使い方はてきとーにぐぐれば見つかります.
ただし,昨日書いたように chroot 環境の /dev/pts に devpts fs を mount しておかないと,
screen が起動できないので注意のこと.
パッケージ構築のための依存関係を満たせていない場合
dpkg-buildpackageをしても,
...(省略)
dpkg-checkbuilddeps: Unmet build dependencies: gcj (>= 3:3.2.2-0) fastjar sablevm libgcj4-dev
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: (Use -d flag to override.)
なんてエラーが出て止まってしまうことがある.読んだままの意味で,パッケージをビルドするために必要なパッケージが足りない.
このときは,「足りない」と言われたパッケージをapt-getでインストールするか,(バイナリパッケージが無いようなら)
そちらを先にソースからビルドすればよい.
…これを再帰的に繰り返すと,そのうちに元々は何をビルドしたかったのか忘れてしまったりしがちなので注意.
依存関係が満たせない場合
ときどき,Aというパッケージの構築にBというパッケージが必要で,Bの構築にはAが必要,
みたいに依存関係が循環してしまうケースに出合ってしまう.たいていはバージョンの制約が原因なので,
そんなときは古いパッケージを無理やり使ってビルドしてしまうのも一つの手.(もちろん本来はやるべきではない)
dpkg-buildpackage -d で依存関係を無視すれば,無理やりビルドが可能になる.ただ,
何かがおかしくなっている可能性があるので,無理やりビルドしたパッケージは(必要に応じて)後でビルドし直したほうがいいかも.ただ,
所詮は無理やりなもので作ったものを使って作り直すことになるので,それも気休めかもしれない.at your own riskでどうぞ.
(この話だけに限りませんが)
途中でビルドが止まってしまった
SH4は公式な移植対象ではないので,きちんと依存関係を守ってビルドしても途中でmakeが止まってしまうことがある.
そんなときはてきとーにほげってmakeを続行させればよいが,
dpkg-buildpackageだと途中までの成果をきれいさっぱり忘れて最初からやり直しになってしまう.それが悲しいときは,
debian/rules binary と唱えてmakeを途中から再開させることができる.
注意事項
上記で書いたことは,3分間クッキングのようにいい加減です.言い換えると,rpmの世界のようにいい加減です :p.
Debianには本来それなりに厳格なお作法があり,それを支える優秀なツール群も充実しています.本来のやり方について,
メンテナ入門やポリシーマニュアルなど関連ドキュメントを一読することをお勧めします.
現時点までの夜なべの成果
並べてみた.
te@landisk$ ls *sh4.deb
acl_2.2.23-1_sh4.deb libncurses5-dbg_5.4-4_sh4.deb
attr_2.4.16-1_sh4.deb libncurses5-dev_5.4-4_sh4.deb
binutils-dev_2.14.90.0.7-8_sh4.deb libncurses5_5.4-4_sh4.deb
binutils-multiarch_2.14.90.0.7-8_sh4.deb libncursesw5-dbg_5.4-4_sh4.deb
binutils_2.14.90.0.7-8_sh4.deb libncursesw5-dev_5.4-4_sh4.deb
blt-common_2.4z-2_sh4.deb libncursesw5_5.4-4_sh4.deb
blt-demo_2.4z-2_sh4.deb libsigc++-1.2-5c102_1.2.5-1_sh4.deb
blt-dev_2.4z-2_sh4.deb libsigc++-1.2-dev_1.2.5-1_sh4.deb
blt_2.4z-2_sh4.deb libssl-dev_0.9.7d-3_sh4.deb
bzip2_1.0.2-1_sh4.deb libssl0.9.7_0.9.7d-3_sh4.deb
coreutils_5.0.91-2_sh4.deb make_3.80-8_sh4.deb
debianutils_2.8.3_sh4.deb ncurses-bin_5.4-4_sh4.deb
devscripts_2.7.95.1_sh4.deb openssl_0.9.7d-3_sh4.deb
flex-old_2.5.4a-6_sh4.deb sed_4.1-3_sh4.deb
info_4.6-1_sh4.deb tcl8.4-dev_8.4.6-1_sh4.deb
libacl1-dev_2.2.23-1_sh4.deb tcl8.4_8.4.6-1_sh4.deb
libacl1_2.2.23-1_sh4.deb texinfo_4.6-1_sh4.deb
libattr1-dev_2.4.16-1_sh4.deb tix8.1-dev_8.1.4-6_sh4.deb
libattr1_2.4.16-1_sh4.deb tix8.1_8.1.4-6_sh4.deb
libbz2-1.0_1.0.2-1_sh4.deb tk8.4-dev_8.4.6-1_sh4.deb
libbz2-dev_1.0.2-1_sh4.deb tk8.4_8.4.6-1_sh4.deb
libgdbm-dev_1.8.3-2_sh4.deb wget_1.8.1-6_sh4.deb
libgdbm3_1.8.3-2_sh4.deb
こうして見るといつのまにかそれなりに作ったな.現在,大物のgcc-3.3一式を夜なべ中.
ビルドの際にgcc-3.3に依存するパッケージも結構多いので.こいつはさすがに一筋縄ではいかない.
ちなみに,この道に踏み出す原因となったaptitudeはまだビルドできていません.
aptitudeをビルドできる環境を構築するだったはずが,なんとなく手段が目的化してしまっているような気がする.
…まあ,正しい現実逃避のあり方かもしれない.