toolchainの作り方

HDDが壊れてしまったので、toolchainからの再構築となった。
せっかくなので、公開可能、再現可能な手順をメモしておく。


マシンはFTS-NASVIA 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時間半ほどかかった。