scripts/build/libc/glibc.sh
author Remy Bohmer <linux@bohmer.net>
Thu May 27 23:18:19 2010 +0200 (2010-05-27)
changeset 2060 51e4597b07fc
parent 1929 f5d5e279af95
child 2154 250cdcc86441
permissions -rw-r--r--
scripts: add option to strip all toolchain executables

To reduce filesizes of the toolchain and even improve build times
of projects to be build with this toolchain it is usefull to strip
the delivered toolchain executables. Since it is not likely that we
will debug the toolchain executables itself we do not need the
debug information inside the executables itself.

Signed-off-by: Remy Bohmer <linux@bohmer.net>
yann@850
     1
# This file adds functions to build glibc
yann@850
     2
# Copyright 2007 Yann E. MORIN
yann@850
     3
# Licensed under the GPL v2. See COPYING in the root of this package
yann@850
     4
yann@850
     5
# Download glibc
yann@850
     6
do_libc_get() {
yann@1260
     7
    local date
yann@1260
     8
    local version
yann@1482
     9
    local -a addons_list
yann@1482
    10
yann@1482
    11
    addons_list=($(do_libc_add_ons_list " "))
yann@1114
    12
yann@1759
    13
    # Main source
yann@1759
    14
    CT_GetFile "glibc-${CT_LIBC_VERSION}"               \
yann@1759
    15
               {ftp,http}://ftp.gnu.org/gnu/glibc       \
yann@1759
    16
               ftp://gcc.gnu.org/pub/glibc/releases     \
yann@1759
    17
               ftp://gcc.gnu.org/pub/glibc/snapshots
yann@1759
    18
yann@1759
    19
    # C library addons
yann@1759
    20
    for addon in "${addons_list[@]}"; do
yann@1759
    21
        # NPTL addon is not to be downloaded, in any case
yann@1759
    22
        [ "${addon}" = "nptl" ] && continue || true
yann@1759
    23
        CT_GetFile "glibc-${addon}-${CT_LIBC_VERSION}"      \
yann@850
    24
                   {ftp,http}://ftp.gnu.org/gnu/glibc       \
yann@850
    25
                   ftp://gcc.gnu.org/pub/glibc/releases     \
yann@850
    26
                   ftp://gcc.gnu.org/pub/glibc/snapshots
yann@1759
    27
    done
yann@850
    28
yann@850
    29
    return 0
yann@850
    30
}
yann@850
    31
yann@850
    32
# Extract glibc
yann@850
    33
do_libc_extract() {
yann@1482
    34
    local -a addons_list
yann@1482
    35
yann@1482
    36
    addons_list=($(do_libc_add_ons_list " "))
yann@1260
    37
yann@1759
    38
    CT_Extract "glibc-${CT_LIBC_VERSION}"
yann@1260
    39
yann@1759
    40
    CT_Pushd "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}"
yann@1901
    41
    CT_Patch nochdir "glibc" "${CT_LIBC_VERSION}"
yann@850
    42
yann@850
    43
    # C library addons
yann@1482
    44
    for addon in "${addons_list[@]}"; do
yann@850
    45
        # NPTL addon is not to be extracted, in any case
yann@850
    46
        [ "${addon}" = "nptl" ] && continue || true
yann@1761
    47
        CT_Extract nochdir "glibc-${addon}-${CT_LIBC_VERSION}"
yann@1260
    48
yann@1126
    49
        # Some addons have the 'long' name, while others have the
yann@1126
    50
        # 'short' name, but patches are non-uniformly built with
yann@1126
    51
        # either the 'long' or 'short' name, whatever the addons name
yann@1126
    52
        # so we have to make symlinks from the existing to the missing
yann@1126
    53
        # Fortunately for us, [ -d foo ], when foo is a symlink to a
yann@1126
    54
        # directory, returns true!
yann@1759
    55
        [ -d "${addon}" ] || CT_DoExecLog ALL ln -s "glibc-${addon}-${CT_LIBC_VERSION}" "${addon}"
yann@1759
    56
        [ -d "glibc-${addon}-${CT_LIBC_VERSION}" ] || CT_DoExecLog ALL ln -s "${addon}" "glibc-${addon}-${CT_LIBC_VERSION}"
yann@1901
    57
        CT_Patch nochdir "glibc" "${addon}-${CT_LIBC_VERSION}"
yann@850
    58
    done
yann@850
    59
yann@884
    60
    # The configure files may be older than the configure.in files
yann@884
    61
    # if using a snapshot (or even some tarballs). Fake them being
yann@884
    62
    # up to date.
yann@1482
    63
    sleep 2
yann@1260
    64
    find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
yann@1260
    65
yann@1260
    66
    CT_Popd
yann@884
    67
yann@850
    68
    return 0
yann@850
    69
}
yann@850
    70
