1313 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			1313 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/bash
 | |
| ########################################################################
 | |
| # build-avr-gnu-toolchain.sh
 | |
| #
 | |
| # This script builds the GNU toolchain for the AVR target.
 | |
| #
 | |
| # Copyright (C) 2006-2010 Atmel Corporation
 | |
| #
 | |
| # This script is free software; you can redistribute it and/or modify
 | |
| # it under the terms of the GNU Lesser General Public License as published by
 | |
| # the Free Software Foundation version 2.1.
 | |
| #
 | |
| # This script is distributed in the hope that it will be useful,
 | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| # GNU Lesser General Public License for more details.
 | |
| #
 | |
| # You should have received a copy of the GNU Lesser General Public License
 | |
| # along with this script; if not, write to the Free Software
 | |
| # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | |
| #
 | |
| ########################################################################
 | |
| #
 | |
| # $Id: build-avr8-gnu-toolchain.sh 119628 2012-08-03 10:12:23Z vidhya.praveen $
 | |
| #
 | |
| ########################################################################
 | |
| 
 | |
| usage="\
 | |
| Usage: `basename $0` [OPTIONS] <package...>
 | |
| 
 | |
| This script builds the GNU toolchain for the AVR target.
 | |
| 
 | |
| Packages can be given as arguments. The order they are given defines the
 | |
| build order. Use option '-l' to list default packages.
 | |
| 
 | |
| The script build the tools in the 'build' folder based on the sources in the
 | |
| 'source' folder. The tools are installed in the 'prefix' folder.
 | |
| Default 'build' folder is a '<current>/build'. Change it with option '-b <folder>'.
 | |
| Default 'source' folder is '<current>'. Change it with option 's <folder>'.
 | |
| Default 'prefix' folder is '/usr/local'. Change it by setting enviroment 'AVR_PREFIX',
 | |
|                                          or use option '-p <prefix>'.
 | |
| 
 | |
| Options:
 | |
|   -b <folder>           Defines build folder
 | |
|   -h                    Prints this help message
 | |
|   -k                    Keep old build folder
 | |
|   -l                    Lists default packages
 | |
|   -p <prefix>           Sets the installation prefix
 | |
|   -P <password>			The password for executing sudo command
 | |
|   -s <folder>           Defines source folder
 | |
| 
 | |
|   -B <target>           sets build platform for 'configure'
 | |
|   -H <target>           sets host platform for 'configure'
 | |
| 
 | |
| Enviroment:
 | |
|   AVR_PREFIX            Installation prefix
 | |
|   AVR_8_GNU_TOOLCHAIN_VERSION     Gives the version number of the toochain
 | |
|   BUILD_NUMBER          Adds a build number to the version string if set"
 | |
| 
 | |
| ######## General helper functions ###############################
 | |
| function task_start () {
 | |
|     printf "%-52s" "$1"
 | |
| }
 | |
| 
 | |
| function task_success () {
 | |
|     echo OK
 | |
| }
 | |
| 
 | |
| function task_error () {
 | |
|     echo FAILED
 | |
|     echo $1
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| function wipe_directory () {
 | |
|     if [ -e "$1" ]; then
 | |
|         task_start "Wiping $1 ($2)... "
 | |
|         rm -rf "$1" && task_success || task_error
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function do_make () {
 | |
|     make $MAKEOPTS > make.out 2>&1 || task_error "$1"
 | |
| }
 | |
| 
 | |
| function do_make_install () {
 | |
|     if test -z ${SUDO_PASSWORD}
 | |
|     then
 | |
|         make install > make.install.out 2>&1 || task_error "$1"
 | |
|     else
 | |
|         echo ${SUDO_PASSWORD}| sudo -S -E PATH=${PATH}:${PREFIX}/bin \
 | |
|         make install > make.install.out 2>&1 || task_error "$1"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function do_pushd () {
 | |
|     pushd $1 > /dev/null
 | |
| }
 | |
| 
 | |
| function do_popd () {
 | |
|     popd $1 > /dev/null
 | |
| }
 | |
| 
 | |
| function do_mkpushd () {
 | |
|     mkdir -p $1
 | |
|     do_pushd $1
 | |
| }
 | |
| 
 | |
| function start_timer () {
 | |
|     begin_time=`date +%s`
 | |
| }
 | |
| 
 | |
| function end_timer () {
 | |
|     end_time=`date +%s`
 | |
| }
 | |
| 
 | |
| function report_time() {
 | |
|     elapsed=$[$end_time - $begin_time]
 | |
|     hours=$[$elapsed/3600]
 | |
|     mins=$[($elapsed%3600)/60]
 | |
|     secs=$[$elapsed%60]
 | |
|     echo "Finished at `date`"
 | |
|     echo "Task completed in $hours hours, $mins minutes and $secs seconds."
 | |
| }
 | |
| 
 | |
| ######## Functions for avr gnu toolchain ###############################
 | |
| function remove_build_folder()
 | |
| {
 | |
|     # arg1 = the package subfolder in builddir
 | |
|     if test -d ${builddir}/$1 -a ${KEEP_BUILD_FOLDER} != "YES" ; then
 | |
|         rm -rf ${builddir}/$1 || task_error "Could not remove $1 build folder."
 | |
|     fi
 | |
| }
 | |
| 
 | |
| 
 | |
| #Tries to set platform types
 | |
| # $1 = package
 | |
| function set_platform_variables()
 | |
| {
 | |
|     build_platform=${srcdir}/${1}/config.guess
 | |
|     if test -z ${host_platform}; then
 | |
|         host_platform=${build_platform}
 | |
|     fi
 | |
| }
 | |
| 
 | |
| 
 | |
| function unpack_upstream_source()
 | |
| {
 | |
|     local workdir=$1
 | |
|     local archive_name=$2
 | |
|     local archive_tar_flag=""
 | |
| 
 | |
|     case $archive_name in
 | |
|         *.tar.gz|*.tgz)
 | |
|             archive_tar_flag='--gzip';;
 | |
|         *.tar.bz2|*.tbz2)
 | |
|             archive_tar_flag='--bzip2';;
 | |
|         *.tar)
 | |
|             archive_tar_flag="";;
 | |
|         *)
 | |
|             task_error "Unknown archive format."
 | |
|     esac
 | |
| 
 | |
|     if ! tar --directory ${workdir} ${archive_tar_flag} -x -f ${archive_name}; then
 | |
|         task_error "Corrupt file ${archive_name}"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| 
 | |
| function apply_patches()
 | |
