今回はSH4環境のビルドスクリプトについてです。
とはいっても、ARMはこれの縮小版になりますが。
#!/bin/sh
ARCH=sh
SRC_BINUTILS=binutils-2.17
BUILD_BINUTILS=$ARCH-binutils
SRC_GCC=gcc-4.1.2
BUILD_GCC=$ARCH-gcc
SRC_NEWLIB=newlib-1.15.0
BUILD_NEWLIB=$ARCH-newlib
TARGET=$ARCH-elf
PREFIX=/devkitPro/devkitDC/$TARGET
binaries=$PREFIX/bin
export PATH=$PATH:$binaries
GO_BINUTILS=0
GO_BASEGCC=0
GO_NEWLIB=1
GO_FINALGCC=0
if [ $GO_BINUTILS -eq 1 ]
then
date
echo "Go binutils:"
if [ ! -d $BUILD_BINUTILS ]
then
mkdir $BUILD_BINUTILS
fi
cd $BUILD_BINUTILS
../$SRC_BINUTILS/configure --target=$TARGET --prefix=$PREFIX
make all install MAKEINFO=makeinfo
cd ..
echo "Finished binutils:"
date
fi
if [ $GO_BASEGCC -eq 1 ]
then
date
echo "Go gcc(Base):"
if [ ! -d $BUILD_GCC ]
then
mkdir $BUILD_GCC
fi
cd $BUILD_GCC
ln -s ../$SRC_NEWLIB/newlib .
mkdir -p ./gcc/config
cp -R ../$SRC_GCC/gcc/config ./gcc
cp -R ../$SRC_GCC/gcc/coretypes.h ./gcc
cp -R ../$SRC_GCC/gcc/defaults.h ./gcc
../$SRC_GCC/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --disable-libssp --with-newlib
make all
make install
cd ..
echo "Finished gcc(Base):"
date
fi
if [ $GO_NEWLIB -eq 1 ]
then
date
echo "Go newlib:"
if [ ! -d $BUILD_NEWLIB ]
then
mkdir $BUILD_NEWLIB
fi
cd $BUILD_NEWLIB
make clean
CFLAGS=-D__USE_MINGW_ACCESS ../$SRC_NEWLIB/configure --target=$TARGET --prefix=$PREFIX
make all install \
MAKEINFO=makeinfo \
CC_FOR_TARGET=$binaries/${TARGET}-gcc \
AS_FOR_TARGET=$binaries/${TARGET}-as \
LD_FOR_TARGET=$binaries/${TARGET}-ld \
AR_FOR_TARGET=$binaries/${TARGET}-ar \
RANLIB_FOR_TARGET=$binaries/${TARGET}-ranlib
cd ..
echo "Finished newlib:"
date
fi
if [ $GO_FINALGCC -eq 1 ]
then
date
echo "Go gcc(Final):"
cd $BUILD_GCC
make clean
../$SRC_GCC/configure --target=$TARGET --prefix=$PREFIX \
--enable-languages=c,c++ \
--disable-debug --disable-libmudflap --disable-libssp \
--with-newlib --without-headers
#--disable-libstdc++-v3
make all
make install
cd ..
echo "Finished gcc(Final):"
date
fi
ARCH=sh
SRC_BINUTILS=binutils-2.17
BUILD_BINUTILS=$ARCH-binutils
SRC_GCC=gcc-4.1.2
BUILD_GCC=$ARCH-gcc
SRC_NEWLIB=newlib-1.15.0
BUILD_NEWLIB=$ARCH-newlib
TARGET=$ARCH-elf
PREFIX=/devkitPro/devkitDC/$TARGET
binaries=$PREFIX/bin
export PATH=$PATH:$binaries
GO_BINUTILS=0
GO_BASEGCC=0
GO_NEWLIB=1
GO_FINALGCC=0
if [ $GO_BINUTILS -eq 1 ]
then
date
echo "Go binutils:"
if [ ! -d $BUILD_BINUTILS ]
then
mkdir $BUILD_BINUTILS
fi
cd $BUILD_BINUTILS
../$SRC_BINUTILS/configure --target=$TARGET --prefix=$PREFIX
make all install MAKEINFO=makeinfo
cd ..
echo "Finished binutils:"
date
fi
if [ $GO_BASEGCC -eq 1 ]
then
date
echo "Go gcc(Base):"
if [ ! -d $BUILD_GCC ]
then
mkdir $BUILD_GCC
fi
cd $BUILD_GCC
ln -s ../$SRC_NEWLIB/newlib .
mkdir -p ./gcc/config
cp -R ../$SRC_GCC/gcc/config ./gcc
cp -R ../$SRC_GCC/gcc/coretypes.h ./gcc
cp -R ../$SRC_GCC/gcc/defaults.h ./gcc
../$SRC_GCC/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --disable-libssp --with-newlib
make all
make install
cd ..
echo "Finished gcc(Base):"
date
fi
if [ $GO_NEWLIB -eq 1 ]
then
date
echo "Go newlib:"
if [ ! -d $BUILD_NEWLIB ]
then
mkdir $BUILD_NEWLIB
fi
cd $BUILD_NEWLIB
make clean
CFLAGS=-D__USE_MINGW_ACCESS ../$SRC_NEWLIB/configure --target=$TARGET --prefix=$PREFIX
make all install \
MAKEINFO=makeinfo \
CC_FOR_TARGET=$binaries/${TARGET}-gcc \
AS_FOR_TARGET=$binaries/${TARGET}-as \
LD_FOR_TARGET=$binaries/${TARGET}-ld \
AR_FOR_TARGET=$binaries/${TARGET}-ar \
RANLIB_FOR_TARGET=$binaries/${TARGET}-ranlib
cd ..
echo "Finished newlib:"
date
fi
if [ $GO_FINALGCC -eq 1 ]
then
date
echo "Go gcc(Final):"
cd $BUILD_GCC
make clean
../$SRC_GCC/configure --target=$TARGET --prefix=$PREFIX \
--enable-languages=c,c++ \
--disable-debug --disable-libmudflap --disable-libssp \
--with-newlib --without-headers
#--disable-libstdc++-v3
make all
make install
cd ..
echo "Finished gcc(Final):"
date
fi
各種GO_*変数の値に応じて処理を{する/しない}を切り替えています。
configureやmake時のオプションを試行錯誤する際に、このカタチにしました。
シェルスクリプトはトレースが難しいのでサブルーチンなどにする手法は避けました(という言い訳)。
MinGWでは、
- xgccがヘッダファイルを見つけてくれない
- 'ln -s'でリンクは出来ずファイルコピーが発生する
という現象が起きました。
当方の環境(CPU:PenM1.5GHz/Mem:512M/OS:WinXP-SP2)フルビルドは6時間程度かかりました。
特に、newlibとfinalgccは長いです。
finalgccは、libstdc++にかけている時間が長いようです。
# 標準出力、エラー出力を記録しないとか考えましたけど、さすがに怖い