scripts/buildToolchain.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 42 aacc012db6c4
permissions -rw-r--r--
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
# This scripts calls each component's build script.
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
# Parse all build files to have the needed functions.
yann@1
     6
. "${CT_TOP_DIR}/scripts/build/kernel_${CT_KERNEL}.sh"
yann@1
     7
. "${CT_TOP_DIR}/scripts/build/binutils.sh"
yann@1
     8
. "${CT_TOP_DIR}/scripts/build/libc_libfloat.sh"
yann@1
     9
. "${CT_TOP_DIR}/scripts/build/libc_${CT_LIBC}.sh"
yann@1
    10
. "${CT_TOP_DIR}/scripts/build/cc_core_${CT_CC_CORE}.sh"
yann@1
    11
. "${CT_TOP_DIR}/scripts/build/cc_${CT_CC}.sh"
yann@1
    12
yann@1
    13
# Arrange paths depending on wether we use sys-root or not.
yann@1
    14
if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@1
    15
    CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/sys-root"
yann@1
    16
    CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
yann@1
    17
    BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@1
    18
    CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@1
    19
    CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@1
    20
    LIBC_SYSROOT_ARG=""
yann@1
    21
    # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
yann@1
    22
    # confused when $sysroot/usr/include is not present.
yann@1
    23
    # Note: --prefix=/usr is magic!
yann@1
    24
    # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
yann@1
    25
else
yann@1
    26
    # plain old way. All libraries in prefix/target/lib
yann@1
    27
    CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
yann@1
    28
    CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
yann@1
    29
    # hack!  Always use --with-sysroot for binutils.
yann@1
    30
    # binutils 2.14 and later obey it, older binutils ignore it.
yann@1
    31
    # Lets you build a working 32->64 bit cross gcc
yann@1
    32
    BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@1
    33
    # Use --with-headers, else final gcc will define disable_glibc while
yann@1
    34
    # building libgcc, and you'll have no profiling
yann@1
    35
    CC_CORE_SYSROOT_ARG="--without-headers"
yann@1
    36
    CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
yann@1
    37
    LIBC_SYSROOT_ARG="prefix="
yann@1
    38
fi
yann@1
    39
yann@1
    40
# Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
yann@1
    41
# 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail with
yann@1
    42
#  "ld: cannot open crti.o: No such file or directory"
yann@1
    43
mkdir -p "${CT_SYSROOT_DIR}/lib"
yann@1
    44
mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
yann@1
    45
yann@1
    46
# Canadian-cross are really picky on the way they are built. Tweak the values.
yann@1
    47
if [ "${CT_CANADIAN}" = "y" ]; then
yann@1
    48
    # Arrange so that gcc never, ever think that build system == host system
yann@1
    49
    CT_CANADIAN_OPT="--build=`echo \"${CT_BUILD}\" |sed -r -e 's/-/-build_/'`"
yann@1
    50
    # We shall have a compiler for this target!
yann@1
    51
    # Do test here...
yann@1
    52
else
yann@1
    53
    CT_HOST="${CT_BUILD}"
yann@1
    54
    CT_CANADIAN_OPT=
yann@1
    55
    # Add the target toolchain in the path so that we can build the C library
yann@1
    56
    export PATH="${CT_PREFIX_DIR}/bin:${CT_CC_CORE_PREFIX_DIR}/bin:${PATH}"
yann@1
    57
fi
yann@1
    58
yann@1
    59
# Modify GCC_HOST to never be equal to $BUILD or $TARGET
yann@1
    60
# This strange operation causes gcc to always generate a cross-compiler
yann@1
    61
# even if the build machine is the same kind as the host.
yann@1
    62
# This is why CC has to be set when doing a canadian cross; you can't find a
yann@1
    63
# host compiler by appending -gcc to our whacky $GCC_HOST
yann@1
    64
# Kludge: it is reported that the above causes canadian crosses with cygwin
yann@1
    65
# hosts to fail, so avoid it just in that one case.  It would be cleaner to
yann@1
    66
# just move this into the non-canadian case above, but I'm afraid that might
yann@1
    67
# cause some configure script somewhere to decide that since build==host, they
yann@1
    68