yann@850
    71
# There is nothing to do for glibc check config
yann@850
    72
do_libc_check_config() {
yann@850
    73
    :
yann@850
    74
}
yann@850
    75
yann@850
    76
# This function installs the glibc headers needed to build the core compiler
yann@850
    77
do_libc_headers() {
yann@1482
    78
    local -a extra_config
yann@1719
    79
    local arch4hdrs
yann@1260
    80
yann@850
    81
    CT_DoStep INFO "Installing C library headers"
yann@850
    82
yann@850
    83
    mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
yann@850
    84
    cd "${CT_BUILD_DIR}/build-libc-headers"
yann@850
    85
yann@850
    86
    CT_DoLog EXTRA "Configuring C library"
yann@850
    87
yann@1719
    88
    # The x86 arch needs special care... Bizarelly enough... :-(
yann@1747
    89
    case "${CT_ARCH}:${CT_ARCH_BITNESS}" in
yann@1719
    90
        x86:32) arch4hdrs="i386";;
yann@1719
    91
        x86:64) arch4hdrs="x86_64";;
yann@1747
    92
        *)      arch4hdrs="${CT_ARCH}";;
yann@1719
    93
    esac
yann@1719
    94
yann@850
    95
    # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions.
yann@850
    96
    # 1. override CC to keep glibc's configure from using $TARGET-gcc. 
yann@850
    97
    # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly
yann@850
    98
    # 3. build with gcc 3.2 or later
yann@850
    99
    # Compare these options with the ones used when building glibc for real below - they're different.
yann@850
   100
    # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode
yann@850
   101
    # so when configure checks to make sure gcc has access to the assembler you just built...
yann@850
   102
    # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path.
yann@850
   103
    # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet)
yann@850
   104
    # Note: the warning
yann@850
   105
    # "*** WARNING: Are you sure you do not want to use the `linuxthreads'"
yann@850
   106
    # *** add-on?"
yann@850
   107
    # is ok here, since all we want are the basic headers at this point.
yann@850
   108
    # Override libc_cv_ppc_machine so glibc-cvs doesn't complain
yann@850
   109
    # 'a version of binutils that supports .machine "altivec" is needed'.
yann@850
   110
yann@850
   111
    # We need to remove any threading addon when installing headers
yann@1482
   112
    addons_list="$(do_libc_add_ons_list " "                     \
yann@1482
   113
                   |sed -r -e 's/\<(nptl|linuxthreads)\>/ /g;'  \
yann@1482
   114
                           -e 's/ +/,/g; s/^,+//; s/,+$//;'     \
yann@1482
   115
                  )"
yann@850
   116
yann@1482
   117
    extra_config+=("--enable-add-ons=${addons_list}")
yann@1482
   118
yann@1482
   119
    extra_config+=("${addons_config}")
yann@1482
   120
    extra_config+=("$(do_libc_min_kernel_config)")
yann@852
   121
yann@1232
   122
    # Pre-seed the configparms file with values from the config option
yann@1627
   123
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@1232
   124
yann@850
   125
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   126
    CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
yann@1482
   127
    CT_DoLog DEBUG "Extra config passed : '${extra_config[*]}'"
yann@850
   128
yann@1260
   129
    libc_cv_ppc_machine=yes                                     \
yann@1641
   130
    libc_cv_mlong_double_128=yes                                \
yann@1641
   131
    libc_cv_mlong_double_128ibm=yes                             \
yann@1260
   132
    CC=${cross_cc}                                              \
yann@1260
   133
    CT_DoExecLog ALL                                            \
yann@1759
   134
    "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure"          \