| {
 | |
|     local workdir=$1
 | |
|     local archivedir=$2
 | |
| 
 | |
|     do_pushd ${workdir}
 | |
| 
 | |
|         # Patch Categories
 | |
|         #    0x = Distribution specific (distro names and versions)
 | |
|         #    1x = Host platform specific
 | |
|         #    2x = Build system specific
 | |
|         #    3x = New target features
 | |
|         #    4x = Patches to fix target bugs
 | |
|         #    5x = New devices
 | |
| 
 | |
|     if test -z "$(ls ${archivedir}/*.patch)"; then
 | |
|         echo "No patch files, skipping patch"
 | |
|         do_popd
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     for i in ${archivedir}/*.patch ; do
 | |
|         echo "Patch: $i" >> patch.log
 | |
|         patch --verbose --strip=0 --input="$i"  >> patch.log || task_error "Patching failed."
 | |
|     done
 | |
|     do_popd
 | |
| }
 | |
| 
 | |
| 
 | |
| ############ Define functions used for the different tasks ########
 | |
| function set_binutils_parameters()
 | |
| {
 | |
|     if test -f "${srcdir}/binutils/bfd/ATMEL-VER"; then
 | |
|         read binutils_version_atmel < ${srcdir}/binutils/bfd/ATMEL-VER
 | |
|     else
 | |
|         binutils_version_atmel="atmel-$(date +%Y%m%d%H%M%Z)"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function binutils_prep()
 | |
| {
 | |
|     if test -f ${srcdir}/binutils/.prep_done
 | |
|     then
 | |
|         set_binutils_parameters
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     task_start "Preparing Binutils... "
 | |
|     if [ ! -d ${srcdir}/binutils-*-patches ] ; then
 | |
|         echo "Can't find binutils source."
 | |
|         exit 1
 | |
|     fi
 | |
|     do_pushd ${srcdir}
 | |
|     rm -rf binutils binutils-[0-9]\.[0-9][0-9]* || task_error "Removing old binutils folders failed"
 | |
|     upstream_source=$(ls ./binutils-*-patches/binutils-*.*)
 | |
|     unpack_upstream_source ${srcdir} ${upstream_source}
 | |
| 
 | |
|     # Link the unpacked folder to a generic folder for future work.
 | |
|     ln -s $(ls -d binutils-[0-9]\.[0-9][0-9]*)  binutils || task_error "Error linking binutils folder"
 | |
| 
 | |
|     # Apply patches to source.
 | |
|     apply_patches ${srcdir}/binutils $(ls -d ${srcdir}/binutils-*-patches)
 | |
| 
 | |
|     # Prepare for configuration.
 | |
|     if [ ! -d ${srcdir}/binutils ] ; then
 | |
|         echo "Can't find binutils source."
 | |
|         exit 1
 | |
|     fi
 | |
| 
 | |
|     set_binutils_parameters
 | |
|     cd binutils
 | |
| 
 | |
|     # Some sed magic to make autotools work on platforms with different autotools version
 | |
|     # Works for binutils 2.20.1. May work for other versions.
 | |
|     sed -i 's/AC_PREREQ(2.64)/AC_PREREQ(2.63)/g' ./configure.ac || task_error "sed failed"
 | |
|     sed -i 's/AC_PREREQ(2.64)/AC_PREREQ(2.63)/g' ./libiberty/configure.ac || task_error "sed failed"
 | |
|     sed -i 's/  \[m4_fatal(\[Please use exactly Autoconf \]/  \[m4_errprintn(\[Please use exactly Autoconf \]/g' ./config/override.m4 || task_error "sed failed"
 | |
| 
 | |
|     # This one is necessary for 2.21 (but not for 2.21.2
 | |
|     sed -i 's/\@include gnu-oids.texi//' ./etc/standards.texi
 | |
| 
 | |
|     autoconf || task_error "autoconf failed"
 | |
|     for d in ld ; do
 | |
|         do_pushd ${d}
 | |
|         autoreconf	 || task_error "autoreconf in $d failed."
 | |
|         do_popd
 | |
|     done
 | |
| 
 | |
|     do_popd
 | |
|     task_success
 | |
|     touch ${srcdir}/binutils/.prep_done
 | |
| }
 | |
| 
 | |
| 
 | |
| function binutils_build()
 | |
| {
 | |
|     local binutils_target=${1}
 | |
|     local binutils_extra_opts=""
 | |
|     local binutils_doc_opts=""
 | |
|     local binutils_extra_config=""
 | |
| 
 | |
|     task_start "Building Binutils for ${binutils_target}... "
 | |
|     remove_build_folder "${binutils_target}-binutils"
 | |
|     OLD_MAKEOPTS=$MAKEOPTS
 | |
|     MAKEOPTS=""
 | |
|     do_mkpushd ${builddir}/${binutils_target}-binutils
 | |
|     case "${host_platform}" in
 | |
|     i[3456]86*-linux*)
 | |
|         binutils_extra_config="LDFLAGS=-all-static"
 | |
|         ;;
 | |
|     x86_64*-linux*)
 | |
|         binutils_extra_config="LDFLAGS=-all-static"
 | |
|         ;;
 | |
|     i[3456789]86*-mingw32*)
 | |
|         binutils_extra_config=""
 | |
|         ;;
 | |
|     *)
 | |
|         binutils_extra_config=""
 | |
|     esac
 | |
| 
 | |
|     # Configure.
 | |
|     ${srcdir}/binutils/configure \
 | |
|         --target=${binutils_target} \
 | |
|         --host=${host_platform} \
 | |
|         --build=${build_platform} \
 | |
|         --prefix=$PREFIX \
 | |
|         --with-pkgversion="AVR_8_bit_GNU_Toolchain_${avr_8_gnu_toolchain_version}_${BUILD_NUMBER}" \
 | |
|         --with-bugurl="http://www.atmel.com" \
 | |
|         --disable-nls \
 | |
|         --enable-doc \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --infodir=${PREFIX}/info \
 | |
|         --mandir=${PREFIX}/man \
 | |
|         --docdir=${PREFIX}/doc/binutils \
 | |
|         --disable-werror \
 | |
|         --enable-install-libiberty \
 | |
|         --enable-install-libbfd \
 | |
|         > configure.out 2>&1 || task_error "configure failed. See configure.out."
 | |
| 
 | |
|     MAKEOPTS="all-bfd TARGET-bfd=headers"
 | |
|     do_make "make bfd headers failed. See make.out."
 | |
| 
 | |
|     # Force reconfiguring.
 | |
|     rm bfd/Makefile || task_error "Can't remove bfd/Makefile"
 | |
|     MAKEOPTS=""
 | |
| 
 | |
|     # Build.
 | |
|     make configure-host >> make.out 2>&1 || task_error "make configure-host failed. See make.out"
 | |
|     make ${binutils_extra_config} all html >> make.out 2>&1 || task_error "make failed. See make.out."
 | |
|     task_success
 | |
| 
 | |
|     # Install.
 | |
|     task_start "Installing binutils for ${binutils_target}... "
 | |
|     #do_make_install "make install failed. See make.install.out."
 | |
|     # Do not call do_make_install() as binutils needs extra make targets.
 | |
|     if test -z ${SUDO_PASSWORD}
 | |
|     then
 | |
|         make install install-html > make.install.out 2>&1 || task_error "make install failed. See make.install.out."
 | |
|     else
 | |
|         echo ${SUDO_PASSWORD}| sudo -S -E PATH=${PATH}:${PREFIX}/bin \
 | |
|         make install install-html > make.install.out 2>&1 || task_error "make install failed. See make.install.out."
 | |
|     fi
 | |
| 
 | |
|     do_popd
 | |
|     MAKEOPTS=$OLD_MAKEOPTS
 | |
| 
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| 
 | |
| function set_gcc_parameters()
 | |
| {
 | |
|     if test -f "${srcdir}/gcc/gcc/BASE-VER"; then
 | |
|         gcc_version_base=$(cat ${srcdir}/gcc/gcc/BASE-VER)
 | |
|         case ${gcc_version_base} in
 | |
|                4.[3456].*)
 | |
|                 read gcc_version_atmel < ${srcdir}/gcc/gcc/ATMEL-VER
 | |
|                 ;;
 | |
|                4.[12].*)
 | |
|                 # GCC 4.1.x or 4.2.x
 | |
|                       gcc_version_atmel=`grep -E "define[[:space:]]{1,}VERSUFFIX" "${srcdir}/gcc/gcc/version.c" | sed -e 's/.*"\([^"]*\)".*/\1/'`
 | |
| 
 | |
|                 # Add some version specific info for certain platforms
 | |
|                 case ${host_platform} in
 | |
|                     i68[3456]-*mingw32 )
 | |
