ARMクロスコンパイラ作成(追加)
下記の記事でクロスコンパイラ作成の手順をつらつら書いたが、いちいちコマンドを打って構築するのは面倒なので、コマンド一発で作成できるようにシェルスクリプトを作成してみた。
ARMクロスコンパイラ作成
バージョンを変えて実験してみたい場合も、変数をちょっと変えれば良いようにしてあるので、ちょっとだけ便利。
mkcc.sh
#!/bin/sh # Create ARM cross compiler toolchain. # # Copyright (C) 2012- for keropo, All rights reserved. # HOME_DIR=`pwd` TARGET=arm-unknown-linux-gnueabi CROSS=${HOME_DIR}/toolchain ROOTDIR=${CROSS}/${TARGET}/sysroot BINUTILS_FILE=binutils-2.23.2 GCC_FILE=gcc-4.5.3 GMP_FILE=gmp-5.1.1 MPFR_FILE=mpfr-3.1.2 MPC_FILE=mpc-0.8.2 GLIBC_FILE=eglibc-2_13 KERNEL_FILE=linux-3.2.35 export PATH=$PATH:${CROSS}/bin cleanup() { if [ -e "${BINUTILS_FILE}" ]; then rm -rf ${BINUTILS_FILE} fi if [ -e "${GCC_FILE}" ]; then rm -rf ${GCC_FILE} fi if [ -e "${GMP_FILE}" ]; then rm -rf ${GMP_FILE} fi if [ -e "${MPFR_FILE}" ]; then rm -rf ${MPFR_FILE} fi if [ -e "${MPC_FILE}" ]; then rm -rf ${MPC_FILE} fi if [ -e "${KERNEL_FILE}" ]; then rm -rf ${KERNEL_FILE} fi if [ -e "${GLIBC_FILE}" ]; then rm -rf ${GLIBC_FILE} fi } download_files() { if [ ! -e "${BINUTILS_FILE}.tar.bz2" ]; then wget http://ftp.gnu.org/gnu/binutils/${BINUTILS_FILE}.tar.bz2 fi if [ ! -e "${GCC_FILE}.tar.bz2" ]; then wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/${GCC_FILE}/${GCC_FILE}.tar.bz2 fi if [ ! -e "${GMP_FILE}.tar.bz2" ]; then wget ftp://ftp.gnu.org/gnu/gmp/${GMP_FILE}.tar.bz2 fi if [ ! -e "${MPFR_FILE}.tar.bz2" ]; then wget http://www.mpfr.org/mpfr-current/${MPFR_FILE}.tar.bz2 fi if [ ! -e "${MPC_FILE}.tar.gz" ]; then wget http://www.multiprecision.org/mpc/download/${MPC_FILE}.tar.gz fi if [ ! -e "${KERNEL_FILE}.tar.bz2" ]; then wget https://www.kernel.org/pub/linux/kernel/v3.x/${KERNEL_FILE}.tar.bz2 fi if [ ! -e "${GLIBC_FILE}.tar.gz" ]; then svn co http://www.eglibc.org/svn/branches/${GLIBC_FILE} ${GLIBC_FILE} tar cvfz ${GLIBC_FILE}.tar.gz ${GLIBC_FILE} fi } unpack() { if [ ! -e "${BINUTILS_FILE}" ]; then tar jxvf ${BINUTILS_FILE}.tar.bz2 fi if [ ! -e "${GCC_FILE}" ]; then tar jxvf ${GCC_FILE}.tar.bz2 fi if [ ! -e "${GMP_FILE}" ]; then tar jxvf ${GMP_FILE}.tar.bz2 fi if [ ! -e "${MPFR_FILE}" ]; then tar jxvf ${MPFR_FILE}.tar.bz2 fi if [ ! -e "${MPC_FILE}" ]; then tar xvfz ${MPC_FILE}.tar.gz fi if [ ! -e "${KERNEL_FILE}" ]; then tar jxvf ${KERNEL_FILE}.tar.bz2 fi if [ ! -e "${GLIBC_FILE}" ]; then tar xvfz ${GLIBC_FILE}.tar.gz fi } mkdirectory() { if [ -e "${CROSS}" ]; then rm -rf ${CROSS} fi mkdir -p ${CROSS} } mkbinutils() { cd ${HOME_DIR}/${BINUTILS_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build ../configure --target=${TARGET} --prefix=${CROSS} --with-sysroot=${ROOTDIR} if [ "$?" -ne 0 ]; then echo "configure ${BINUTILS_FILE} failure." exit 1 fi make if [ "$?" -ne 0 ]; then echo "make ${BINUTILS_FILE} failure." exit 1 fi make install if [ "$?" -ne 0 ]; then echo "make install ${BINUTILS_FILE} failure." exit 1 fi } mkgmp() { cd ${HOME_DIR}/${GMP_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build ../configure --prefix=${CROSS} if [ "$?" -ne 0 ]; then echo "configure ${GMP_FILE} failure." exit 1 fi make if [ "$?" -ne 0 ]; then echo "make ${GMP_FILE} failure." exit 1 fi make install if [ "$?" -ne 0 ]; then echo "make install ${GMP_FILE} failure." exit 1 fi } mkmpfr() { cd ${HOME_DIR}/${MPFR_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build ../configure --prefix=${CROSS} --with-gmp=${CROSS} if [ "$?" -ne 0 ]; then echo "configure ${MPFR_FILE} failure." exit 1 fi make if [ "$?" -ne 0 ]; then echo "make ${MPFR_FILE} failure." exit 1 fi make install if [ "$?" -ne 0 ]; then echo "make install ${MPFR_FILE} failure." exit 1 fi } mkmpc() { cd ${HOME_DIR}/${MPC_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build ../configure --prefix=${CROSS} --with-gmp=${CROSS} --with-mpfr=${CROSS} if [ "$?" -ne 0 ]; then echo "configure ${MPC_FILE} failure." exit 1 fi make if [ "$?" -ne 0 ]; then echo "make ${MPC_FILE} failure." exit 1 fi make install if [ "$?" -ne 0 ]; then echo "make install ${MPC_FILE} failure." exit 1 fi } mkgcc1() { #delete so file of gmp/mpfr/mpc rm -rf ${CROSS}/lib/*.so* rm -rf ${CROSS}/lib/*.la cd ${HOME_DIR}/${GCC_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build ../configure \ --target=${TARGET} \ --prefix=${CROSS} \ --without-headers \ --without-ppl \ --with-newlib \ --disable-shared \ --disable-threads \ --disable-libssp \ --disable-libgomp \ --disable-libmudflap \ --disable-nls \ --with-gmp=${CROSS} \ --with-mpfr=${CROSS} \ --with-mpc=${CROSS} \ --enable-languages=c if [ "$?" -ne 0 ]; then echo "configure ${GCC_FILE} failure. (mkgcc1)" exit 1 fi make if [ "$?" -ne 0 ]; then echo "make ${GCC_FILE} failure.(mkgcc1)" exit 1 fi make install if [ "$?" -ne 0 ]; then echo "make install ${GCC_FILE} failure.(mkgcc1)" exit 1 fi } mkgcc2() { cd ${HOME_DIR}/${GCC_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build ../configure \ --target=${TARGET} \ --prefix=${CROSS} \ --with-sysroot=${ROOTDIR} \ --disable-libssp --disable-libgomp --disable-libmudflap \ --with-gmp=${CROSS} \ --with-mpfr=${CROSS} \ --with-mpc=${CROSS} \ --enable-languages=c if [ "$?" -ne 0 ]; then echo "configure ${GCC_FILE} failure.(mkgcc2)" exit 1 fi make if [ "$?" -ne 0 ]; then echo "make ${GCC_FILE} failure.(mkgcc2)" exit 1 fi make install if [ "$?" -ne 0 ]; then echo "make install ${GCC_FILE} failure.(mkgcc2)" exit 1 fi } mkgcc3() { cd ${HOME_DIR}/${GCC_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build ../configure \ --target=${TARGET} \ --prefix=${CROSS} \ --with-sysroot=${ROOTDIR} \ --disable-libssp --disable-libgomp --disable-libmudflap \ --with-gmp=${CROSS} \ --with-mpfr=${CROSS} \ --with-mpc=${CROSS} \ --enable-languages=c,c++ if [ "$?" -ne 0 ]; then echo "configure ${GCC_FILE} failure.(mkgcc3)" exit 1 fi make if [ "$?" -ne 0 ]; then echo "make ${GCC_FILE} failure.(mkgcc3)" exit 1 fi make install if [ "$?" -ne 0 ]; then echo "make install ${GCC_FILE} failure.(mkgcc3)" exit 1 fi } mk_kernel_header() { cd ${HOME_DIR}/${KERNEL_FILE} make mrproper make headers_install ARCH=arm CROSS_COMPILE=${TARGET}- INSTALL_HDR_PATH=${ROOTDIR}/usr if [ "$?" -ne 0 ]; then echo "install headers ${KERNEL_FILE} failure." exit 1 fi } mkglibc_header() { cd ${HOME_DIR}/${GLIBC_FILE} cp -r ports libc if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build BUILD_CC=gcc \ CC=${TARGET}-gcc \ CXX=${TARGET}-g++ \ AR=${TARGET}-ar \ RANLIB=${TARGET}-ranlib \ ../libc/configure \ --prefix=/usr \ --with-headers=${ROOTDIR}/usr/include \ --host=${TARGET} \ --disable-profile \ --without-gd \ --without-cvs \ --enable-add-ons if [ "$?" -ne 0 ]; then echo "configure glibc header ${GLIBC_FILE} failure." exit 1 fi make install-headers install_root=${ROOTDIR} install-bootstrap-headers=yes if [ "$?" -ne 0 ]; then echo "install glibc header ${GLIBC_FILE} failure." exit 1 fi make csu/subdir_lib if [ "$?" -ne 0 ]; then echo "make scu/subdir ${GLIBC_FILE} failure." exit 1 fi mkdir -p ${ROOTDIR}/usr/lib cp csu/crt1.o csu/crti.o csu/crtn.o ${ROOTDIR}/usr/lib ${TARGET}-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o ${ROOTDIR}/usr/lib/libc.so if [ "$?" -ne 0 ]; then echo "make libc.so ${GLIBC_FILE} failure." exit 1 fi } mkglibc() { cd ${HOME_DIR}/${GLIBC_FILE} if [ -e "build" ]; then rm -rf build fi mkdir -p build cd build BUILD_CC=gcc \ CC=${TARGET}-gcc \ CXX=${TARGET}-g++ \ AR=${TARGET}-ar \ RANLIB=${TARGET}-ranlib \ ../libc/configure \ --prefix=/usr \ --with-headers=${ROOTDIR}/usr/include \ --host=${TARGET} \ --disable-profile \ --without-gd \ --without-cvs \ --enable-add-ons if [ "$?" -ne 0 ]; then echo "configure glibc ${GLIBC_FILE} failure." exit 1 fi make if [ "$?" -ne 0 ]; then echo "make glibc ${GLIBC_FILE} failure." exit 1 fi make install install_root=${ROOTDIR} if [ "$?" -ne 0 ]; then echo "install glibc ${GLIBC_FILE} failure." exit 1 fi } cleanup mkdirectory download_files unpack mkbinutils mkgmp mkmpfr mkmpc mkgcc1 mk_kernel_header mkglibc_header mkgcc2 mkglibc mkgcc3 echo "done." exit 0