yann@1260
   135
        --build="${CT_BUILD}"                                   \
yann@1260
   136
        --host="${CT_TARGET}"                                   \
yann@1260
   137
        --prefix=/usr                                           \
yann@1260
   138
        --with-headers="${CT_HEADERS_DIR}"                      \
yann@1260
   139
        --without-cvs                                           \
yann@1260
   140
        --disable-sanity-checks                                 \
yann@1260
   141
        --enable-hacker-mode                                    \
yann@1482
   142
        "${extra_config[@]}"                                    \
yann@850
   143
        --without-nptl
yann@850
   144
yann@850
   145
    CT_DoLog EXTRA "Installing C library headers"
yann@850
   146
yann@1759
   147
    if grep -q GLIBC_2.3 "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/ChangeLog"; then
yann@850
   148
        # glibc-2.3.x passes cross options to $(CC) when generating errlist-compat.c,
yann@850
   149
        # which fails without a real cross-compiler.
yann@850
   150
        # Fortunately, we don't need errlist-compat.c, since we just need .h
yann@850
   151
        # files, so work around this by creating a fake errlist-compat.c and
yann@850
   152
        # satisfying its dependencies.
yann@850
   153
        # Another workaround might be to tell configure to not use any cross
yann@850
   154
        # options to $(CC).
yann@850
   155
        # The real fix would be to get install-headers to not generate
yann@850
   156
        # errlist-compat.c.
yann@850
   157
        # Note: BOOTSTRAP_GCC is used by:
yann@850
   158
        # patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
yann@850
   159
yann@850
   160
        libc_cv_ppc_machine=yes                         \
yann@850
   161
        CT_DoExecLog ALL                                \
yann@1551
   162
        make CFLAGS="-O2 -DBOOTSTRAP_GCC"               \
yann@850
   163
             OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"    \
yann@1395
   164
             PARALLELMFLAGS="${PARALLELMFLAGS}"         \
yann@850
   165
             sysdeps/gnu/errlist.c
yann@850
   166
        mkdir -p stdio-common
yann@850
   167
yann@850
   168
        # sleep for 2 seconds for benefit of filesystems with lousy time
yann@850
   169
        # resolution, like FAT, so make knows for sure errlist-compat.c doesn't
yann@850
   170
        # need generating
yann@850
   171
        sleep 2
yann@850
   172
        CT_DoExecLog ALL touch stdio-common/errlist-compat.c
yann@850
   173
    fi
yann@850
   174
    # Note: BOOTSTRAP_GCC (see above)
yann@850
   175
    libc_cv_ppc_machine=yes                         \
yann@850
   176
    CT_DoExecLog ALL                                \
yann@850
   177
    make cross-compiling=yes                        \
yann@850
   178
         install_root=${CT_SYSROOT_DIR}             \
yann@1551
   179
         CFLAGS="-O2 -DBOOTSTRAP_GCC"               \
yann@850
   180
         ${LIBC_SYSROOT_ARG}                        \
yann@850
   181
         OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"    \
yann@1395
   182
         PARALLELMFLAGS="${PARALLELMFLAGS}"         \
yann@850
   183
         install-headers
yann@850
   184
yann@850
   185
    # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
yann@850
   186
    # so do them by hand.  We can tolerate an empty stubs.h for the moment.
yann@850
   187
    # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
yann@850
   188
    mkdir -p "${CT_HEADERS_DIR}/gnu"
yann@850
   189
    CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
yann@1759
   190
    CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
yann@850
   191
                           "${CT_HEADERS_DIR}/features.h"
yann@850
   192
yann@850
   193
    # Building the bootstrap gcc requires either setting inhibit_libc, or
yann@850
   194
    # having a copy of stdio_lim.h... see
yann@850
   195
    # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
yann@850
   196
    CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
yann@850
   197
yann@850
   198
    # Following error building gcc-4.0.0's gcj:
yann@850
   199
    #  error: bits/syscall.h: No such file or directory
yann@850
   200
    # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
yann@850
   201
    # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
yann@850
   202
    [ "${CT_ARCH}" != "arm" ] && CT_DoExecLog ALL cp -v misc/syscall-list.h "${CT_HEADERS_DIR}/bits/syscall.h" || true
