scripts/crosstool.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Apr 23 20:27:40 2007 +0000 (2007-04-23)
changeset 46 1c22b060eb4d
parent 14 11726b835286
child 63 89b41dbffe8d
permissions -rwxr-xr-x
Merge missing ABI code from the MIPS branch.
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