toolchainの作り方
HDDが壊れてしまったので、toolchainからの再構築となった。
せっかくなので、公開可能、再現可能な手順をメモしておく。
マシンはFTS-NAS。VIA C3 Ezra 800MHz, RAM 128MB。今となっては貧相なマシン。
ディストリビューションはDebian etchnhalfのnetinstを使ったインストール。taskselでは標準環境のみを選択してミニマムインストール。リモート操作のため、インストール後にマニュアルでsshdを入れておく。
一般ユーザーでログイン。作業はユーザーのホームディレクトリで行う。使用するcrosstoolがrootでの実行を禁止しているので、rootアカウントでは作業できない。シェルスクリプトなので迂回も可能。
crosstoolをダウンロードして展開する。
kinneko@crossroad:~$ pwd /home/kinneko kinneko@crossroad:~$ wget http://www.kegel.com/crosstool/crosstool-0.43.tar.gz kinneko@crossroad:~$ tar zxvf crosstool-0.43.tar.gz
展開されたcrosstoolには、各アーキテクチャごとに実績のあるバージョンのtoolchainソースを指定したデータファイル、各アーキテクチャでのtoolchainへのパッチ、ビルド用のバッチファイル、テスト用のバッチファイルなどが含まれている。
crosstool-0.43は、ARM EABIでのNPTL対応パッチが含まれないので、そのパッチを適用する。
パッチは、以下に含まれている。
http://sources.redhat.com/ml/crossgcc/2006-12/msg00076.html
ファイルとして保存し、パッチを適用する。
kinneko@crossroad:~$ patch -p0 < redhat_nptl_patching patching file crosstool-0.43/arm-softfloat-eabi.dat patching file crosstool-0.43/crosstool.sh patching file crosstool-0.43/demo-arm-softfloat-eabi.sh patching file crosstool-0.43/gcc-4.1.1-glibc-2.5.dat patching file crosstool-0.43/getandpatch.sh patching file crosstool-0.43/patches/gcc-4.0.1/libiberty.patch patching file crosstool-0.43/patches/gcc-4.1.1/gcc-arm-softfp.patch patching file crosstool-0.43/patches/glibc-ports-2.5/glibc-arm-no-procinfo_h.patch
ビルドに必要なソフトウエアを追加インストールする。
kinneko@crossroad:~$ su - Password: crossroad:~# apt-get build-dep gcc binutils パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 以下のパッケージが新たにインストールされます: autoconf binutils bison build-essential cpp cpp-4.1 debhelper dejagnu dpatch dpkg-dev expect-tcl8.3 flex g++ g++-4.1 gcc gcc-3.4-base gcc-4.1 gcj-4.1-base gettext html2text intltool-debian libc6-dev libssp0 libstdc++6-4.1-dev linux-kernel-headers lsb-release make po-debconf tcl8.3 tcl8.4 アップグレード: 0 個、新規インストール: 30 個、削除: 0 個、保留: 0 個。 22.5MB のアーカイブを取得する必要があります。 展開後に追加で 77.1MB のディスク容量が消費されます。 続行しますか [Y/n]? 取得:1 http://ftp.jp.debian.org etch/main flex 2.5.33-11 [310kB] 取得:2 http://ftp.jp.debian.org etch/main autoconf 2.61-4 [448kB] 取得:3 http://ftp.jp.debian.org etch/main binutils 2.17-3 [2605kB] 取得:4 http://ftp.jp.debian.org etch/main bison 1:2.3.dfsg-4 [421kB] 取得:5 http://ftp.jp.debian.org etch/main linux-kernel-headers 2.6.18-7 [1875kB] 取得:6 http://ftp.jp.debian.org etch/main libc6-dev 2.3.6.ds1-13etch7 [2718kB] 取得:7 http://ftp.jp.debian.org etch/main cpp-4.1 4.1.1-21 [2331kB] 取得:8 http://ftp.jp.debian.org etch/main cpp 4:4.1.1-15 [11.6kB] 取得:9 http://ftp.jp.debian.org etch/main libssp0 4.1.1-21 [4492B] 取得:10 http://ftp.jp.debian.org etch/main gcc-4.1 4.1.1-21 [461kB] 取得:11 http://ftp.jp.debian.org etch/main gcc 4:4.1.1-15 [5052B] 取得:12 http://ftp.jp.debian.org etch/main libstdc++6-4.1-dev 4.1.1-21 [1634kB] 取得:13 http://ftp.jp.debian.org etch/main g++-4.1 4.1.1-21 [2615kB] 取得:14 http://ftp.jp.debian.org etch/main g++ 4:4.1.1-15 [1360B] 取得:15 http://ftp.jp.debian.org etch/main make 3.81-2 [382kB] 取得:16 http://ftp.jp.debian.org etch/main dpkg-dev 1.13.25 [166kB] 取得:17 http://ftp.jp.debian.org etch/main build-essential 11.3 [6982B] 取得:18 http://ftp.jp.debian.org etch/main html2text 1.3.2a-3 [98.9kB] 取得:19 http://ftp.jp.debian.org etch/main gettext 0.16.1-1 [2190kB] 取得:20 http://ftp.jp.debian.org etch/main intltool-debian 0.35.0+20060710.1 [30.8kB] 取得:21 http://ftp.jp.debian.org etch/main po-debconf 1.0.8 [111kB] 取得:22 http://ftp.jp.debian.org etch/main debhelper 5.0.42 [510kB] 取得:23 http://ftp.jp.debian.org etch/main tcl8.3 8.3.5-5 [870kB] 取得:24 http://ftp.jp.debian.org etch/main expect-tcl8.3 5.43.0-4 [274kB] 取得:25 http://ftp.jp.debian.org etch/main dejagnu 1.4.4.cvs20060709-3 [946kB] 取得:26 http://ftp.jp.debian.org etch/main dpatch 2.0.21 [83.5kB] 取得:27 http://ftp.jp.debian.org etch/main gcc-3.4-base 3.4.6-5 [164kB] 取得:28 http://ftp.jp.debian.org etch/main gcj-4.1-base 4.1.1-20 [91.5kB] 取得:29 http://ftp.jp.debian.org etch/main tcl8.4 8.4.12-1.1 [1144kB] 取得:30 http://ftp.jp.debian.org etch/main lsb-release 3.1-23.2etch1 [16.2kB] 22.5MB を 3m33s で取得しました (105kB/s) crossroad:~# apt-get install unifdef bzip2 gawk script パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 E: パッケージ script が見つかりません crossroad:~# apt-get install unifdef bzip2 gawk パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 以下のパッケージが新たにインストールされます: bzip2 gawk unifdef アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。 977kB のアーカイブを取得する必要があります。 展開後に追加で 2490kB のディスク容量が消費されます。 取得:1 http://ftp.jp.debian.org etch/main gawk 1:3.1.5.dfsg-4 [694kB] 取得:2 http://ftp.jp.debian.org etch/main bzip2 1.0.3-6 [269kB] 取得:3 http://ftp.jp.debian.org etch/main unifdef 1.0+20030701-1 [13.6kB] 977kB を 9s で取得しました (101kB/s) crossroad:~# exit logout
ビルド用のバッチファイルを編集する。toolchainの置き場所の変更と、作業内容のオプションを変更する。-notestを設定しないと、ビルド後にテストを行うが、dejagnu環境を整備する必要がある。
kinneko@crossroad:~$ cd crosstool-0.43/ kinneko@crossroad:~/crosstool-0.43$ cp demo-arm-softfloat-eabi.sh arm-softfloat-eabi.sh kinneko@crossroad:~/crosstool-0.43$ chmod +x arm-softfloat-eabi.sh kinneko@crossroad:~/crosstool-0.43$ vi arm-softfloat-eabi.sh RESULT_TOP=$HOME/armelcrosstoolchain eval `cat arm-softfloat-eabi.dat gcc-4.1.1-glibc-2.5.dat` sh all.sh -notest
あとは、scriptコマンドでログを取りつつ、timeコマンドで実行時間を計りながら、arm-softfloat-eabi.shを実行する。
さすがにビルドの規模が大きいので、作業には数時間がかかる。
この環境では、340分なので5時間半ほどかかった。