yann@850
   203
yann@850
   204
    # Those headers are to be manually copied so gcc can build properly
yann@1759
   205
    pthread_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/${CT_THREADS}/sysdeps/pthread/pthread.h"
yann@850
   206
    pthreadtypes_h=
yann@850
   207
    case "${CT_THREADS}" in
yann@850
   208
        nptl)
yann@850
   209
            # NOTE: for some archs, the pathes are different, but they are not
yann@850
   210
            # supported by crosstool-NG right now. See original crosstool when they are.
yann@1759
   211
            pthread_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/${CT_THREADS}/sysdeps/pthread/pthread.h"
yann@1759
   212
            pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/nptl/sysdeps/unix/sysv/linux/${arch4hdrs}/bits/pthreadtypes.h"
yann@850
   213
            if [ ! -f "${pthreadtypes_h}" ]; then
yann@1759
   214
                pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/ports/sysdeps/unix/sysv/linux/${arch4hdrs}/nptl/bits/pthreadtypes.h"
yann@850
   215
            fi
yann@850
   216
            ;;
yann@850
   217
        linuxthreads)
yann@1759
   218
            pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h"
yann@850
   219
            ;;
yann@850
   220
        *)
yann@850
   221
            pthread_h=
yann@850
   222
            pthreadtypes_h=
yann@850
   223
            ;;
yann@850
   224
    esac
yann@850
   225
    if [ -n "${pthread_h}" ]; then
yann@850
   226
        CT_DoExecLog ALL cp -v "${pthread_h}" "${CT_HEADERS_DIR}/pthread.h"
yann@850
   227
    fi
yann@850
   228
    if [ -n "${pthreadtypes_h}" ]; then
yann@850
   229
        CT_DoExecLog ALL cp -v "${pthreadtypes_h}" "${CT_HEADERS_DIR}/bits/pthreadtypes.h"
yann@850
   230
    fi
yann@850
   231
yann@850
   232
    CT_EndStep
yann@850
   233
}
yann@850
   234
yann@850
   235
# Build and install start files
yann@850
   236
do_libc_start_files() {
yann@1482
   237
    local -a extra_config
yann@1260
   238
yann@850
   239
    # Needed only in the NPTL case. Otherwise, return.
yann@850
   240
    [ "${CT_THREADS}" = "nptl" ] || return 0
yann@850
   241
yann@850
   242
    CT_DoStep INFO "Installing C library start files"
yann@850
   243
yann@850
   244
    mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles"
yann@850
   245
    cd "${CT_BUILD_DIR}/build-libc-startfiles"
yann@850
   246
yann@850
   247
    CT_DoLog EXTRA "Configuring C library"
yann@850
   248
yann@850
   249
    # Add some default glibc config options if not given by user.
yann@850
   250
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@850
   251
        *-tls*) ;;
yann@1482
   252
        *) extra_config+=("--with-tls")
yann@850
   253
    esac
yann@850
   254
    case "${CT_SHARED_LIBS}" in
yann@1482
   255
        y) extra_config+=("--enable-shared");;
yann@1482
   256
        *) extra_config+=("--disable-shared");;
yann@850
   257
    esac
yann@850
   258
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@1482
   259
        y,) extra_config+=("--with-fp");;
yann@1482
   260
        ,y) extra_config+=("--without-fp");;
yann@850
   261
    esac
yann@850
   262
    # Obviously, we want threads, as we come here only for NPTL
yann@1482
   263
    extra_config+=("--with-__thread")
yann@850
   264
yann@850
   265
    addons_config="--enable-add-ons=$(do_libc_add_ons_list ,)"
yann@1482
   266
    extra_config+=("${addons_config}")
yann@850
   267
yann@1482
   268
    extra_config+=("$(do_libc_min_kernel_config)")
yann@950
   269
yann@850
   270
    # Add some default CC args
yann@1762
   271
    glibc_version="$( grep -E '\<VERSION\>' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/version.h"  \
yann@1762
   272
                      |cut -d '"' -f 2
yann@1762
   273
                    )"
yann@1762
   274
    glibc_version_major=$(echo ${glibc_version} |sed -r -e 's/^([[:digit:]]+).*/\1/')
