NetBSD 3.1のクロスコンパイル環境構築

NetBSDの大きな特徴の一つにクロスコンパイル環境構築の容易さがあります。
ここではi386用のNetBSD 3.1上にPowerPC用のNetBSD 3.1で実行させるアプリケーションをビルドするクロスコンパイル環境構築手順を紹介します。


  1. ソースの準備
    クロスコンパイル環境は通常のパッケージインストールとは異なりpkgsrcからビルドするという形態では行えません。
    手動でNetBSDのソースを取得してそこに含まれるbuild.shを実行してクロスコンパイル環境を構築します。

    まず、ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-3.1/source/sets/あたりから以下のソースの塊を取得します。
    ・gnusrc.tgz
    ・sharesrc.tgz
    ・src.tgz ※この中に/usr/src/build.shが含まれています。
    ・syssrc.tgz
    ・xsrc.tgz ※これは任意です。

    尚、NetBSD 3.1より前のバージョン(例えばNetBSD 2.0.2)用のクロスコンパイル環境を構築する場合には上記サイトにソースがないためftp://ftp.netbsd.org/pub/NetBSD/NetBSD-2.0.2/source/sets/あたりから取得します。

  2. ソースの解凍
    上記でダウンロードしたファイルは/tmpにあるものと仮定し次のように解凍します。
    # cd /
    # tar zxvf /tmp/gnusrc.tgz
    # tar zxvf /tmp/sharesrc.tgz
    # tar zxvf /tmp/src.tgz
    # tar zxvf /tmp/syssrc.tgz
    # tar zxvf /tmp/xsrc.tgz
    上記により/usr/srcや/usr/xsrcが生成されます。

  3. ツールチェインの作成
    ここではクロスコンパイラを構成するプログラム(ツール)群を作成します。
    # mkdir /usr/obj
    # cd /usr/src
    # chmod 775 build.sh
    # ./build.sh -T tools -m macppc tools
    ※「-T tools」はTOOLDIRが/usr/src/toolsであることを示しています。
    ※「-m macppc」はMACHINE_ARCHをpowerpcにするための指定です。ここでは「-m powerpc」という指定はできません。
    ※最後の「tools」という操作指示はツールのビルドとインストールを行うための指示です。

    /usr/src/tools/binには以下のプログラムが作成されます。
    nbasn1_compile                nbmakefs                      nbzic
    nbcap_mkdb                    nbmakeinfo                    powerpc--netbsd-addr2line
    nbcat                         nbmakewhatis                  powerpc--netbsd-ar
    nbcksum                       nbmenuc                       powerpc--netbsd-as
    nbcompile_et                  nbmkcsmapper                  powerpc--netbsd-c++
    nbconfig                      nbmkdep                       powerpc--netbsd-c++filt
    nbcrunchgen                   nbmkesdb                      powerpc--netbsd-cpp
    nbctags                       nbmklocale                    powerpc--netbsd-dbsym
    nbdb                          nbmknod                       powerpc--netbsd-g++
    nbeqn                         nbmktemp                      powerpc--netbsd-g77
    nbfile                        nbmsgc                        powerpc--netbsd-gcc
    nbgencat                      nbmtree                       powerpc--netbsd-gcc-3.3.3
    nbgroff                       nbnroff                       powerpc--netbsd-gccbug
    nbhexdump                     nbpax                         powerpc--netbsd-gcov
    nbhost-mkdep                  nbpic                         powerpc--netbsd-ld
    nbindxbib                     nbpwd_mkdb                    powerpc--netbsd-lint
    nbinfo                        nbrefer                       powerpc--netbsd-mdsetimage
    nbinfokey                     nbrpcgen                      powerpc--netbsd-nm
    nbinstall                     nbsoelim                      powerpc--netbsd-objcopy
    nbinstall-info                nbstat                        powerpc--netbsd-objdump
    nbinstallboot                 nbsunlabel                    powerpc--netbsd-ranlib
    nblex                         nbtbl                         powerpc--netbsd-readelf
    nblorder                      nbtexi2dvi                    powerpc--netbsd-size
    nbm4                          nbtexindex                    powerpc--netbsd-strings
    nbmacppc-fixcoff              nbtsort                       powerpc--netbsd-strip
    nbmake                        nbuudecode
    nbmake-macppc                 nbyacc
    

  4. ユーザランドの作成
    次にクロスコンパイルで必要となるPowerPC用のinclude, libを以下のようにして作成します。
    # cd /usr/src
    # ./build.sh -T tools -m macppc distribution ※1〜2時間掛かります。
    ※「-T tools」を省略すると/usr/src/tools/binとは別の/usr/src/tooldir.NetBSD-3.1-i386/binにツールが再作成されてしまいます。
    ※ここでは「-D デスティネーションパス」を省略しているためデフォルトで/usr/src/destdir.macppcにincludeとlibが作成されます。

  5. /usr/src/destdir.macppc/usr/includeの構成

  6. /usr/src/destdir.macppc/usr/libの構成

  7. /usr/src/tools/powerpc--netbsdの確認
    この時点では/usr/src/tools/powerpc--netbsdにはbinとlibだけが生成されています。
    /usr/src/tools/powerpc--netbsd/binは以下の構成になっています。
    ar     as     c++    g++    gcc    ld     nm     ranlib strip
    

    また/usr/src/tools/powerpc--netbsd/libにはldscriptsディレクトリしか存在しません。

  8. /usr/src/tools/powerpc--netbsd/libにおけるシンボリックリンクの作成
    /usr/src/tools/powerpc--netbsd/libの中に下記ファイル群へのシンボリックリンクを作成します。
    対象:/usr/src/destdir.macppc/usr/lib/*(crt0.o, crtbegin.o等)と/usr/src/destdir.macppc/lib/*(libc.so等)。
    # cd /usr/src/tools/powerpc--netbsd/lib
    # ln -s /usr/src/destdir.macppc/usr/lib/* .
    # ln -s -f /usr/src/destdir.macppc/lib/* . ※これはコンパイル時の共有ライブラリの扱いに関する非互換エラーを回避します。

  9. テストコンパイル

  10. その他
    (1)/usr/src/objは/usr/objへのシンボリックリンクとなります。