|                         sed 's/\(.*VERSUFFIX "\)\([^"]*\)/\1\2 (mingw32 special)/' ${srcdir}/gcc/gcc/version.c > ${srcdir}/gcc/gcc/version.c.new \
 | |
|                             || task_error "error adding '(mingw32 special)' to gcc/version.c"
 | |
|                         mv -f ${srcdir}/gcc/gcc/version.c.new ${srcdir}/gcc/gcc/version.c || task_error "error renaming gcc/version.c"
 | |
|                         ;;
 | |
|                     i68[3456]-*mingw64 )
 | |
|                         sed 's/\(.*VERSUFFIX "\)\([^"]*\)/\1\2 (mingw64 special)/' ${srcdir}/gcc/gcc/version.c > ${srcdir}/gcc/gcc/version.c.new \
 | |
|                              || task_error "error adding '(mingw64 special)' to gcc/version.c"
 | |
|                         mv -f ${srcdir}/gcc/gcc/version.c.new ${srcdir}/gcc/gcc/version.c || task_error "error renaming gcc/version.c"
 | |
|                         ;;
 | |
|                     * )
 | |
|                         ;;
 | |
|                 esac
 | |
|                 ;;
 | |
|             4.0.*)
 | |
|                 # GCC 4.0.x
 | |
|                       gcc_version_atmel=`grep version_string "gcc/version.c" | sed -e 's/.*"\([^"]*\)".*/\1/'`
 | |
|                 # Add some version specific info for certain platforms
 | |
|                 case ${host_platform} in
 | |
|                     i68[3456]-*mingw32 )
 | |
|                         sed 's/\(.*VERSUFFIX "\)\([^"]*\)/\1\2 (mingw32 special)/' ${srcdir}/gcc/gcc/version.c > ${srcdir}/gcc/gcc/version.c.new \
 | |
|                             || task_error "error adding '(mingw32 special)' to gcc/version.c"
 | |
|                         mv -f ${srcdir}/gcc/gcc/version.c.new ${srcdir}/gcc/gcc/version.c || task_error "error renaming gcc/version.c"
 | |
|                         ;;
 | |
|                     i68[3456]-*mingw64 )
 | |
|                         sed 's/\(.*VERSUFFIX "\)\([^"]*\)/\1\2 (mingw64 special)/' ${srcdir}/gcc/gcc/version.c > ${srcdir}/gcc/gcc/version.c.new \
 | |
|                              || task_error "error adding '(mingw64 special)' to gcc/version.c"
 | |
|                         mv -f ${srcdir}/gcc/gcc/version.c.new ${srcdir}/gcc/gcc/version.c || task_error "error renaming gcc/version.c"
 | |
|                         ;;
 | |
|                     * )
 | |
|                         ;;
 | |
|                 esac
 | |
|                 ;;
 | |
|             *)
 | |
|             echo "unsupported GCC Version ${gcc_version_base}"
 | |
|             exit 1
 | |
|             ;;
 | |
|         esac
 | |
|     else
 | |
|         # Cant't get gcc version, just set something usefull.
 | |
|         gcc_version_base="4.3.2"
 | |
|           gcc_version_atmel="atmel-$(date +%Y%m%d%H%M%Z)"
 | |
|     fi
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| function gcc_prep()
 | |
| {
 | |
|     if test -f ${srcdir}/gcc/.prep_done
 | |
|     then
 | |
|         set_gcc_parameters
 | |
|         return
 | |
|     fi
 | |
| 
 | |
| 
 | |
|     task_start "Preparing GCC... "
 | |
|     do_pushd ${srcdir}
 | |
| 
 | |
|     rm -rf gcc gcc-[0-9]\.[0-9]\.[0-9] || task_error "Removing old gcc folders failed"
 | |
| 
 | |
|     upstream_source=$(ls ${srcdir}/gcc-*-patches/gcc-*.*.*)
 | |
| 
 | |
|     unpack_upstream_source ${srcdir} ${upstream_source}
 | |
| 
 | |
|     # Link the unpacked folder to a generic folder for futhure work
 | |
|     ln -s $(ls -d gcc-[0-9]\.[0-9]\.[0-9])  gcc || task_error "Error linking gcc folder"
 | |
|     apply_patches ${srcdir}/gcc $(ls -d ${srcdir}/gcc-*-patches)
 | |
| 
 | |
|     # Prepare for configuration.
 | |
|     if [ ! -d ${srcdir}/gcc ] ; then
 | |
|         echo "Can't find gcc source."
 | |
|         exit 1
 | |
|     fi
 | |
|     set_gcc_parameters
 | |
| 
 | |
|     cd gcc
 | |
|     case ${gcc_version_base} in
 | |
|          4.[3456].*)
 | |
|             # Some sed magic to make autotools work on platforms with different autotools version
 | |
|             sed -i 's/m4_copy(\[AC_PREREQ\]/m4_copy_force(\[AC_PREREQ\]/g' ./config/override.m4 || task_error "sed failed"
 | |
|             sed -i 's/m4_copy(\[_AC_PREREQ\]/m4_copy_force(\[_AC_PREREQ\]/g' ./config/override.m4 || task_error "sed failed"
 | |
|             sed -i 's/  \[m4_fatal(\[Please use exactly Autoconf \]/  \[m4_errprintn(\[Please use exactly Autoconf \]/g' ./config/override.m4 || task_error "sed failed"
 | |
|             autoconf || task_error "autoconf failed"
 | |
|             # Running autoreconf in libstdc++ does not seem to be necessary in 4.3.x
 | |
|             # and it causes some problems on platform with auto-tool >2.61
 | |
|             ;;
 | |
|          4.[012].*)
 | |
|             ${AUTOCONF213_EXE} || task_error "autoconf failed"
 | |
|             # TODO: Check if this autoreconf is necessary?
 | |
|             # I do not remember why we have to do this in libstdc++
 | |
|             # Its here because it has "always" been here.
 | |
|             do_pushd libstdc++-v3
 | |
|             autoreconf || task_error "libstdc++-v3 autoreconf failed"
 | |
|             do_popd
 | |
|             ;;
 | |
|         *)
 | |
|             echo "Unsupported GCC version ${gcc_version_base}"
 | |