yann@1762
   275
    glibc_version_minor=$(echo ${glibc_version} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/')
yann@850
   276
    if [    ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6    \
yann@850
   277
         -o ${glibc_version_major} -gt 2                                    ]; then
yann@850
   278
        # Don't use -pipe: configure chokes on it for glibc >= 2.6.
yann@850
   279
        CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
yann@850
   280
        extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
yann@850
   281
    else
yann@850
   282
        extra_cc_args="${CT_CFLAGS_FOR_HOST}"
yann@850
   283
    fi
yann@850
   284
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   285
yann@850
   286
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   287
    CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
yann@850
   288
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@1482
   289
    CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
yann@850
   290
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   291
yann@1232
   292
    # Pre-seed the configparms file with values from the config option
yann@1627
   293
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@850
   294
yann@850
   295
    echo "libc_cv_forced_unwind=yes" > config.cache
yann@850
   296
    echo "libc_cv_c_cleanup=yes" >> config.cache
yann@850
   297
yann@850
   298
    # Please see the comment for the configure step in do_libc().
yann@850
   299
yann@1041
   300
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@1551
   301
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2"  \
yann@850
   302
    CC="${cross_cc} ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}"      \
yann@850
   303
    AR=${CT_TARGET}-ar                                              \
yann@850
   304
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@850
   305
    CT_DoExecLog ALL                                                \
yann@1759
   306
    "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure"              \
yann@850
   307
        --prefix=/usr                                               \
yann@1041
   308
        --build="${CT_BUILD}"                                       \
yann@850
   309
        --host=${CT_TARGET}                                         \
yann@850
   310
        --without-cvs                                               \
yann@850
   311
        --disable-profile                                           \
yann@850
   312
        --disable-debug                                             \
yann@850
   313
        --without-gd                                                \
yann@850
   314
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@850
   315
        --cache-file=config.cache                                   \
yann@1482
   316
        "${extra_config[@]}"                                        \
yann@850
   317
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}
yann@850
   318
yann@850
   319
    #TODO: should check whether slibdir has been set in configparms to */lib64
yann@850
   320
    #      and copy the startfiles into the appropriate libdir.
yann@850
   321
    CT_DoLog EXTRA "Building C library start files"
yann@1395
   322
    CT_DoExecLog ALL make OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   323
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@1395
   324
                          csu/subdir_lib
yann@850
   325
yann@850
   326
    CT_DoLog EXTRA "Installing C library start files"
yann@850
   327
    if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@850
   328
        CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/usr/lib/"
yann@850
   329
    else
yann@850
   330
        CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/lib/"
yann@850
   331
    fi
yann@850
   332
yann@850
   333
    CT_EndStep
yann@850
   334
}
yann@850
   335
yann@850
   336
# This function builds and install the full glibc
yann@850
   337
do_libc() {
yann@1482
   338
    local -a extra_config
yann@1260
   339
yann@850
   340
    CT_DoStep INFO "Installing C library"
yann@850
   341
yann@850
   342
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@850
   343
    cd "${CT_BUILD_DIR}/build-libc"
yann@850
   344
yann@850
   345
    CT_DoLog EXTRA "Configuring C library"
yann@850
   346
yann@850
   347
    # Add some default glibc config options if not given by user.
yann@850
   348
    # We don't need to be conditional on wether the user did set different
yann@850
   349
    # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
yann@850
   350
yann@850
   351
    case "${CT_THREADS}" in
yann@1482
   352
        nptl)           extra_config+=("--with-__thread" "--with-tls");;
yann@1482
   353
        linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
yann@1482
   354
        none)           extra_config+=("--without-__thread" "--without-nptl")
yann@850
   355
                        case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@850
   356
                            *-tls*) ;;
yann@1482
   357
                            *) extra_config+=("--without-tls");;
yann@850
   358
                        esac
yann@850
   359
                        ;;
yann@850
   360
    esac
yann@850
   361
yann@850
   362
    case "${CT_SHARED_LIBS}" in
yann@1482
   363
        y) extra_config+=("--enable-shared");;
yann@1482
   364
        *) extra_config+=("--disable-shared");;
yann@850
   365
    esac
yann@850
   366
yann@850
   367
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
jimfriel@1486
   368
        y,) extra_config+=("--with-fp");;
