CLFS(1.1.0-Sparc64-Pure64)-クロス開発環境構築(2)
2010年11月 6日(土) 02:19 JST
閲覧数 4,509
x86環境上で、sparc64用のクロスコンパイル環境を構築します。
組み込み系の経験のある方なら馴れた工程だと思いますが、それ以外の方だとあまり見慣れない作業かもしれません。
◆環境変数の設定
まずは環境変数の設定をします。ホスト環境でのビルドフラグの影響を受けないように、CFLAFSのアンセットを実施し、--host、--targetの為の変数を設定します。
◆Build Flagsの指定
今回は、UltraSparc2でも動作させることを考えている為、以下設定としていますが、UltraSparc3以上であれば指定が「ultrasparc3」に変わります。
◆カーネルヘッダのインストール
◆File-4.23のビルド
◆Cross Binutils-2.18のビルド
Texinfoがホストシステムに導入されていないと、エラーが発生するので注意。
CLFSのバージョンチェックには記載されていなかったと思われるが、必要となる模様。。。
エラー内容は別途記載。
◆Cross GCC-4.2.4 - Staticのビルド
ここで、C言語のみのGCCビルドを実施する。(他のC++などは作成しない、次のGCCビルドで作ることになる。)
CLFSでの一回目のGCCビルドで、スタティックなGCCビルドとなります。
◆Glibc-2.7のビルド
◆Cross GCC-4.2.4 - Finalのビルド
このビルドが、クロス開発環境用のGCCのビルドになります。
ここまでは、組み込み開発とかでクロス環境がほしい時に、ちょくちょくやる作業と同じですね。
組み込み系の経験のある方なら馴れた工程だと思いますが、それ以外の方だとあまり見慣れない作業かもしれません。
◆環境変数の設定
まずは環境変数の設定をします。ホスト環境でのビルドフラグの影響を受けないように、CFLAFSのアンセットを実施し、--host、--targetの為の変数を設定します。
$ unset CFLAGS $ unset CXXFLAGS $ echo unset CFLAGS >> ~/.bashrc $ echo unset CXXFLAGS >> ~/.bashrc $ export CLFS_HOST="$(echo $MACHTYPE | \ sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")" $ export CLFS_TARGET="sparc64-unknown-linux-gnu" $ echo export CLFS_HOST=\""${CLFS_HOST}\"" >> ~/.bashrc $ echo export CLFS_TARGET=\""${CLFS_TARGET}\"" >> ~/.bashrc
◆Build Flagsの指定
今回は、UltraSparc2でも動作させることを考えている為、以下設定としていますが、UltraSparc3以上であれば指定が「ultrasparc3」に変わります。
$ export BUILD64="-m64 -mcpu=ultrasparc -mtune=ultrasparc" $ export GCCTARGET="-mcpu=ultrasparc -mtune=ultrasparc" $ echo export BUILD64=\""${BUILD64}\"" >> ~/.bashrc $ echo export GCCTARGET=\""${GCCTARGET}\"" >> ~/.bashrc
◆カーネルヘッダのインストール
$ patch -Np1 -i ../linux-2.6.24.7-elf_spitfire_fix-1.patch $ install -dv /tools/include $ make mrproper $ make ARCH=sparc64 headers_check $ make ARCH=sparc64 INSTALL_HDR_PATH=dest headers_install $ cp -rv dest/include/* /tools/include実施時のログ:5.5-Linux-Headers-2.6.24.7.log
◆File-4.23のビルド
$ ./configure --prefix=/cross-tools $ make $ make install実施時のログ:5.6-File-4.23.log
◆Cross Binutils-2.18のビルド
Texinfoがホストシステムに導入されていないと、エラーが発生するので注意。
CLFSのバージョンチェックには記載されていなかったと思われるが、必要となる模様。。。
エラー内容は別途記載。
$ patch -Np1 -i ../binutils-2.18-posix-1.patch $ patch -Np1 -i ../binutils-2.18-branch_update-3.patch $ mkdir -v ../binutils-build $ cd ../binutils-build $ AR=ar AS=as ../binutils-2.18/configure --prefix=/cross-tools \ --host=${CLFS_HOST} --target=${CLFS_TARGET} --with-lib-path=/tools/lib \ --disable-nls --enable-shared --enable-64-bit-bfd --disable-multilib $ make configure-host $ make $ make install $ cp -v ../binutils-2.18/include/libiberty.h /tools/include実施時のログ:5.7-CrossBinutils-2.18.log
◆Cross GCC-4.2.4 - Staticのビルド
ここで、C言語のみのGCCビルドを実施する。(他のC++などは作成しない、次のGCCビルドで作ることになる。)
CLFSでの一回目のGCCビルドで、スタティックなGCCビルドとなります。
$ patch -Np1 -i ../gcc-4.2.4-pure64_specs-1.patch $ patch -Np1 -i ../gcc-4.2.4-posix-1.patch $ patch -Np1 -i ../gcc-4.2.4-cross_search_paths-1.patch $ echo " #undef STARTFILE_PREFIX_SPEC #define STARTFILE_PREFIX_SPEC \"/tools/lib/\"" >> gcc/config/sparc/linux.h $ echo " #undef STARTFILE_PREFIX_SPEC #define STARTFILE_PREFIX_SPEC \"/tools/lib/\"" >> gcc/config/sparc/linux64.h $ cp -v gcc/Makefile.in{,.orig} $ sed -e "s@\(^CROSS_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g" \ gcc/Makefile.in.orig > gcc/Makefile.in $ mkdir -v ../gcc-build $ cd ../gcc-build $ ../gcc-4.2.4/configure --prefix=/cross-tools \ --host=${CLFS_HOST} --target=${CLFS_TARGET} --disable-multilib \ --with-local-prefix=/tools --disable-nls --disable-shared \ --disable-threads --enable-languages=c $ make CFLAGS_FOR_TARGET="${GCCTARGET}" all-gcc $ make install-gcc実施時のログ:5.8-CrossGCC-4.2.4-Static.log
◆Glibc-2.7のビルド
$ patch -Np1 -i ../glibc-2.7-libgcc_eh-1.patch $ patch -Np1 -i ../glibc-2.7-localedef_segfault-1.patch $ mkdir -v ../glibc-build $ cd ../glibc-build $ echo "libc_cv_forced_unwind=yes" > config.cache $ echo "libc_cv_c_cleanup=yes" >> config.cache $ echo "libc_cv_sparc64_tls=yes" >> config.cache $ BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc ${BUILD64}" \ AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" \ ../glibc-2.7/configure --prefix=/tools \ --host=${CLFS_TARGET} --build=${CLFS_HOST} \ --disable-profile --enable-add-ons \ --with-tls --enable-kernel=2.6.0 --with-__thread \ --with-binutils=/cross-tools/bin --with-headers=/tools/include \ --cache-file=config.cache $ make $ make install $ mv -v /tools/include/gnu/stubs{-64,}.h実施時のログ:5.9-Glibc-2.7.log
◆Cross GCC-4.2.4 - Finalのビルド
このビルドが、クロス開発環境用のGCCのビルドになります。
ここまでは、組み込み開発とかでクロス環境がほしい時に、ちょくちょくやる作業と同じですね。
$ patch -Np1 -i ../gcc-4.2.4-PR31490-1.patch $ patch -Np1 -i ../gcc-4.2.4-pure64_specs-1.patch $ patch -Np1 -i ../gcc-4.2.4-posix-1.patch $ patch -Np1 -i ../gcc-4.2.4-cross_search_paths-1.patch $ echo " #undef STARTFILE_PREFIX_SPEC #define STARTFILE_PREFIX_SPEC \"/tools/lib/\"" >> gcc/config/sparc/linux.h $ echo " #undef STARTFILE_PREFIX_SPEC #define STARTFILE_PREFIX_SPEC \"/tools/lib/\"" >> gcc/config/sparc/linux64.h $ cp -v gcc/Makefile.in{,.orig} $ sed -e "s@\(^CROSS_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g" \ gcc/Makefile.in.orig > gcc/Makefile.in $ mkdir -v ../gcc-build $ cd ../gcc-build $ ../gcc-4.2.4/configure --prefix=/cross-tools \ --target=${CLFS_TARGET} --host=${CLFS_HOST} --disable-multilib \ --with-local-prefix=/tools --disable-nls --enable-shared \ --enable-languages=c,c++ --enable-__cxa_atexit \ --enable-c99 --enable-long-long --enable-threads=posix $ make AS_FOR_TARGET="${CLFS_TARGET}-as" \ LD_FOR_TARGET="${CLFS_TARGET}-ld" $ make install実施時のログ:5.10-CrossGCC-4.2.4-Final.log