|             exit 1
 | |
|             ;;
 | |
|     esac
 | |
| 
 | |
|     do_popd
 | |
|     task_success
 | |
|     touch ${srcdir}/gcc/.prep_done
 | |
| }
 | |
| 
 | |
| 
 | |
| # First step building GCC.
 | |
| # arg1 = target
 | |
| function gcc_build_bootstrap()
 | |
| {
 | |
|     local gcc_target=${1}
 | |
|     local gcc_extra_opts=""
 | |
|     local gcc_doc_opts=""
 | |
|     local gcc_extra_config=""
 | |
|     local gcc_ldflags=""
 | |
|     local gcc_cppflags=""
 | |
| 
 | |
|     task_start "Building bootstrap GCC for ${gcc_target}... "
 | |
|     remove_build_folder "${gcc_target}-gcc-bootstrap"
 | |
|     OLD_MAKEOPTS=$MAKEOPTS
 | |
|     MAKEOPTS=""
 | |
|     do_mkpushd ${builddir}/${gcc_target}-gcc-bootstrap
 | |
| 
 | |
|     # Are we doing a canadian cross?
 | |
|     if ${canadian_cross}; then
 | |
|         gcc_extra_opts=""
 | |
|     else
 | |
|         gcc_extra_opts=""
 | |
|     fi
 | |
| 
 | |
|     case ${gcc_version_base} in
 | |
|          4.[3456].*)
 | |
|         gcc_extra_opts="${gcc_extra_opts} \
 | |
|                    --with-pkgversion="AVR_Toolchain_3.0_$(date +%Y%m%d%H%M)" \
 | |
|                    --with-bugurl="http://www.atmel.com"
 | |
|                   "
 | |
|         ;;
 | |
| 
 | |
|          *)
 | |
|          # Do nothing
 | |
|          ;;
 | |
|     esac
 | |
| 
 | |
|     gcc_ldflags="-L${PREFIX}/${LIB_DIR}"
 | |
| 
 | |
|     # Configure.
 | |
|     ${srcdir}/gcc/configure \
 | |
|         "LDFLAGS=${gcc_ldflags}" "CPPFLAGS=${gcc_cppflags}" \
 | |
|         --target=${gcc_target} \
 | |
|         --host=${host_platform} \
 | |
|         --build=${build_platform} \
 | |
|         --prefix=${PREFIX} \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --enable-languages="c" \
 | |
|         ${gcc_extra_opts} \
 | |
|         --with-dwarf2 \
 | |
|         --enable-doc \
 | |
|         --disable-shared \
 | |
|         --disable-libada \
 | |
|         --disable-libssp \
 | |
|         --disable-nls \
 | |
|         --with-mpfr=${PREFIX} \
 | |
|         --with-gmp=${PREFIX} \
 | |
|         --with-mpc=${PREFIX} \
 | |
|         > configure.out 2>&1 || task_error "configure failed. See configure.out."
 | |
| 
 | |
|     # Build.
 | |
|     do_make "Building failed. See make.out."
 | |
|     task_success
 | |
| 
 | |
|     # Install.
 | |
|     task_start "Installing bootstrap GCC for ${gcc_target}... "
 | |
|     do_make_install "Installing failed. See make.install.out."
 | |
| 
 | |
|     do_popd
 | |
|     MAKEOPTS=$OLD_MAKEOPTS
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| 
 | |
| # Build GCC again, after avr-libc has been built.
 | |
| # arg1 = target
 | |
| function gcc_build_full()
 | |
| {
 | |
|     local gcc_target=${1}
 | |
|     local gcc_extra_opts=""
 | |
|     local gcc_doc_opts=""
 | |
|     local gcc_extra_config=""
 | |
|     local gcc_ldflags=""
 | |
|     local gcc_cppflags=""
 | |
| 
 | |
|     task_start "Building full GCC for $1... "
 | |
|     remove_build_folder "${1}-gcc-full"
 | |
|     OLD_MAKEOPTS=$MAKEOPTS
 | |
|     MAKEOPTS=""
 | |
|     do_mkpushd ${builddir}/${1}-gcc-full
 | |
|     # Are we doing a canadian cross?
 | |
|     if ${canadian_cross}; then
 | |
|         case ${host_platform} in
 | |
|             i68[3456]-*mingw32 )
 | |
|                 gcc_extra_opts="--enable-win32-registry=avrtoolchain"
 | |
|                 #export LDFLAGS="-L ${PREFIX}/lib"
 | |
|                 #export CPPFLAGS="-I ${PREFIX}/include"
 | |
| 
 | |
|                 ;;
 | |
|             * )
 | |
|                 gcc_extra_opts=""
 | |
|                 ;;
 | |
|         esac
 | |
|     fi
 | |
| 
 | |
|     case ${gcc_version_base} in
 | |
|         4.[456].*)
 | |
|             gcc_extra_opts="${gcc_extra_opts} \
 | |
|                 --enable-fixed-point
 | |
|             "
 | |
|             gcc_extra_opts="${gcc_extra_opts} \
 | |
|                    --with-pkgversion="AVR_8_bit_GNU_Toolchain_${avr_8_gnu_toolchain_version}_${BUILD_NUMBER}" \
 | |
|                    --with-bugurl="http://www.atmel.com"
 | |
|                   "
 | |
|         ;;
 | |
|         4.[3].*)
 | |
|             gcc_extra_opts="${gcc_extra_opts} \
 | |
|                    --with-pkgversion="AVR_8_bit_GNU_Toolchain_${avr_8_gnu_toolchain_version}_${BUILD_NUMBER}" \
 | |
|                    --with-bugurl="http://www.atmel.com"
 | |
|                   "
 | |
|         ;;
 | |
| 
 | |
|          *)
 | |
|          # Do nothing
 | |
|          ;;
 | |
|     esac
 | |
| 
 | |
|     # Make sure we always include the correct library folder when linking
 | |
|     gcc_ldflags="-L${PREFIX}/${LIB_DIR}"
 | |
| 
 | |
|     # Add extra configs to be used when running make
 | |
|     case "${host_platform}" in
 | |
|         i[3456]86*-linux*)
 | |
|             gcc_extra_config="LDFLAGS=-static"
 | |
| 
 | |
|             ;;
 | |
|         x86_64*-linux*)
 | |
|             gcc_extra_config="LDFLAGS=-static"
 | |
|             ;;
 | |
|         i[3456789]86*-mingw32*)
 | |
|             gcc_extra_config=""
 | |
| #	Commented out by pablaasmo due to problemes setting docdir for GCC 4.4.x
 | |
| #            gcc_doc_opts="--infodir=${PREFIX}/info \
 | |
| #                     --mandir=${PREFIX}/man \
 | |
| #                     --docdir=${PREFIX}/doc/gcc/${gcc_version_base}"
 | |
|             ;;
 | |
|         *)
 | |
|             gcc_extra_config=""
 | |
|     esac
 | |
| 
 | |
|     # Configure.
 | |
|     ${srcdir}/gcc/configure \
 | |
|         "LDFLAGS=${gcc_ldflags}" "CPPFLAGS=${gcc_cppflags}" \
 | |