jimfriel@1486
   369
        ,y) extra_config+=("--without-fp");;
yann@850
   370
    esac
yann@850
   371
yann@850
   372
    case "$(do_libc_add_ons_list ,)" in
yann@850
   373
        "") ;;
yann@1482
   374
        *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
yann@850
   375
    esac
yann@850
   376
yann@1482
   377
    extra_config+=("$(do_libc_min_kernel_config)")
yann@950
   378
yann@850
   379
    # Add some default CC args
yann@1764
   380
    glibc_version="$( grep -E '\<VERSION\>' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/version.h"  \
yann@1764
   381
                      |cut -d '"' -f 2
yann@1764
   382
                    )"
yann@1764
   383
    glibc_version_major=$(echo ${glibc_version} |sed -r -e 's/^([[:digit:]]+).*/\1/')
yann@1764
   384
    glibc_version_minor=$(echo ${glibc_version} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/')
yann@850
   385
    if [    ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6    \
yann@850
   386
         -o ${glibc_version_major} -gt 2                                    ]; then
yann@850
   387
        # Don't use -pipe: configure chokes on it for glibc >= 2.6.
yann@850
   388
        CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
yann@850
   389
        extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
yann@850
   390
    else
yann@850
   391
        extra_cc_args="${CT_CFLAGS_FOR_HOST}"
yann@850
   392
    fi
yann@850
   393
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   394
yann@850
   395
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   396
    CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
yann@850
   397
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@850
   398
    CT_DoLog DEBUG "Extra config args passed: '${extra_config}'"
yann@850
   399
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   400
yann@1232
   401
    # Pre-seed the configparms file with values from the config option
yann@1627
   402
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@850
   403
yann@850
   404
    # For glibc 2.3.4 and later we need to set some autoconf cache
yann@850
   405
    # variables, because nptl/sysdeps/pthread/configure.in does not
yann@850
   406
    # work when cross-compiling.
yann@850
   407
    if [ "${CT_THREADS}" = "nptl" ]; then
yann@850
   408
        echo libc_cv_forced_unwind=yes
yann@850
   409
        echo libc_cv_c_cleanup=yes
yann@850
   410
    fi >config.cache
yann@850
   411
yann@2002
   412
    # ./configure is mislead by our tools override wrapper for bash
yann@2002
   413
    # so just tell it where the real bash is _on_the_target_!
yann@2002
   414
    # Notes:
yann@2002
   415
    # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
yann@2002
   416
    # - ${BASH_SHELL}            is only used to set BASH
yann@2002
   417
    # - ${BASH}                  is only used to set the shebang
yann@2002
   418
    #                            in two scripts to run on the target
yann@2002
   419
    # So we can safely bypass bash detection at compile time.
yann@2002
   420
    # Should this change in a future glibc release, we'd better
yann@2002
   421
    # directly mangle the generated scripts _after_ they get built,
yann@2002
   422
    # or even after they get installed... glibc is such a sucker...
yann@2002
   423
    echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
yann@2002
   424
yann@850
   425
    # Configure with --prefix the way we want it on the target...
yann@850
   426
    # There are a whole lot of settings here.  You'll probably want
yann@850
   427
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
yann@850
   428
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@850
   429
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
yann@850
   430
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
yann@850
   431
    # Set BUILD_CC, or you won't be able to build datafiles
yann@850
   432
    # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
yann@850
   433
yann@850
   434
    # OK. I'm fed up with those folks telling me what I should do.
yann@850
   435
    # I don't configure nptl? Well, maybe that's purposedly because
yann@850
   436
    # I don't want nptl! --disable-sanity-checks will shut up those
yann@850
   437
    # silly messages. GNU folks again, he?
yann@850
   438
yann@1041
   439
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@1551
   440
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2"  \
yann@850
   441
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@850
   442
    AR=${CT_TARGET}-ar                                              \
yann@850
   443
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@850
   444
    CT_DoExecLog ALL                                                \
yann@1759
   445
    "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure"              \
yann@850
   446
        --prefix=/usr                                               \
yann@1041
   447
        --build=${CT_BUILD}                                         \
yann@850
   448
        --host=${CT_TARGET}                                         \
yann@850
   449
        --without-cvs                                               \
yann@850
   450
        --disable-profile                                           \
yann@850
   451
        --disable-debug                                             \
yann@850
   452
        --without-gd                                                \
yann@850
   453
        --disable-sanity-checks                                     \
yann@850
   454
        --cache-file=config.cache                                   \
yann@850
   455
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@1482
   456
        "${extra_config[@]}"                                        \
yann@850
   457
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}
yann@850
   458
