scripts/crosstool.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Mar 07 19:00:10 2007 +0000 (2007-03-07)
changeset 14 11726b835286
parent 1 eeea35fbf182
child 46 1c22b060eb4d
permissions -rwxr-xr-x
Add an option to remove the generated documentation.
(After an idea from Enrico Weigelt <weigelt@metux.de>).
     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 CT_TARGET="`${CT_TOP_DIR}/tools/config.sub ${CT_TARGET}`"
   153 
   154 # Now, build up the variables from the user-configured options.
   155 CT_KERNEL_FILE="${CT_KERNEL}-${CT_KERNEL_VERSION}"
   156 CT_BINUTILS_FILE="binutils-${CT_BINUTILS_VERSION}"
   157 if [ "${CT_CC_USE_CORE}" != "y" ]; then
   158     CT_CC_CORE="${CT_CC}"
   159     CT_CC_CORE_VERSION="${CT_CC_VERSION}"
   160     CT_CC_CORE_EXTRA_CONFIG="${CT_CC_EXTRA_CONFIG}"
   161 fi
   162 CT_CC_CORE_FILE="${CT_CC_CORE}-${CT_CC_CORE_VERSION}"
   163 CT_CC_FILE="${CT_CC}-${CT_CC_VERSION}"
   164 CT_LIBC_FILE="${CT_LIBC}-${CT_LIBC_VERSION}"
   165 [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] && CT_LIBFLOAT_FILE="libfloat-990616"
   166 
   167 # Kludge: If any of the configured options needs CT_TARGET or CT_TOP_DIR,
   168 # then rescan the options file now:
   169 . "${CT_TOP_DIR}/.config"
   170 
   171 # Determine build system if not set by the user
   172 CT_Test "You did not specify the build system. Guessing." -z "${CT_BUILD}"
   173 CT_BUILD="`${CT_TOP_DIR}/tools/config.sub \"${CT_BUILD:-\`${CT_TOP_DIR}/tools/config.guess\`}\"`"
   174 
   175 # Get rid of pre-existing installed toolchain and previous build directories.
   176 # We need to do that _before_ we can safely log, because the log file will
   177 # most probably be in the toolchain directory.
   178 if [ -d "${CT_PREFIX_DIR}" ]; then
   179     mv "${CT_PREFIX_DIR}" "${CT_PREFIX_DIR}.$$"
   180     nohup rm -rf "${CT_PREFIX_DIR}.$$" >/dev/null 2>&1 &
   181 fi
   182 mkdir -p "${CT_PREFIX_DIR}"
   183 if [ -d "${CT_BUILD_DIR}" ]; then
   184     mv "${CT_BUILD_DIR}" "${CT_BUILD_DIR}.$$"
   185     nohup rm -rf "${CT_BUILD_DIR}.$$" >/dev/null 2>&1 &
   186 fi
   187 mkdir -p "${CT_BUILD_DIR}"
   188 
   189 # Check now if we can write to the destination directory:
   190 if [ -d "${CT_PREFIX_DIR}" ]; then
   191     CT_TestAndAbort "Destination directory \"${CT_INSTALL_DIR}\" is not writeable" ! -w "${CT_PREFIX_DIR}"
   192 else
   193     mkdir -p "${CT_PREFIX_DIR}" || CT_Abort "Could not create destination directory \"${CT_PREFIX_DIR}\""
   194 fi
   195 
   196 # Redirect log to the actual log file now we can
   197 # It's quite understandable that the log file will be installed in the
   198 # install directory, so we must first ensure it exists and is writeable (above)
   199 # before we can log there
   200 t="${CT_ACTUAL_LOG_FILE}"
   201 case "${CT_LOG_TO_FILE},${CT_LOG_FILE}" in
   202     ,*)   CT_ACTUAL_LOG_FILE=/dev/null
   203           rm -f "${t}"
   204           ;;
   205     y,/*) mkdir -p "`dirname \"${CT_LOG_FILE}\"`"
   206           CT_ACTUAL_LOG_FILE="${CT_LOG_FILE}"
   207           mv "${t}" "${CT_ACTUAL_LOG_FILE}"
   208           ;;
   209     y,*)  mkdir -p "`pwd`/`dirname \"${CT_LOG_FILE}\"`"
   210           CT_ACTUAL_LOG_FILE="`pwd`/${CT_LOG_FILE}"
   211           mv "${t}" "${CT_ACTUAL_LOG_FILE}"
   212           ;;
   213 esac
   214 
   215 # Some more sanity checks now that we have all paths set up
   216 case "${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in
   217     *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";;
   218 esac
   219 
   220 # Note: we'll always install the core compiler in its own directory, so as to
   221 # not mix the two builds: core and final. Anyway, its generic, wether we use
   222 # a different compiler as core, or not.
   223 CT_CC_CORE_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core"
   224 
   225 # Good, now grab a bit of informations on the system we're being run,
   226 # just in case something goes awok, and it's not our fault:
   227 CT_SYS_HOSTNAME=`hostname -f 2>/dev/null || true`
   228 # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
   229 CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-`uname -n`}"
   230 CT_SYS_KERNEL=`uname -s`
   231 CT_SYS_REVISION=`uname -r`
   232 # MacOS X lacks '-o' :
   233 CT_SYS_OS=`uname -o || echo Unkown`
   234 CT_SYS_MACHINE=`uname -m`
   235 CT_SYS_PROCESSOR=`uname -p`
   236 CT_SYS_USER="`id -un`"
   237 CT_SYS_DATE=`CT_DoDate +%Y%m%d.%H%M%S`
   238 CT_SYS_GCC=`gcc -dumpversion`
   239 CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_SYS_DATE} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME} for ${CT_TARGET}"
   240 
   241 # renice oursleves
   242 renice ${CT_NICE} $$ |CT_DoLog DEBUG
   243 
   244 # Include sub-scripts instead of calling them: that way, we do not have to
   245 # export any variable, nor re-parse the configuration and functions files.
   246 . "${CT_TOP_DIR}/scripts/getExtractPatch.sh"
   247 . "${CT_TOP_DIR}/scripts/buildToolchain.sh"
   248 #. "${CT_TOP_DIR}/scripts/testToolchain.sh"
   249 
   250 if [ -n "${CT_TARGET_ALIAS}" ]; then
   251     CT_DoLog EXTRA "Creating symlinks from \"${CT_TARGET}-*\" to \"${CT_TARGET_ALIAS}-*\""
   252     CT_Pushd "${CT_PREFIX_DIR}/bin"
   253     for t in "${CT_TARGET}-"*; do
   254         _t="`echo \"$t\" |sed -r -e 's/^'\"${CT_TARGET}\"'-/'\"${CT_TARGET_ALIAS}\"'-/;'`"
   255         CT_DoLog DEBUG "Linking \"${_t}\" -> \"${t}\""
   256         ln -s "${t}" "${_t}"
   257     done
   258     CT_Popd
   259 fi
   260 
   261 if [ "${CT_REMOVE_DOCS}" = "y" ]; then
   262 	CT_DoLog INFO "Removing installed documentation"
   263     rm -rf "${CT_PREFIX_DIR}/"{man,info}
   264 fi
   265 
   266 CT_STOP_DATE=`CT_DoDate +%s%N`
   267 CT_STOP_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
   268 CT_DoLog INFO "Build completed at ${CT_STOP_DATE_HUMAN}"
   269 elapsed=$((CT_STOP_DATE-CT_STAR_DATE))
   270 elapsed_min=$((elapsed/(60*1000*1000*1000)))
   271 elapsed_sec=`printf "%02d" $(((elapsed%(60*1000*1000*1000))/(1000*1000*1000)))`
   272 elapsed_csec=`printf "%02d" $(((elapsed%(1000*1000*1000))/(10*1000*1000)))`
   273 CT_DoLog INFO "(elapsed: ${elapsed_min}:${elapsed_sec}.${elapsed_csec})"
   274 
   275 # Restore a 'normal' color setting
   276 echo -en "${CT_NORMAL_COLOR}"
   277 
   278 trap - EXIT