クロスコンパイラを作成したついでにLS-GL上で動作するネイティブコンパイラも作成してみました。あくまで実験なので、なるべく本体のファイルシステムを汚さない方向で導入できるようにビルドしています(Ver1.11にしたのを機に再度作り直しました)。
作業用の~/ls-glはクロスコンパイラ作成時のものを使いました:
cd ~/ls-gl/src
tar xvjf ../tar/binutils-2005q3-2.tar.bz2
tar xvjf ../tar/gcc-2005q3-2.tar.bz2
mv gcc-2005q3 gcc-2005q3-native
patch -p1 -d gcc-2005q3-native < gcc-2005q3-native.diff
後、クロスコンパイルと同様のパッチを当てます。これで作業ディレクトリ側の準備完了。
ネイティブコンパイラはLS-GL本体の/usr/local/developにインストールされるように構成しました。ライブラリは本体の/usr/lib、/lib、/usr/local/libを参照するようにしてあります:
bintuilsからビルドします(シェルスクリプトでやった方が便利でしょう):
export NATIVEPATH=~/ls-gl/rootfs
export CROSSPATH=/usr/local/ls-gl
export PATH=${CROSSPATH}/bin:$PATH
export LC_ALL=POSIX
export LFS_HOST="i686-pc-linux-gnu"
export LFS_TARGET="arm-none-linux-gnueabi"
cd ~/ls-gl/build
rm -rf binutil-native
mkdir binutil-native
cd binutil-native
../../src/binutils-2.17pre/configure \
--prefix=/usr/local/develop \
--infodir=${PREFIX}/share/info \
--mandir=${PREFIX}/share/man \
--build=${LFS_HOST}
--host=${LFS_TARGET} \
--target=${LFS_TARGET} \
--disable-nls \
--enable-shared \--with-lib-path=/usr/local/lib:/usr/lib:/lib \
--disable-multilib
make
sudo make DESTDIR=${NATIVEPATH} install
sudo cp -v ${SRC}/${TAG_BINUTL}/include/libiberty.h ${NATIVEPATH}/usr/local/develop/include
以上。
gccをビルドします:
export NATIVEPATH=~/ls-gl/rootfs
export CROSSPATH=/usr/local/ls-gl
export PATH=${CROSSPATH}/bin:$PATH
export LC_ALL=POSIX
export LFS_HOST="i686-pc-linux-gnu"
export LFS_TARGET="arm-none-linux-gnueabi"
cd ~/ls-gl/build
rm -rf gcc-native
mkdir gcc-native
cd gcc-native
${SRC}/gcc-2005q3-native/configure \
--prefix=/usr/local/develop \
--infodir=${PREFIX}/share/info \
--mandir=${PREFIX}/share/man \
--host=${LFS_TARGET} \
--target=${LFS_TARGET} \
--build=${LFS_HOST} \
--with-cpu=arm926ej-s \
--with-gnu-ld \
--with-gnu-as \
--disable-sanity-checks \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-nls \
--enable-shared \
--enable-c99 \
--enable-long-long \
--enable-__cxa_atexit \
--enable-threads=posix \
--enable-languages=c,c++
make
sudo make DESTDIR=${NATIVEPATH} install
ここまでで~/ls-gl/rootfsにはbinutilsとgccのビルド結果が格納されているので開発環境ベースとしてtarボール化して保存しておくといいかもしれません。
cd ~/ls-gl/rootfs/usr/local
sudo tar cvjf ../../../develop.tar.bz2 develop/
本体で動作するgmakeをビルドします、GNUのサイトよりmake-3.81.tar.gzをtarディレクトリにダウンしておきます:
export NATIVEPATH=~/ls-gl/rootfs
export CROSSPATH=/usr/local/ls-gl
export PATH=${CROSSPATH}/bin:$PATH
export LFS_HOST="i686-pc-linux-gnu"
export LFS_TARGET="arm-none-linux-gnueabi"
cd ~/ls-gl/src
tar xvzf ../tar/make-3.81.tar.gz
cd make-3.81
./configure \
--prefix=/usr/local/develop \
--host=${LFS_TARGET} \
--target=${LFS_TARGET} \
--build=${LFS_HOST}
make
sudo make DESTDIR=${NATIVEPATH} install
同様にautomakeやautoconf、flex、bison等を必要に応じて作成します。
ホスト側の"~/ls-gl/rootfs"が本体側の"/"に相当します。rootfs以下をそのまま本体に持っていくか、本体の別のディレクトリにコピーして本体の/usr/local/developにシンボリックを作成してもよいでしょう(当方は後者で行っています)。使用する際には:
export PATH=/usr/local/develop/bin:$PATH
vi /etc/ld.so.conf ←/usr/local/develop/libを追加
ldconfig
等としてPathや動的リンクを通してやります。
ソースCDには標準でgcc-3.4.4(2005q3-2)が付属していますが稀にコンパイラの内部エラーでビルド出来ないことがあります。patchの出ているものはいいのですが、相当するものが見つからないこともあるのでCodeSourceryのtoolchains最新版ソース(2007q3)に付属するgcc-4.2.1をLS-GL用に作成してみました。
ほとんど手順は変わらないのですが既存のクロスコンパイラgcc-3.4.4では4.2をコンパイル出来なかったので同じくCodeSourceryより配布されているi686 Linux用のバイナリでクロスビルドしました。同梱のbinutilsと先のgcc用patch"gcc-2005q3-native.diff"の内容を手動で4.2のソースに当てビルドしたのですがinstall時にpdfの文書まで作成するようで、この辺はMakefileから外し何とか成功(正確に測ったわけではありませんが体感的に3.4.4に比べると随分ビルドに時間が掛かったような気がします)。LS-GLに持っていき3.4.4では内部エラーが発生したソースをビルドしてみたら無事コンパイルは通りました(まだ出来上がったバイナリはまともに動かしてはいませんがバージョン表示くらいは出ますw)。
gccもRPM管理していないので上書きインストールしてしまいましたが、しばらくこのまま使ってみようかと思います(と言っても必要なものはほとんどビルド済みですが)。本来ならautoconf/automake/libtoolもビルドし直した方がいいのかもしれませんが面倒なのでやってません。
追記('08/4/20):/usr/lib、/usr/local/libにあるlibstdc++.so.6.0.3へシンボリックリンクlibstdc++.soやlibstdc++.so.6を今回ビルドしたgcc 4.2用のlibstdc++.so.6.0.9へ張替える必要があります。C++のコードをコンパイルする際に"__cxa_get_exception_ptr"が見つからない等のエラーが出てldに怒られますw(実際、これが出てしばし悩みました・・・orz)
簡単なテストではコンパイルが出来ているようですが、こちらもクロスコンパイラ同様まだまだ改良の余地があるでしょう。