|         --target=$1 \
 | |
|         --host=${host_platform} \
 | |
|         --build=${build_platform} \
 | |
|         --prefix=${PREFIX} \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --enable-languages="c,c++" \
 | |
|         --with-dwarf2 \
 | |
|         --enable-doc \
 | |
|         --disable-shared \
 | |
|         --disable-libada \
 | |
|         --disable-libssp \
 | |
|         --disable-nls \
 | |
|         --with-mpfr=${PREFIX} \
 | |
|         --with-gmp=${PREFIX} \
 | |
|         --with-mpc=${PREFIX} \
 | |
|         ${gcc_extra_opts} \
 | |
|         ${gcc_doc_opts} \
 | |
|         > configure.out 2>&1 || task_error "configure failed. See configure.out."
 | |
| 
 | |
|     # Build.
 | |
|     make ${gcc_extra_config} all html >> make.out 2>&1 || task_error "make failed. See make.out."
 | |
|     task_success
 | |
| 
 | |
|     # Install.
 | |
|     task_start "Installing full GCC for $1..."
 | |
|     #do_make_install "make install failed. See make.install.out."
 | |
|     # Do not call do_make_install() as gcc needs extra make targets.
 | |
|     if test -z ${SUDO_PASSWORD}
 | |
|     then
 | |
|         make install install-html > make.install.out 2>&1 || task_error "make install failed. See make.install.out."
 | |
|     else
 | |
|         echo ${SUDO_PASSWORD}| sudo -S -E PATH=${PATH}:${PREFIX}/bin \
 | |
|         make install install-html > make.install.out 2>&1 || task_error "make install failed. See make.install.out."
 | |
|     fi
 | |
| 
 | |
|     do_popd
 | |
|     MAKEOPTS=$OLD_MAKEOPTS
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| function prep_headers () {
 | |
|     task_start "Preparing Headers..."
 | |
| 
 | |
|     # Checking if headers exist. Error is it does not
 | |
| 
 | |
|     HEADER=$(ls -1 ${srcdir}/headers/ | tail -n 1)
 | |
|     if test -z "$HEADER"
 | |
|     then
 | |
|       echo "No file present in the directory"
 | |
|       exit 1
 | |
|     fi
 | |
| 
 | |
|     # Unzipping the latest header in the
 | |
|     unzip -o ${srcdir}/headers/$HEADER -d ${srcdir}/avr-headers-latest/
 | |
| 
 | |
|     # Copying non public header files to the avr location.
 | |
|     for i in `find ${srcdir}/avr-headers-latest/avr/nonpublic -name *.h`
 | |
|     do
 | |
|       cp $i ${srcdir}/avr-headers-latest/avr/ -v
 | |
|     done
 | |
| 
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| function replace_avr_headers()
 | |
| {
 | |
|     avr_headers_dir=$1
 | |
|     avr_libc_srcdir=$2
 | |
|     for i in ${avr_headers_dir}/avr/io[0-9a-zA-Z]*.h
 | |
|     do
 | |
|       # Copy the avr-headers generated header files but do not replace legacy headers
 | |
|       # header_name=`basename $i`
 | |
|       # if ! test -a ${avr_libc_srcdir}/include/avr/$header_name; then
 | |
|         cp --verbose --force $i ${avr_libc_srcdir}/include/avr/ || task_error "Replacing avr-libc headers with avr-headers"
 | |
|       # else
 | |
|       #  echo "skipping: $header_name"
 | |
|       # fi
 | |
|     done
 | |
| }
 | |
| 
 | |
| function avr_libc_prep()
 | |
| {
 | |
|     if test -f ${srcdir}/avr-libc/.prep_done
 | |
|     then
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     task_start "Preparing avr-libc... "
 | |
|     do_pushd ${srcdir}
 | |
| 
 | |
| 
 | |
|     rm -rf avr-libc avr-libc-[0-9]\.[0-9]*\.[0-9] || task_error "Removing old avr-libc folders failed"
 | |
| 
 | |
|     upstream_source=$(ls ${srcdir}/avr-libc-*-patches/avr-libc-*.*.*)
 | |
| 
 | |
|     unpack_upstream_source ${srcdir} ${upstream_source}
 | |
| 
 | |
|     # Link the unpacked folder to a generic folder for futhure work
 | |
|     ln -s $(ls -d avr-libc-[0-9]\.[0-9]*\.[0-9])  avr-libc || task_error "Error linking avr-libc folder"
 | |
|     apply_patches ${srcdir}/avr-libc $(ls -d ${srcdir}/avr-libc-*-patches)
 | |
| 
 | |
|     if [ ! -d ${srcdir}/avr-libc ] ; then
 | |
|         echo "Can't find avr-libc source."
 | |
|         exit 1
 | |
|     fi
 | |
| 
 | |
|     # Prepare the headers before replacing
 | |
|     prep_headers
 | |
|     # Replace the AVR-libc headers with the header files from avr-headers
 | |
|     replace_avr_headers ${srcdir}/avr-headers-latest ${srcdir}/avr-libc
 | |
| 
 | |
|     # Run the bootstrap script.
 | |
|     cd ${srcdir}/avr-libc
 | |
|     ./bootstrap > preparation.out 2>&1
 | |
| 
 | |
|     do_popd
 | |
|     task_success
 | |
|     touch ${srcdir}/avr-libc/.prep_done
 | |
| }
 | |
| 
 | |
| 
 | |
| function avr_libc_build()
 | |
| {
 | |
|     task_start "Building avr-libc ... "
 | |
|     remove_build_folder "avr-libc"
 | |
|     OLD_MAKEOPTS=$MAKEOPTS
 | |
|     MAKEOPTS=""
 | |
|     do_mkpushd ${builddir}/avr-libc
 | |
| 
 | |
|     ${srcdir}/avr-libc/configure \
 | |
|         --host=avr \
 | |
|         --prefix="$PREFIX" \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --enable-doc \
 | |
|         --disable-versioned-doc \
 | |
|         --enable-html-doc \
 | |
|         --enable-pdf-doc \
 | |
|         --enable-man-doc \
 | |
|         --mandir="$PREFIX"/man \
 | |
|         --datadir="$PREFIX" \
 | |
|         > configure.out 2>&1 || \
 | |
|         task_error "configure failed. See configure.out"
 | |
| 
 | |
|     make >make.out 2>&1 || task_error "Building failed. See make.out."
 | |
|     task_success
 | |
| 
 | |
|     # Installing.
 | |
|     task_start "Installing avr-libc ... "
 | |
|     make install >make-install.out 2>&1 || task_error "Installing avr-libc failed. See make.install.out."
 | |
| 
 | |
|     # todo: Convert line endings in examples, if host=mingw.
 | |
|     # find $installdir/doc/avr-libc/examples -name '*.*' -print -exec $startdir/utils/bin/todos -o '{}' ';'
 | |
| 
 | |
| 
 | |
|     # todo: Move man pages.
 | |
|     # cp -rf "$PREFIX"/doc/avr-libc/man "$PREFIX"/man
 | |
|     # rm -rf "$PREFIX"/doc/avr-libc/man
 | |
| 
 | |
| 
 | |
|     do_popd
 | |
|     MAKEOPTS=$OLD_MAKEOPTS
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| 
 | |
| function set_gdb_parameters()
 | |
| {
 | |
|     if test -f "${srcdir}/gdb/bfd/ATMEL-VER"; then
 | |
|         read gdb_version_atmel < ${srcdir}/gdb/bfd/ATMEL-VER
 | |
|     else
 | |
|         gdb_version_atmel="atmel-$(date +%Y%m%d%H%M%Z)"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| 
 | |
| function gdb_prep()
 | |
| {
 | |
|     if test -f ${srcdir}/gdb/.prep_done
 | |
|     then
 | |
|         set_gdb_parameters
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     task_start "Preparing GDB... "
 | |
| 
 | |
|     do_pushd ${srcdir}
 | |
|     rm -rf gdb gdb-[0-9]\.[0-9]* || task_error "Removing old gdb folders failed"
 | |
|     upstream_source=$(ls ${srcdir}/gdb-*-patches/gdb-*.*)
 | |
|     unpack_upstream_source ${srcdir} ${upstream_source}
 | |
| 
 | |
|     # Link the unpacked folder to a generic folder for futhure work
 | |
|     ln -s $(ls -d gdb-[0-9]\.[0-9]*)  gdb || task_error "Error linking gcc folder"
 | |
|     apply_patches ${srcdir}/gdb $(ls -d ${srcdir}/gdb-*-patches)
 | |
| 
 | |
|     if [ ! -d ${srcdir}/gdb ] ; then
 | |
|         echo "Can't find gdb source."
 | |
|         exit 1
 | |
|     fi
 | |
|     set_gdb_parameters
 | |
| 
 | |
|     do_popd
 | |
|     task_success
 | |
|     touch ${srcdir}/gdb/.prep_done
 | |
| }
 | |
| 
 | |
| 
 | |
| function gdb_build()
 | |
| {
 | |
|     task_start "Building GDB for $1... "
 | |
|     remove_build_folder "${1}-gdb"
 | |
|     OLD_MAKEOPTS=$MAKEOPTS
 | |
|     MAKEOPTS=""
 | |
|     do_mkpushd ${builddir}/${1}-gdb
 | |
| 
 | |
|     # Are we doing a canadian cross?
 | |
|     if ${canadian_cross}; then
 | |
|         case ${host_platform} in
 | |
|             i[3456]86-*mingw32 )
 | |
|                 export LDFLAGS="-L${PREFIX}/lib"
 | |
|                 export CPPFLAGS="-I${PREFIX}/include"
 | |
|                 ;;
 | |
|             i[3456]86*-linux*)
 | |
|                 export LDFLAGS="-static"
 | |
|                 ;;
 | |
|             * )
 | |
|                 ;;
 | |
|         esac
 | |
|     else
 | |
|         export LDFLAGS="-static"
 | |
|     fi
 | |
| 
 | |
| 
 | |
|     # only from version 7.0 is --with-pkgversion and bugurls supported
 | |
| #    LDFLAGS='-static' \
 | |
|     CFLAGS="-I${PREFIX}/include -L${PREFIX}/lib" \
 | |
|     ${srcdir}/gdb/configure \
 | |
|         --with-pkgversion="AVR_8_bit_GNU_Toolchain_${avr_8_gnu_toolchain_version}_${BUILD_NUMBER}"\
 | |
|         --with-bugurl="http://www.atmel.com"\
 | |
|         --target=$1 \
 | |
|         --host=${host_platform} \
 | |
|         --build=${build_platform} \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --prefix="$PREFIX" \
 | |
|         --disable-nls \
 | |
|         --disable-werror \
 | |
|         > configure.out 2>&1 \
 | |
|         || task_error "configure for $1 failed. See configure.out"
 | |
| 
 | |
|     # Build.
 | |
|     do_make "Building for $1 failed. See make.out."
 | |
|     task_success
 | |
| 
 | |
|     # Install.
 | |
|     task_start "Installing GBD for $1... "
 | |
|     do_make_install "Installing GDB for $1 failed. See make.install.out."
 | |
|     do_popd
 | |
| 
 | |
| 
 | |
|     MAKEOPTS=$OLD_MAKEOPTS
 | |
|     task_success
 | |
| }
 | |