# could run host binaries.
yann@1
    69
# (Copied almost as-is from original crosstool):
yann@1
    70
case "${CT_KERNEL},${CT_CANADIAN}" in
yann@1
    71
    cygwin,y) ;;
yann@1
    72
    *)        CT_HOST="`echo \"${CT_HOST}\" |sed -r -e 's/-/-host_/;'`";;
yann@1
    73
esac
yann@1
    74
yann@42
    75
# Ah! Recent versions of binutils need some of the build and/or host system
yann@42
    76
# (read CT_BUILD and CT_HOST) tools to be accessible (ar is but an example).
yann@42
    77
# Do that:
yann@28
    78
CT_DoLog EXTRA "Making build system tools available"
yann@28
    79
mkdir -p "${CT_PREFIX_DIR}/bin"
yann@28
    80
for tool in ar; do
yann@28
    81
    ln -s "`which ${tool}`" "${CT_PREFIX_DIR}/bin/${CT_BUILD}-${tool}"
yann@42
    82
    ln -s "`which ${tool}`" "${CT_PREFIX_DIR}/bin/${CT_HOST}-${tool}"
yann@28
    83
done
yann@28
    84
yann@1
    85
# Ha. cygwin host have an .exe suffix (extension) for executables.
yann@1
    86
[ "${CT_KERNEL}" = "cygwin" ] && EXEEXT=".exe" || EXEEXT=""
yann@1
    87
yann@1
    88
# Transform the ARCH into a kernel-understandable ARCH
yann@1
    89
case "${CT_ARCH}" in
yann@1
    90
    x86) CT_KERNEL_ARCH=i386;;
yann@28
    91
    ppc) CT_KERNEL_ARCH=powerpc;;
yann@1
    92
    *)   CT_KERNEL_ARCH="${CT_ARCH}";;
yann@1
    93
esac
yann@1
    94
yann@1
    95
# Build up the TARGET_CFLAGS from user-provided options
yann@1
    96
tmp_target_CFLAGS=
yann@1
    97
[ -n "${CT_ARCH_CPU}" ]  && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mcpu=${CT_ARCH_CPU}"
yann@1
    98
[ -n "${CT_ARCH_TUNE}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mtune=${CT_ARCH_TUNE}"
yann@1
    99
[ -n "${CT_ARCH_ARCH}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -march=${CT_ARCH_ARCH}"
yann@1
   100
[ -n "${CT_ARCH_FPU}" ]  && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mfpu=${CT_ARCH_FPU}"
yann@1
   101
# Override with user-specified CFLAGS
yann@1
   102
CT_TARGET_CFLAGS="${tmp_target_CFLAGS} ${CT_TARGET_CFLAGS}"
yann@1
   103
yann@1
   104
# Help gcc
yann@1
   105
CT_CFLAGS_FOR_HOST=
yann@1
   106
[ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
yann@1
   107
yann@1
   108
# And help make go faster
yann@1
   109
PARALLELMFLAGS=
yann@1
   110
[ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
yann@1
   111
[ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
yann@1
   112
yann@1
   113
CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
yann@48
   114
CT_DoLog EXTRA "Building a toolchain for:"
yann@1
   115
CT_DoLog EXTRA "  build  = ${CT_BUILD}"
yann@1
   116
CT_DoLog EXTRA "  host   = ${CT_HOST}"
yann@1
   117
CT_DoLog EXTRA "  target = ${CT_TARGET}"
yann@1
   118
set |egrep '^CT_.+=' |sort |CT_DoLog DEBUG
yann@1
   119
CT_EndStep
yann@1
   120
yann@1
   121
# Now for the job by itself.
yann@1
   122
# Check the C library config ASAP, before the user gets bored, and is
yann@1
   123
# gone having his/her coffee
yann@1
   124
do_libc_check_config
yann@1
   125
do_kernel_check_config
yann@1
   126
do_kernel_headers
yann@1
   127
do_binutils
yann@1
   128
do_libc_headers
yann@1
   129
do_cc_core
yann@1
   130
do_libfloat
yann@1
   131
do_libc
yann@1
   132
do_cc
yann@1
   133
do_libc_finish