yann@1759
   459
    if grep -l '^install-lib-all:' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/Makerules" > /dev/null; then
yann@850
   460
        # nptl-era glibc.
yann@850
   461
        # If the install-lib-all target (which is added by our make-install-lib-all.patch)
yann@850
   462
        # is present, it means we're building glibc-2.3.3 or later, and we can't
yann@850
   463
        # build programs yet, as they require libeh, which won't be installed
yann@850
   464
        # until full build of gcc
yann@850
   465
        # YEM-FIXME: This comment is misleading: latest glibc-s do not have the
yann@850
   466
        #            make-install-lib-all.patch applied, so do not pass through this
yann@850
   467
        #            part of the if statement; nonetheless, they do build, and
yann@850
   468
        #            the result is useable (maybe the dual-pass core gcc is
yann@850
   469
        #            responsible for this).
yann@850
   470
        GLIBC_INITIAL_BUILD_RULE=lib
yann@850
   471
        GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
yann@850
   472
        GLIBC_INSTALL_APPS_LATER=yes
yann@850
   473
    else
yann@850
   474
        # classic glibc.  
yann@850
   475
        # We can build and install everything with the bootstrap compiler.
yann@850
   476
        # YEM-FIXME: See the above FIXME as well.
yann@850
   477
        GLIBC_INITIAL_BUILD_RULE=all
yann@850
   478
        GLIBC_INITIAL_INSTALL_RULE=install
yann@850
   479
        GLIBC_INSTALL_APPS_LATER=no
yann@850
   480
    fi
yann@850
   481
yann@1016
   482
    # glibc initial build hacks
yann@1016
   483
    # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
yann@1016
   484
    case "${CT_ARCH},${CT_ARCH_CPU}" in
yann@1016
   485
	powerpc,8??)
yann@1016
   486
	    CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
yann@1016
   487
	    GLIBC_INITIAL_BUILD_ASFLAGS="-DBROKEN_PPC_8xx_CPU15";;
yann@1016
   488
    esac
yann@1016
   489
yann@850
   490
    # If this fails with an error like this:
yann@850
   491
    # ...  linux/autoconf.h: No such file or directory 
yann@850
   492
    # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
yann@850
   493
    # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
yann@850
   494
    # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
yann@850
   495
    CT_DoLog EXTRA "Building C library"
yann@850
   496
    CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
yann@1395
   497
                          RANLIB=${CT_TARGET}-ranlib                \
yann@1395
   498
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   499
                          ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
yann@1395
   500
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@1395
   501
                          ${GLIBC_INITIAL_BUILD_RULE}
yann@850
   502
yann@850
   503
    CT_DoLog EXTRA "Installing C library"
yann@850
   504
    CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
yann@850
   505
                          ${LIBC_SYSROOT_ARG}                       \
yann@850
   506
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   507
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@850
   508
                          ${GLIBC_INITIAL_INSTALL_RULE}
yann@850
   509
yann@850
   510
    # This doesn't seem to work when building a crosscompiler,
yann@850
   511
    # as it tries to execute localedef using the just-built ld.so!?
yann@850
   512
    #CT_DoLog EXTRA "Installing locales"
yann@850
   513
    #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL
yann@850
   514
yann@850
   515
    # Fix problems in linker scripts.
yann@850
   516
    #
yann@872
   517
    # Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
yann@850
   518
    # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
yann@1037
   519
    # No need to look into the lib64/ dirs here and there, they point to the
yann@1037
   520
    # corresponding lib/ directories.
yann@850
   521
    #
yann@850
   522
    # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
yann@850
   523
    CT_DoLog EXTRA "Fixing C library linker scripts"
yann@850
   524
    for file in libc.so libpthread.so libgcc_s.so; do
yann@1037
   525
        for dir in lib usr/lib; do