| function mpfr_prep() {
 | |
|     task_start "Unpacking mpfr... "
 | |
|     tar --extract --ungzip --directory ${srcdir} --file ${srcdir}/mpfr/mpfr*.tar.gz ||\
 | |
|      task_error "Failed to unpack mpfr"
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| 
 | |
| function mpfr_build() {
 | |
| 
 | |
|     task_start "Building libmpfr ..."
 | |
|     remove_build_folder "mpfr"
 | |
|     do_mkpushd ${builddir}/mpfr
 | |
| 
 | |
|     CFLAGS="-fPIC" $(ls -d ${srcdir}/mpfr-*)/configure \
 | |
|         --build=${build_platform} \
 | |
|         --host=${host_platform} \
 | |
|         --prefix=${PREFIX} \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --with-gmp=${PREFIX} \
 | |
|         --disable-shared \
 | |
|         --enable-static \
 | |
|         > configure.out 2>&1 || task_error "configure failed. See configure.out."
 | |
| 
 | |
|     do_make  "Failed building libmphr. See make.out"
 | |
|     task_success
 | |
|     task_start "Installing mpfr ..."
 | |
|     do_make_install "make install failed. See make.install.out."
 | |
|     do_popd
 | |
|     task_success
 | |
| 
 | |
| }
 | |
| 
 | |
| function gmp_prep() {
 | |
|     task_start "Unpacking gmp... "
 | |
|     upstream_source=$(ls ${srcdir}/gmp/gmp*)
 | |
|     unpack_upstream_source ${srcdir} ${upstream_source}
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| 
 | |
| function gmp_build() {
 | |
| 
 | |
|     task_start "Building libgmp ..."
 | |
|     remove_build_folder "gmp"
 | |
|     do_mkpushd ${builddir}/gmp
 | |
| 
 | |
|     CC_FOR_BUILD="gcc" CFLAGS="-fPIC" $(ls -d ${srcdir}/gmp-[0-9].*)/configure \
 | |
|         --build=${build_platform} \
 | |
|         --host=${host_platform} \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --prefix=${PREFIX} \
 | |
|         --disable-shared \
 | |
|         --enable-static \
 | |
|         > configure.out 2>&1 || task_error "configure failed. See configure.out."
 | |
| 
 | |
|     do_make  "Failed building libgmp. See make.out"
 | |
|     task_success
 | |
|     task_start "Installing gmp ..."
 | |
|     do_make_install "make install failed. See make.install.out."
 | |
|     do_popd
 | |
|     task_success
 | |
| 
 | |
| }
 | |
| 
 | |
| function mpc_prep() {
 | |
|     task_start "Unpacking mpc... "
 | |
|     upstream_source=$(ls ${srcdir}/mpc/mpc*)
 | |
|     unpack_upstream_source ${srcdir} ${upstream_source}
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| 
 | |
| function mpc_build() {
 | |
| 
 | |
|     task_start "Building libmpc ..."
 | |
|     remove_build_folder "mpc"
 | |
|     do_mkpushd ${builddir}/mpc
 | |
| 
 | |
|     CFLAGS="-fPIC" $(ls -d ${srcdir}/mpc-[0-9].[0-9]*)/configure \
 | |
|         --build=${build_platform} \
 | |
|         --host=${host_platform} \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --disable-shared \
 | |
|         --enable-static \
 | |
|         --prefix=${PREFIX} \
 | |
|         --with-mpfr=${PREFIX} \
 | |
|         --with-gmp=${PREFIX} \
 | |
|         > configure.out 2>&1 || task_error "configure failed. See configure.out."
 | |
| 
 | |
|     do_make  "Failed building libmpc. See make.out"
 | |
|     task_success
 | |
|     task_start "Installing mpc ..."
 | |
|     do_make_install "make install failed. See make.install.out."
 | |
|     do_popd
 | |
|     task_success
 | |
| 
 | |
| }
 | |
| 
 | |
| function ncurses_prep() {
 | |
|     task_start "Unpacking ncurses... "
 | |
|     upstream_source=$(ls ${srcdir}/ncurses/ncurses*)
 | |
|     unpack_upstream_source ${srcdir} ${upstream_source}
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| 
 | |
| function ncurses_build() {
 | |
|     task_start "Building ncurses ..."
 | |
|     remove_build_folder "ncurses"
 | |
|     do_mkpushd ${builddir}/ncurses
 | |
| 
 | |
|     CFLAGS="-fPIC" $(ls -d ${srcdir}/ncurses-[0-9].*)/configure \
 | |
|         --build=${build_platform} \
 | |
|         --host=${host_platform} \
 | |
|         --libdir=${PREFIX}/${LIB_DIR} \
 | |
|         --without-shared \
 | |
|         --without-sysmouse \
 | |
|         --without-progs \
 | |
|         --enable-termcap \
 | |
|         --prefix=${PREFIX} \
 | |
|         > configure.out 2>&1 || task_error "configure failed. See configure.out."
 | |
| 
 | |
|     do_make  "Failed building ncurses. See make.out"
 | |
|     task_success
 | |
|     task_start "Installing ncurses ..."
 | |
|     do_make_install "make install failed. See make.install.out."
 | |
|     do_popd
 | |
|     task_success
 | |
| }
 | |
| 
 | |
| ############# Start of main program. ####################
 | |
| start_timer
 | |
| 
 | |
| ############ Set up some usable variables #######################
 | |
| SUDO_PASSWORD=
 | |
| KEEP_BUILD_FOLDER="NO"
 | |
| TIMESTAMP=$(date +%Y%m%d%H%M)
 | |
| binutils_version_atmel="atmel-$(date +%Y%m%d%H%M%Z)"
 | |
| gcc_version_atmel="atmel-$(date +%Y%m%d%H%M%Z)"
 | |
| gdb_version_atmel="atmel-$(date +%Y%m%d%H%M%Z)"
 | |
| platform_version=""
 | |
| srcdir=
 | |
| builddir=
 | |
| execdir=`pwd`
 | |
| 
 | |
| # Set Toolchain version number
 | |
| # Use env variable AVR_GNU_TOOLCHAIN_VERSION if set
 | |
| avr_8_gnu_toolchain_version=${AVR_8_GNU_TOOLCHAIN_VERSION:-"3.2.0"}
 | |
| 
 | |
| # Set BUILD_NUMBER
 | |
| # BUILD_NUMBER is set by Hudson build server or can be set before running this script
 | |
| # If not set we use the date
 | |
| BUILD_NUMBER=${BUILD_NUMBER:-$(date +%Y%m%d%H%M)}
 | |
| 
 | |
| # Set defaults
 | |
| canadian_cross=false
 | |
| build_platform=$(uname -i)-pc-linux-gnu
 | |
| host_platform=$(uname -i)-pc-linux-gnu
 | |
| distribution="unknown"
 | |
| 
 | |
| # Set up the packages to build
 | |
| # The order gives the build order and is significant
 | |
| #packages="avr-binutils avr-gcc-bootstrap avr-libc avr-gcc-full avr-gdb"
 | |
| # avr-gdb is removed from package (binutils-2.22's bfd causes avr-gdb to fail)
 | |
| packages="avr-binutils avr-gcc-bootstrap avr-libc avr-gcc-full"
 | |
| 
 | |
| # See if we need to change or set some defaults
 | |
| if test "${OSTYPE}" = "cygwin"
 | |
| then
 | |
|     build_platform=i686-pc-cygwin
 | |
|     host_platform=i686-pc-cygwin
 | |
| elif test "${OSTYPE}" = "msys"
 | |
| then
 | |
|     build_platform=i686-pc-mingw32
 | |
|     host_platform=i686-pc-mingw32
 | |
| else
 | |
|     distribution=`lsb_release -i | cut -f2` || echo "WARNING: Couldn't determine which distribution"
 | |
| fi
 | |
| 
 | |
| # Ubuntu has some strange naming of old autoconf-2.13
 | |
| if test ${distribution} = "Ubuntu"
 | |
| then
 | |
|     AUTOCONF213_EXE=autoconf2.13
 | |
| else
 | |
|     AUTOCONF213_EXE=autoconf-2.13
 | |
| fi
 | |
| 
 | |
| 
 | |
| ############ Get and decode options given #########################
 | |
| while getopts "B:b:klhH:p:P:s:T:" options; do
 | |
|   case $options in
 | |
|       B ) build_platform=$OPTARG
 | |
|           ;;
 | |
|       b )	builddir=$OPTARG
 | |
|           ;;
 | |
|       H ) host_platform=$OPTARG
 | |
|           ;;
 | |
|       k )
 | |
