keropoの備忘録

しらべたことをメモるブログ

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