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