|           KEEP_BUILD_FOLDER="YES"
 | |
|           ;;
 | |
|       l )
 | |
|           echo "Default packages and build order:"
 | |
|           for package in $packages
 | |
|           do
 | |
|               echo $package
 | |
|           done
 | |
|           exit 1
 | |
|           ;;
 | |
|     p )	AVR_PREFIX=$OPTARG
 | |
|         ;;
 | |
|     P ) SUDO_PASSWORD=$OPTARG
 | |
|         ;;
 | |
|       s )	srcdir=$OPTARG
 | |
|           ;;
 | |
|     h ) echo "$usage"
 | |
|         exit 1;;
 | |
|     \? ) echo "$usage"
 | |
|          exit 1;;
 | |
|     * ) echo "$usage"
 | |
|           exit 1;;
 | |
| 
 | |
|   esac
 | |
| done
 | |
| 
 | |
| shift $(($OPTIND - 1)) ## no need for expr in bash or other POSIX shell
 | |
| 
 | |
| 
 | |
| ######### Set packages to arguments given or to default ###########
 | |
| if test $# -ne 0
 | |
| then
 | |
|     packages="$@"
 | |
| fi
 | |
| 
 | |
| 
 | |
| ############ Check for source directory ###########################
 | |
| if test -z $srcdir
 | |
| then
 | |
|     echo "Using current directory as source folder."
 | |
|     srcdir=$(pwd)
 | |
