scripts/buildToolchain.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Mar 04 20:09:22 2007 +0000 (2007-03-04)
changeset 9 22fec39016f4
child 28 3a682f0237df
permissions -rw-r--r--
Update i586-geode-linux-uclibc sample:
- use uClibc-0.9.28.3
- use linux-2.6.20 for kernel headers
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@1
    75
# Ha. cygwin host have an .exe suffix (extension) for executables.
yann@1
    76
[ "${CT_KERNEL}" = "cygwin" ] && EXEEXT=".exe" || EXEEXT=""
yann@1
    77
yann@1
    78
# Transform the ARCH into a kernel-understandable ARCH
yann@1
    79
case "${CT_ARCH}" in
yann@1
    80
    x86) CT_KERNEL_ARCH=i386;;
yann@1
    81
    ppc) CT_KERNL_ARCH=powerpc;;
yann@1
    82
    *)   CT_KERNEL_ARCH="${CT_ARCH}";;
yann@1
    83
esac
yann@1
    84
yann@1
    85
# Build up the TARGET_CFLAGS from user-provided options
yann@1
    86
tmp_target_CFLAGS=
yann@1
    87
[ -n "${CT_ARCH_CPU}" ]  && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mcpu=${CT_ARCH_CPU}"
yann@1
    88
[ -n "${CT_ARCH_TUNE}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mtune=${CT_ARCH_TUNE}"
yann@1
    89
[ -n "${CT_ARCH_ARCH}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -march=${CT_ARCH_ARCH}"
yann@1
    90
[ -n "${CT_ARCH_FPU}" ]  && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mfpu=${CT_ARCH_FPU}"
yann@1
    91
# Override with user-specified CFLAGS
yann@1
    92
CT_TARGET_CFLAGS="${tmp_target_CFLAGS} ${CT_TARGET_CFLAGS}"
yann@1
    93
yann@1
    94
# Help gcc
yann@1
    95
CT_CFLAGS_FOR_HOST=
yann@1
    96
[ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
yann@1
    97
yann@1
    98
# And help make go faster
yann@1
    99
PARALLELMFLAGS=
yann@1
   100
[ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
yann@1
   101
[ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
yann@1
   102
yann@1
   103
CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
yann@1
   104
CT_DoLog EXTRA "Building a toolchain for :"
yann@1
   105
CT_DoLog EXTRA "  build  = ${CT_BUILD}"
yann@1
   106
CT_DoLog EXTRA "  host   = ${CT_HOST}"
yann@1
   107
CT_DoLog EXTRA "  target = ${CT_TARGET}"
yann@1
   108
set |egrep '^CT_.+=' |sort |CT_DoLog DEBUG
yann@1
   109
CT_EndStep
yann@1
   110
yann@1
   111
# Now for the job by itself.
yann@1
   112
# Check the C library config ASAP, before the user gets bored, and is
yann@1
   113
# gone having his/her coffee
yann@1
   114
do_libc_check_config
yann@1
   115
do_kernel_check_config
yann@1
   116
do_kernel_headers
yann@1
   117
do_binutils
yann@1
   118
do_libc_headers
yann@1
   119
do_cc_core
yann@1
   120
do_libfloat
yann@1
   121
do_libc
yann@1
   122
do_cc
yann@1
   123
do_libc_finish