yann@850
   526
            if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
yann@850
   527
                CT_DoExecLog ALL cp -v "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
yann@850
   528
                CT_DoLog DEBUG "Fixing '${CT_SYS_ROOT_DIR}/${dir}/${file}'"
yann@872
   529
                CT_DoExecLog ALL sed -i -r -e '/BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}"
yann@850
   530
            fi
yann@850
   531
        done
yann@850
   532
    done
yann@850
   533
yann@850
   534
    CT_EndStep
yann@850
   535
}
yann@850
   536
yann@850
   537
# This function finishes the glibc install
yann@850
   538
do_libc_finish() {
yann@850
   539
    # Finally, build and install glibc programs, now that libeh (if any) is installed
yann@850
   540
    # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
yann@850
   541
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
yann@850
   542
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
yann@850
   543
    [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
yann@850
   544
yann@850
   545
    CT_DoStep INFO "Finishing C library"
yann@850
   546
yann@850
   547
    cd "${CT_BUILD_DIR}/build-libc"
yann@850
   548
yann@850
   549
    CT_DoLog EXTRA "Re-building C library"
yann@1395
   550
    CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
yann@1395
   551
                          RANLIB=${CT_TARGET}-ranlib                \
yann@1395
   552
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   553
                          ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
yann@1395
   554
                          PARALLELMFLAGS="${PARALLELMFLAGS}"
yann@850
   555
yann@850
   556
    CT_DoLog EXTRA "Installing missing C library components"
yann@850
   557
    # note: should do full install and then fix linker scripts, but this is faster
yann@850
   558
    for t in bin rootsbin sbin data others; do
yann@850
   559
        CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
yann@850
   560
                              ${LIBC_SYSROOT_ARG}                       \
yann@850
   561
                              OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   562
                              PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@850
   563
                              install-${t}
yann@850
   564
    done
yann@850
   565
yann@850
   566
    CT_EndStep
yann@850
   567
}
yann@850
   568
yann@850
   569
# Build up the addons list, separated with $1
yann@850
   570
do_libc_add_ons_list() {
yann@850
   571
    local sep="$1"
yann@950
   572
    local addons_list=$(echo "${CT_LIBC_ADDONS_LIST}" |sed -r -e "s/[ ,]/${sep}/g;")
yann@850
   573
    case "${CT_THREADS}" in
yann@850
   574
        none)   ;;
yann@850
   575
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@850
   576
    esac
yann@850
   577
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@950
   578
    # Remove duplicate, leading and trailing separators
yann@950
   579
    echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
yann@850
   580
}
yann@850
   581
yann@950
   582
# Builds up the minimum supported Linux kernel version
yann@950
   583
do_libc_min_kernel_config() {
yann@950
   584
    local min_kernel_config=
yann@950
   585
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@950
   586
        *enable-kernel*) ;;
yann@950
   587
        *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
yann@950
   588
                # We can't rely on the kernel version from the configuration,
yann@950
   589
                # because it might not be available if the user uses pre-installed
yann@950
   590
                # headers. On the other hand, both method will have the kernel
yann@950
   591
                # version installed in "usr/include/linux/version.h" in the sys-root.
yann@950
   592
                # Parse that instead of having two code-paths.
yann@950
   593
                version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
yann@1929
   594
                if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
yann@1929
   595
                    CT_Abort "Linux version is unavailable in installed headers files"
yann@1929
   596
                fi
yann@950
   597
                version_code=$(grep -E LINUX_VERSION_CODE "${version_code_file}" |cut -d ' ' -f 3)
yann@950
   598
                version=$(((version_code>>16)&0xFF))
yann@950
   599
                patchlevel=$(((version_code>>8)&0xFF))
yann@950
   600
                sublevel=$((version_code&0xFF))
yann@950
   601
                min_kernel_config="--enable-kernel=${version}.${patchlevel}.${sublevel}"
yann@950
   602
            elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
yann@950
   603
                # Trim the fourth part of the linux version, keeping only the first three numbers
yann@950
   604
                min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
yann@950
   605
            fi
yann@950
   606
            ;;
yann@950
   607
    esac
yann@950
   608
    echo "${min_kernel_config}"
yann@950
   609
}