| else
 | |
|     echo "Using '${srcdir}' as source folder."
 | |
| fi
 | |
| 
 | |
| if [ -d ${srcdir} ]
 | |
| then
 | |
|     # Convert path to absolute path
 | |
|     srcdir=$(cd ${srcdir}; pwd)
 | |
| else
 | |
|     echo "Error: Can't find source folder!"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| 
 | |
| ############ Make the build dir ###################################
 | |
| builddir="${builddir:-build}"
 | |
| mkdir -p ${builddir} || task_error "Cannot create build folder"
 | |
| 
 | |
| # Get absolute path for builddir
 | |
| builddir=$(cd ${builddir}; pwd)
 | |
| 
 | |
| ############# Set correct libdir #################################
 | |
| case "${host_platform}" in
 | |
|     i[3456]86-*-linux-gnu*)
 | |
|         LIB_DIR=lib
 | |
|         ;;
 | |
|     x86_64*-linux*)
 | |
|         LIB_DIR=lib
 | |
|         ;;
 | |
|     *)
 | |
|         LIB_DIR=lib
 | |
|         ;;
 | |
| esac
 | |
| 
 | |
| ######### Check for crosscompile ###############
 | |
| 
 | |
| # If build_platform != host_platform != target_platform
 | |
| # then we are doing canadian cross
 | |
| # since target always is avr32 or avr32-linux we check only
 | |
| # the build and host platforms
 | |
| if test ${host_platform} != ${build_platform}
 | |
| then
 | |
|     canadian_cross=true;
 | |
| fi
 | |
| 
 | |
| # Set some platform variables
 | |
| case "${host_platform}" in
 | |
|     i[3456]86*-linux*)
 | |
|         platform_version="\(linux32_special\)"
 | |
|         ;;
 | |
|     x86_64*-linux*)
 | |
|         platform_version="\(linux64_special\)"
 | |
|         ;;
 | |
|     i[3456]86*-cygwin*)
 | |
|         platform_version="\(cygwin_special\)"
 | |
|         ;;
 | |
|     i[3456789]86*-mingw32*)
 | |
|         # Maybe check for some prerequisite?
 | |
|         export CFLAGS="-D__USE_MINGW_ACCESS"
 | |
|         platform_version="\(mingw32_special\)"
 | |
|         ;;
 | |
|     sparc*-sun-solaris2.[56789]*)
 | |
|         ;;
 | |
|     sparc*-sun-solaris*)
 | |
|         ;;
 | |
|     mips*-*-elf*)
 | |
|         ;;
 | |
|     * )
 | |
|         echo "Unknown host platform: ${host_platform}"
 | |
|         ;;
 | |
| esac
 | |
| 
 | |
| 
 | |
| ############ Set PREFIX ############################
 | |
| PREFIX="${AVR_PREFIX:-/usr/local}"
 | |
| # Make sure it is absolute path
 | |
| PREFIX=$(cd ${PREFIX}; pwd)
 | |
| 
 | |
| PATH=$PATH:$PREFIX/bin
 | |
| export PATH
 | |
| 
 | |
| ############# Check if user has write access to prefix folder ####
 | |
| if test ! -w ${PREFIX} -a -z "${SUDO_PASSWORD}"
 | |
| then
 | |
|     echo "WARNING! You do not have write access to the $PREFIX folder! Installation will fail."
 | |
| fi
 | |
| 
 | |
| 
 | |
| ############# Check for necessary programs #######################
 | |
| for PREREQ in autoconf make gcc tar patch \
 | |
|     pdflatex pngtopnm epstopdf
 | |
| do
 | |
|     RUN=`type -ap $PREREQ |sort |uniq |wc -l`
 | |
|     if [ $RUN -eq 0 ]
 | |
|     then
 | |
|         echo "$PREREQ is not found in command path. Can't continue"
 | |
|         exit 1
 | |
|     elif [ $RUN -gt 1 ]
 | |
|     then
 | |
|         echo -n "Found multiple versions of $PREREQ, using the one at "
 | |
|         type -p $PREREQ
 | |
|     fi
 | |
| done
 | |
| 
 | |
| 
 | |
| ############# First we make necessary preparations ###############
 | |
| for part in ${packages}
 | |
| do
 | |
|     case ${part} in
 | |
|         "avr-binutils" )
 | |
|             binutils_prep
 | |
|             ;;
 | |
|         "avr-gcc-bootstrap" | "avr-gcc-full" )
 | |
|             gmp_prep
 | |
|             mpfr_prep
 | |
|             mpc_prep
 | |
|             gcc_prep
 | |
|             ;;
 | |
|         "avr-libc" )
 | |
|             avr_libc_prep
 | |
|             ;;
 | |
|         "avr-gdb" )
 | |
|             ncurses_prep
 | |
|             gdb_prep
 | |
|             ;;
 | |
|         * )
 | |
|             echo "Error: Unknown package ${part}."
 | |
|             exit 1
 | |
|             ;;
 | |
|     esac
 | |
| done
 | |
| 
 | |
| 
 | |
| ############# Building and installing ###########
 | |
| # The order of building is given by the order in the packages variable
 | |
| for part in ${packages}
 | |
| do
 | |
|     case ${part} in
 | |
|         "avr-binutils" )
 | |
|             binutils_build "avr"
 | |
|             ;;
 | |
|         "avr-gcc-bootstrap" )
 | |
|             gmp_build
 | |
|             mpfr_build
 | |
|             mpc_build
 | |
|             gcc_build_bootstrap "avr"
 | |
|             ;;
 | |
|         "avr-libc" )
 | |
|             avr_libc_build
 | |
|             ;;
 | |
|         "avr-gcc-full" )
 | |
|             case ${host_platform} in
 | |
|                 i68[3456]-*mingw32 )
 | |
|                     # we asume gmp and mpfr binaries is preinstalled.
 | |
|                     gmp_build
 | |
|                     mpfr_build
 | |
|                     ;;
 | |
|                 *linux* )
 | |
|                     gmp_build
 | |
|                     mpfr_build
 | |
|                     ;;
 | |
|                 * )
 | |
|                     ;;
 | |
|             esac
 | |
|             mpc_build
 | |
|             gcc_build_full "avr"
 | |
|             ;;
 | |
|         "avr-gdb" )
 | |
|             case ${host_platform} in
 | |
|                 i68[3456]-*mingw32 )
 | |
|                     # we asume libtermcap binaries is preinstalled.
 | |
|                     ;;
 | |
|                 *linux* )
 | |
|                     ncurses_build
 | |
|                     ;;
 | |
|                 * )
 | |
|                     ;;
 | |
|             esac
 | |
|             gdb_build "avr"
 | |
|             ;;
 | |
|         * )
 | |
|             echo "Error: Unknown package ${part}."
 | |
|             exit 1
 | |
|             ;;
 | |
|     esac
 | |
| done
 | |
| 
 | |
| 
 | |
| 
 | |
| end_timer
 | |
| report_time
 | |
| exit 0
 | |
| 
 | |
| 
 | |
| ##################################################################
 | |
| # Now you should have a complete development enviroment for avr
 | |
| # installed at 'prefix' location.
 |