scripts/crosstool.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue May 01 16:49:15 2007 +0000 (2007-05-01)
changeset 56 07a6a48962b7
parent 14 11726b835286
child 63 89b41dbffe8d
permissions -rwxr-xr-x
Merge patches sent by Robert P. J. Day <rpjday@mindspring.com>.
Warning: the buildroot folks purposedly removed the skip-comment patch but didn't really said why. Keeping it for the sake of having it in svn just in case (removing it will be easier thant not having it at all).
     1 #!/bin/bash
     2 # Copyright 2007 Yann E. MORIN
     3 # Licensed under the GPL v2. See COPYING in the root of this package.
     4 
     5 # This is the main entry point to crosstool
     6 # This will:
     7 #   - download, extract and patch the toolchain components
     8 #   - build and install each components in turn
     9 #   - and eventually test the resulting toolchain
    10 
    11 # What this file does is prepare the environment, based upon the user-choosen
    12 # options. It also checks the existing environment for un-friendly variables,
    13 # and checks for needed tools. It eventually calls the main build script.
    14 
    15 # User must set CT_TOP_DIR in is environment!
    16 # Once we can build out-of-tree, then this will have to go.
    17 if [ -z "${CT_TOP_DIR}" -o ! -d "${CT_TOP_DIR}" ]; then
    18     # We don't have the functions right now, because we don't have CT_TOP_DIR.
    19     # Do the print stuff by hand:
    20     echo "CT_TOP_DIR not set. You must set CT_TOP_DIR to the top directory where crosstool is installed."
    21     exit 1
    22 fi
    23 
    24 # Parse the common functions
    25 . "${CT_TOP_DIR}/scripts/functions"
    26 
    27 CT_STAR_DATE=`CT_DoDate +%s%N`
    28 CT_STAR_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
    29 
    30 # Log to a temporary file until we have built our environment
    31 CT_ACTUAL_LOG_FILE="`pwd`/$$.log"
    32 
    33 # CT_TOP_DIR should be an absolute path.
    34 CT_TOP_DIR="`CT_MakeAbsolutePath \"${CT_TOP_DIR}\"`"
    35 
    36 # Parse the configuration file
    37 CT_TestOrAbort "Configuration file not found. Please create one." -f "${CT_TOP_DIR}/.config"
    38 . "${CT_TOP_DIR}/.config"
    39 
    40 # The progress bar indicator is asked for
    41 if [ "${CT_LOG_PROGRESS_BAR}" = "y" ]; then
    42     _CT_PROG_BAR() {
    43         [ $((cpt/5)) -eq 0 ] && echo -en "/"
    44         [ $((cpt/5)) -eq 1 ] && echo -en "-"
    45         [ $((cpt/5)) -eq 2 ] && echo -en "\\"
    46         [ $((cpt/5)) -eq 3 ] && echo -en "|"
    47         echo -en "\r"
    48         cpt=$(((cpt+1)%20))
    49     }
    50     CT_PROG_BAR=_CT_PROG_BAR
    51     export -f _CT_PROG_BAR
    52 else
    53     CT_PROG_BAR=
    54 fi
    55 
    56 # Apply the color scheme if needed
    57 if [ "${CT_LOG_USE_COLORS}" = "y" ]; then
    58     CT_ERROR_COLOR="${_A_NOR}${_A_BRI}${_F_RED}"
    59     CT_WARN_COLOR="${_A_NOR}${_A_BRI}${_F_YEL}"
    60     CT_INFO_COLOR="${_A_NOR}${_A_BRI}${_F_GRN}"
    61     CT_EXTRA_COLOR="${_A_NOR}${_A_DIM}${_F_GRN}"
    62     CT_DEBUG_COLOR="${_A_NOR}${_A_DIM}${_F_WHI}"
    63     CT_NORMAL_COLOR="${_A_NOR}"
    64 else
    65     CT_ERROR_COLOR=
    66     CT_WARN_COLOR=
    67     CT_INFO_COLOR=
    68     CT_EXTRA_COLOR=
    69     CT_DEBUG_COLOR=
    70     CT_NORMAL_COLOR=
    71 fi
    72 
    73 # Yes! We can do full logging from now on!
    74 CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
    75 
    76 # Some sanity checks in the environment and needed tools
    77 CT_DoLog INFO "Checking environment sanity"
    78 
    79 # Enable known ordering of files in directory listings:
    80 CT_Test "Crosstool-NG might not work as expected with LANG=\"${LANG}\"" -n "${LANG}"
    81 case "${LC_COLLATE},${LC_ALL}" in
    82   # These four combinations are known to sort files in the correct order:
    83   fr_FR*,)  ;;
    84   en_US*,)  ;;
    85   *,fr_FR*) ;;
    86   *,en_US*) ;;
    87   # Anything else is destined to be borked if not gracefuly handled:
    88   *) CT_DoLog WARN "Either LC_COLLATE=\"${LC_COLLATE}\" or LC_ALL=\"${LC_ALL}\" is not supported."
    89      export LC_ALL=`locale -a |egrep "^(fr_FR|en_US)" |head -n 1`
    90      CT_TestOrAbort "Neither en_US* nor fr_FR* locales found on your system." -n "${LC_ALL}"
    91      CT_DoLog WARN "Forcing to known working LC_ALL=\"${LC_ALL}\"."
    92      ;;
    93 esac
    94 
    95 # Other environment sanity checks
    96 CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
    97 CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
    98 CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
    99 CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
   100 GREP_OPTIONS=
   101 CT_HasOrAbort awk
   102 CT_HasOrAbort sed
   103 CT_HasOrAbort bison
   104 CT_HasOrAbort flex
   105 
   106 CT_DoStep DEBUG "Dumping crosstool-NG configuration"
   107 cat ${CT_TOP_DIR}/.config |egrep '^(# |)CT_' |CT_DoLog DEBUG
   108 CT_EndStep
   109 
   110 CT_DoLog INFO "Building environment variables"
   111 
   112 # This should go in buildToolchain.sh, but we might need it because it could
   113 # be used by the user in his/her paths definitions.
   114 # Target triplet: CT_TARGET needs a little love:
   115 case "${CT_ARCH_BE},${CT_ARCH_LE}" in
   116     y,) target_endian_eb=eb; target_endian_el=;;
   117     ,y) target_endian_eb=; target_endian_el=el;;
   118 esac
   119 case "${CT_ARCH}" in
   120     arm)  CT_TARGET="${CT_ARCH}${target_endian_eb}";;
   121     mips) CT_TARGET="${CT_ARCH}${target_endian_el}";;
   122     x86*) # Much love for this one :-(
   123           # Ultimately, we should use config.sub to output the correct
   124           # procesor name. Work for later...
   125           arch="${CT_ARCH_ARCH}"
   126           [ -z "${arch}" ] && arch="${CT_ARCH_TUNE}"
   127           case "${CT_ARCH}" in
   128               x86_64)      CT_TARGET=x86_64;;
   129           	  *)  case "${arch}" in
   130                       "")                                       CT_TARGET=i386;;
   131                       i386|i486|i586|i686)                      CT_TARGET="${arch}";;
   132                       winchip*)                                 CT_TARGET=i486;;
   133                       pentium|pentium-mmx|c3*)                  CT_TARGET=i586;;
   134                       nocona|athlon*64|k8|athlon-fx|opteron)    CT_TARGET=x86_64;;
   135                       pentiumpro|pentium*|athlon*)              CT_TARGET=i686;;
   136                       *)                                        CT_TARGET=i586;;
   137                   esac;;
   138           esac;;
   139 esac
   140 case "${CT_TARGET_VENDOR}" in
   141     "") CT_TARGET="${CT_TARGET}-unknown";;
   142     *)  CT_TARGET="${CT_TARGET}-${CT_TARGET_VENDOR}";;
   143 esac
   144 case "${CT_KERNEL}" in
   145     linux*)  CT_TARGET="${CT_TARGET}-linux";;
   146     cygwin*) CT_TARGET="${CT_TARGET}-cygwin";;
   147 esac
   148 case "${CT_LIBC}" in
   149     glibc)  CT_TARGET="${CT_TARGET}-gnu";;
   150     uClibc) CT_TARGET="${CT_TARGET}-uclibc";;
   151 esac
   152 case "${CT_ARCH_ABI}" in
   153     eabi)   CT_TARGET="${CT_TARGET}eabi";;
   154 esac
   155 CT_TARGET="`${CT_TOP_DIR}/tools/config.sub ${CT_TARGET}`"
   156 
   157 # Now, build up the variables from the user-configured options.
   158 CT_KERNEL_FILE="${CT_KERNEL}-${CT_KERNEL_VERSION}"
   159 CT_BINUTILS_FILE="binutils-${CT_BINUTILS_VERSION}"
   160 if [ "${CT_CC_USE_CORE}" != "y" ]; then
   161     CT_CC_CORE="${CT_CC}"
   162     CT_CC_CORE_VERSION="${CT_CC_VERSION}"
   163     CT_CC_CORE_EXTRA_CONFIG="${CT_CC_EXTRA_CONFIG}"
   164 fi
   165 CT_CC_CORE_FILE="${CT_CC_CORE}-${CT_CC_CORE_VERSION}"
   166 CT_CC_FILE="${CT_CC}-${CT_CC_VERSION}"
   167 CT_LIBC_FILE="${CT_LIBC}-${CT_LIBC_VERSION}"
   168 [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] && CT_LIBFLOAT_FILE="libfloat-990616"
   169 
   170 # Kludge: If any of the configured options needs CT_TARGET or CT_TOP_DIR,
   171 # then rescan the options file now:
   172 . "${CT_TOP_DIR}/.config"
   173 
   174 # Determine build system if not set by the user
   175 CT_Test "You did not specify the build system. Guessing." -z "${CT_BUILD}"
   176 CT_BUILD="`${CT_TOP_DIR}/tools/config.sub \"${CT_BUILD:-\`${CT_TOP_DIR}/tools/config.guess\`}\"`"
   177 
   178 # Get rid of pre-existing installed toolchain and previous build directories.
   179 # We need to do that _before_ we can safely log, because the log file will
   180 # most probably be in the toolchain directory.
   181 if [ -d "${CT_PREFIX_DIR}" ]; then
   182     mv "${CT_PREFIX_DIR}" "${CT_PREFIX_DIR}.$$"
   183     nohup rm -rf "${CT_PREFIX_DIR}.$$" >/dev/null 2>&1 &
   184 fi
   185 mkdir -p "${CT_PREFIX_DIR}"
   186 if [ -d "${CT_BUILD_DIR}" ]; then
   187     mv "${CT_BUILD_DIR}" "${CT_BUILD_DIR}.$$"
   188     nohup rm -rf "${CT_BUILD_DIR}.$$" >/dev/null 2>&1 &
   189 fi
   190 mkdir -p "${CT_BUILD_DIR}"
   191 
   192 # Check now if we can write to the destination directory:
   193 if [ -d "${CT_PREFIX_DIR}" ]; then
   194     CT_TestAndAbort "Destination directory \"${CT_INSTALL_DIR}\" is not writeable" ! -w "${CT_PREFIX_DIR}"
   195 else
   196     mkdir -p "${CT_PREFIX_DIR}" || CT_Abort "Could not create destination directory \"${CT_PREFIX_DIR}\""
   197 fi
   198 
   199 # Redirect log to the actual log file now we can
   200 # It's quite understandable that the log file will be installed in the
   201 # install directory, so we must first ensure it exists and is writeable (above)
   202 # before we can log there
   203 t="${CT_ACTUAL_LOG_FILE}"
   204 case "${CT_LOG_TO_FILE},${CT_LOG_FILE}" in
   205     ,*)   CT_ACTUAL_LOG_FILE=/dev/null
   206           rm -f "${t}"
   207           ;;
   208     y,/*) mkdir -p "`dirname \"${CT_LOG_FILE}\"`"
   209           CT_ACTUAL_LOG_FILE="${CT_LOG_FILE}"
   210           mv "${t}" "${CT_ACTUAL_LOG_FILE}"
   211           ;;
   212     y,*)  mkdir -p "`pwd`/`dirname \"${CT_LOG_FILE}\"`"
   213           CT_ACTUAL_LOG_FILE="`pwd`/${CT_LOG_FILE}"
   214           mv "${t}" "${CT_ACTUAL_LOG_FILE}"
   215           ;;
   216 esac
   217 
   218 # Some more sanity checks now that we have all paths set up
   219 case "${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in
   220     *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";;
   221 esac
   222 
   223 # Note: we'll always install the core compiler in its own directory, so as to
   224 # not mix the two builds: core and final. Anyway, its generic, wether we use
   225 # a different compiler as core, or not.
   226 CT_CC_CORE_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core"
   227 
   228 # Good, now grab a bit of informations on the system we're being run,
   229 # just in case something goes awok, and it's not our fault:
   230 CT_SYS_HOSTNAME=`hostname -f 2>/dev/null || true`
   231 # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
   232 CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-`uname -n`}"
   233 CT_SYS_KERNEL=`uname -s`
   234 CT_SYS_REVISION=`uname -r`
   235 # MacOS X lacks '-o' :
   236 CT_SYS_OS=`uname -o || echo Unkown`
   237 CT_SYS_MACHINE=`uname -m`
   238 CT_SYS_PROCESSOR=`uname -p`
   239 CT_SYS_USER="`id -un`"
   240 CT_SYS_DATE=`CT_DoDate +%Y%m%d.%H%M%S`
   241 CT_SYS_GCC=`gcc -dumpversion`
   242 CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_SYS_DATE} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME} for ${CT_TARGET}"
   243 
   244 # renice oursleves
   245 renice ${CT_NICE} $$ |CT_DoLog DEBUG
   246 
   247 # Include sub-scripts instead of calling them: that way, we do not have to
   248 # export any variable, nor re-parse the configuration and functions files.
   249 . "${CT_TOP_DIR}/scripts/getExtractPatch.sh"
   250 . "${CT_TOP_DIR}/scripts/buildToolchain.sh"
   251 #. "${CT_TOP_DIR}/scripts/testToolchain.sh"
   252 
   253 if [ -n "${CT_TARGET_ALIAS}" ]; then
   254     CT_DoLog EXTRA "Creating symlinks from \"${CT_TARGET}-*\" to \"${CT_TARGET_ALIAS}-*\""
   255     CT_Pushd "${CT_PREFIX_DIR}/bin"
   256     for t in "${CT_TARGET}-"*; do
   257         _t="`echo \"$t\" |sed -r -e 's/^'\"${CT_TARGET}\"'-/'\"${CT_TARGET_ALIAS}\"'-/;'`"
   258         CT_DoLog DEBUG "Linking \"${_t}\" -> \"${t}\""
   259         ln -s "${t}" "${_t}"
   260     done
   261     CT_Popd
   262 fi
   263 
   264 if [ "${CT_REMOVE_DOCS}" = "y" ]; then
   265 	CT_DoLog INFO "Removing installed documentation"
   266     rm -rf "${CT_PREFIX_DIR}/"{man,info}
   267 fi
   268 
   269 CT_STOP_DATE=`CT_DoDate +%s%N`
   270 CT_STOP_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
   271 CT_DoLog INFO "Build completed at ${CT_STOP_DATE_HUMAN}"
   272 elapsed=$((CT_STOP_DATE-CT_STAR_DATE))
   273 elapsed_min=$((elapsed/(60*1000*1000*1000)))
   274 elapsed_sec=`printf "%02d" $(((elapsed%(60*1000*1000*1000))/(1000*1000*1000)))`
   275 elapsed_csec=`printf "%02d" $(((elapsed%(1000*1000*1000))/(10*1000*1000)))`
   276 CT_DoLog INFO "(elapsed: ${elapsed_min}:${elapsed_sec}.${elapsed_csec})"
   277 
   278 # Restore a 'normal' color setting
   279 echo -en "${CT_NORMAL_COLOR}"
   280 
   281 trap - EXIT