CLFS(1.1.0-Sparc64-Pure64)-クロス開発環境構築(2)
2010年11月 6日(土) 02:19 JST
閲覧数 4,718
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


