scripts/build/libc/glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Jan 03 23:40:22 2011 +0100 (2011-01-03)
changeset 2267 7af68e6083aa
parent 2181 a797ad9c7bd5
child 2272 0ff5b3570cd6
permissions -rw-r--r--
libc-glibc: remove 2.3.6

This is an obsolete version which is no longer used by any sample (the only
user, the ia64 sample, has been removed).

It also makes the code path a bit complex, with twists just to accomodate
that version. Removing the version will make those twists go away, and
will ease commonalisation of glibc and eglibc in the future (hopefully!).

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
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}                                              \
anthony@2154
   133
    CT_DoExecLog CFG                                            \
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@850
   147
    # Note: BOOTSTRAP_GCC (see above)
yann@850
   148
    libc_cv_ppc_machine=yes                         \
yann@850
   149
    CT_DoExecLog ALL                                \
yann@850
   150
    make cross-compiling=yes                        \
yann@850
   151
         install_root=${CT_SYSROOT_DIR}             \
yann@1551
   152
         CFLAGS="-O2 -DBOOTSTRAP_GCC"               \
yann@850
   153
         ${LIBC_SYSROOT_ARG}                        \
yann@850
   154
         OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"    \
yann@1395
   155
         PARALLELMFLAGS="${PARALLELMFLAGS}"         \
yann@850
   156
         install-headers
yann@850
   157
yann@850
   158
    # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
yann@850
   159
    # so do them by hand.  We can tolerate an empty stubs.h for the moment.
yann@850
   160
    # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
yann@850
   161
    mkdir -p "${CT_HEADERS_DIR}/gnu"
yann@850
   162
    CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
yann@1759
   163
    CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
yann@850
   164
                           "${CT_HEADERS_DIR}/features.h"
yann@850
   165
yann@850
   166
    # Building the bootstrap gcc requires either setting inhibit_libc, or
yann@850
   167
    # having a copy of stdio_lim.h... see
yann@850
   168
    # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
yann@850
   169
    CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
yann@850
   170
yann@850
   171
    # Following error building gcc-4.0.0's gcj:
yann@850
   172
    #  error: bits/syscall.h: No such file or directory
yann@850
   173
    # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
yann@850
   174
    # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
yann@850
   175
    [ "${CT_ARCH}" != "arm" ] && CT_DoExecLog ALL cp -v misc/syscall-list.h "${CT_HEADERS_DIR}/bits/syscall.h" || true
yann@850
   176
yann@850
   177
    # Those headers are to be manually copied so gcc can build properly
yann@1759
   178
    pthread_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/${CT_THREADS}/sysdeps/pthread/pthread.h"
yann@850
   179
    pthreadtypes_h=
yann@850
   180
    case "${CT_THREADS}" in
yann@850
   181
        nptl)
yann@850
   182
            # NOTE: for some archs, the pathes are different, but they are not
yann@850
   183
            # supported by crosstool-NG right now. See original crosstool when they are.
yann@1759
   184
            pthread_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/${CT_THREADS}/sysdeps/pthread/pthread.h"
yann@1759
   185
            pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/nptl/sysdeps/unix/sysv/linux/${arch4hdrs}/bits/pthreadtypes.h"
yann@850
   186
            if [ ! -f "${pthreadtypes_h}" ]; then
yann@1759
   187
                pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/ports/sysdeps/unix/sysv/linux/${arch4hdrs}/nptl/bits/pthreadtypes.h"
yann@850
   188
            fi
yann@850
   189
            ;;
yann@850
   190
        linuxthreads)
yann@1759
   191
            pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h"
yann@850
   192
            ;;
yann@850
   193
        *)
yann@850
   194
            pthread_h=
yann@850
   195
            pthreadtypes_h=
yann@850
   196
            ;;
yann@850
   197
    esac
yann@850
   198
    if [ -n "${pthread_h}" ]; then
yann@850
   199
        CT_DoExecLog ALL cp -v "${pthread_h}" "${CT_HEADERS_DIR}/pthread.h"
yann@850
   200
    fi
yann@850
   201
    if [ -n "${pthreadtypes_h}" ]; then
yann@850
   202
        CT_DoExecLog ALL cp -v "${pthreadtypes_h}" "${CT_HEADERS_DIR}/bits/pthreadtypes.h"
yann@850
   203
    fi
yann@850
   204
yann@850
   205
    CT_EndStep
yann@850
   206
}
yann@850
   207
yann@850
   208
# Build and install start files
yann@850
   209
do_libc_start_files() {
yann@1482
   210
    local -a extra_config
yann@1260
   211
yann@850
   212
    # Needed only in the NPTL case. Otherwise, return.
yann@850
   213
    [ "${CT_THREADS}" = "nptl" ] || return 0
yann@850
   214
yann@850
   215
    CT_DoStep INFO "Installing C library start files"
yann@850
   216
yann@850
   217
    mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles"
yann@850
   218
    cd "${CT_BUILD_DIR}/build-libc-startfiles"
yann@850
   219
yann@850
   220
    CT_DoLog EXTRA "Configuring C library"
yann@850
   221
yann@850
   222
    # Add some default glibc config options if not given by user.
yann@850
   223
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@850
   224
        *-tls*) ;;
yann@1482
   225
        *) extra_config+=("--with-tls")
yann@850
   226
    esac
yann@850
   227
    case "${CT_SHARED_LIBS}" in
yann@1482
   228
        y) extra_config+=("--enable-shared");;
yann@1482
   229
        *) extra_config+=("--disable-shared");;
yann@850
   230
    esac
yann@850
   231
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@1482
   232
        y,) extra_config+=("--with-fp");;
yann@1482
   233
        ,y) extra_config+=("--without-fp");;
yann@850
   234
    esac
yann@850
   235
    # Obviously, we want threads, as we come here only for NPTL
yann@1482
   236
    extra_config+=("--with-__thread")
yann@850
   237
yann@850
   238
    addons_config="--enable-add-ons=$(do_libc_add_ons_list ,)"
yann@1482
   239
    extra_config+=("${addons_config}")
yann@850
   240
yann@1482
   241
    extra_config+=("$(do_libc_min_kernel_config)")
yann@950
   242
yann@850
   243
    # Add some default CC args
yann@1762
   244
    glibc_version="$( grep -E '\<VERSION\>' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/version.h"  \
yann@1762
   245
                      |cut -d '"' -f 2
yann@1762
   246
                    )"
yann@1762
   247
    glibc_version_major=$(echo ${glibc_version} |sed -r -e 's/^([[:digit:]]+).*/\1/')
yann@1762
   248
    glibc_version_minor=$(echo ${glibc_version} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/')
yann@850
   249
    if [    ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6    \
yann@850
   250
         -o ${glibc_version_major} -gt 2                                    ]; then
yann@850
   251
        # Don't use -pipe: configure chokes on it for glibc >= 2.6.
yann@850
   252
        CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
yann@850
   253
        extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
yann@850
   254
    else
yann@850
   255
        extra_cc_args="${CT_CFLAGS_FOR_HOST}"
yann@850
   256
    fi
yann@850
   257
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   258
yann@850
   259
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   260
    CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
yann@850
   261
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@1482
   262
    CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
yann@850
   263
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   264
yann@1232
   265
    # Pre-seed the configparms file with values from the config option
yann@1627
   266
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@850
   267
yann@850
   268
    echo "libc_cv_forced_unwind=yes" > config.cache
yann@850
   269
    echo "libc_cv_c_cleanup=yes" >> config.cache
yann@850
   270
yann@850
   271
    # Please see the comment for the configure step in do_libc().
yann@850
   272
yann@1041
   273
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@1551
   274
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2"  \
yann@850
   275
    CC="${cross_cc} ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}"      \
yann@850
   276
    AR=${CT_TARGET}-ar                                              \
yann@850
   277
    RANLIB=${CT_TARGET}-ranlib                                      \
anthony@2154
   278
    CT_DoExecLog CFG                                                \
yann@1759
   279
    "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure"              \
yann@850
   280
        --prefix=/usr                                               \
yann@1041
   281
        --build="${CT_BUILD}"                                       \
yann@850
   282
        --host=${CT_TARGET}                                         \
yann@850
   283
        --without-cvs                                               \
yann@850
   284
        --disable-profile                                           \
yann@850
   285
        --disable-debug                                             \
yann@850
   286
        --without-gd                                                \
yann@850
   287
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@850
   288
        --cache-file=config.cache                                   \
yann@1482
   289
        "${extra_config[@]}"                                        \
yann@850
   290
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}
yann@850
   291
yann@850
   292
    #TODO: should check whether slibdir has been set in configparms to */lib64
yann@850
   293
    #      and copy the startfiles into the appropriate libdir.
yann@850
   294
    CT_DoLog EXTRA "Building C library start files"
yann@1395
   295
    CT_DoExecLog ALL make OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   296
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@1395
   297
                          csu/subdir_lib
yann@850
   298
yann@850
   299
    CT_DoLog EXTRA "Installing C library start files"
yann@850
   300
    if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@850
   301
        CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/usr/lib/"
yann@850
   302
    else
yann@850
   303
        CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/lib/"
yann@850
   304
    fi
yann@850
   305
yann@850
   306
    CT_EndStep
yann@850
   307
}
yann@850
   308
yann@850
   309
# This function builds and install the full glibc
yann@850
   310
do_libc() {
yann@1482
   311
    local -a extra_config
yann@1260
   312
yann@850
   313
    CT_DoStep INFO "Installing C library"
yann@850
   314
yann@850
   315
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@850
   316
    cd "${CT_BUILD_DIR}/build-libc"
yann@850
   317
yann@850
   318
    CT_DoLog EXTRA "Configuring C library"
yann@850
   319
yann@850
   320
    # Add some default glibc config options if not given by user.
yann@850
   321
    # We don't need to be conditional on wether the user did set different
yann@850
   322
    # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
yann@850
   323
yann@850
   324
    case "${CT_THREADS}" in
yann@1482
   325
        nptl)           extra_config+=("--with-__thread" "--with-tls");;
yann@1482
   326
        linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
yann@1482
   327
        none)           extra_config+=("--without-__thread" "--without-nptl")
yann@850
   328
                        case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@850
   329
                            *-tls*) ;;
yann@1482
   330
                            *) extra_config+=("--without-tls");;
yann@850
   331
                        esac
yann@850
   332
                        ;;
yann@850
   333
    esac
yann@850
   334
yann@850
   335
    case "${CT_SHARED_LIBS}" in
yann@1482
   336
        y) extra_config+=("--enable-shared");;
yann@1482
   337
        *) extra_config+=("--disable-shared");;
yann@850
   338
    esac
yann@850
   339
yann@850
   340
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
jimfriel@1486
   341
        y,) extra_config+=("--with-fp");;
jimfriel@1486
   342
        ,y) extra_config+=("--without-fp");;
yann@850
   343
    esac
yann@850
   344
bryanhundven@2180
   345
    if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
bryanhundven@2180
   346
        extra_config+=("--disable-versioning")
bryanhundven@2180
   347
    fi
bryanhundven@2180
   348
bryanhundven@2181
   349
    if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
bryanhundven@2181
   350
        extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
bryanhundven@2181
   351
    fi
bryanhundven@2181
   352
yann@850
   353
    case "$(do_libc_add_ons_list ,)" in
yann@850
   354
        "") ;;
yann@1482
   355
        *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
yann@850
   356
    esac
yann@850
   357
yann@1482
   358
    extra_config+=("$(do_libc_min_kernel_config)")
yann@950
   359
yann@850
   360
    # Add some default CC args
yann@1764
   361
    glibc_version="$( grep -E '\<VERSION\>' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/version.h"  \
yann@1764
   362
                      |cut -d '"' -f 2
yann@1764
   363
                    )"
yann@1764
   364
    glibc_version_major=$(echo ${glibc_version} |sed -r -e 's/^([[:digit:]]+).*/\1/')
yann@1764
   365
    glibc_version_minor=$(echo ${glibc_version} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/')
yann@850
   366
    if [    ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6    \
yann@850
   367
         -o ${glibc_version_major} -gt 2                                    ]; then
yann@850
   368
        # Don't use -pipe: configure chokes on it for glibc >= 2.6.
yann@850
   369
        CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
yann@850
   370
        extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
yann@850
   371
    else
yann@850
   372
        extra_cc_args="${CT_CFLAGS_FOR_HOST}"
yann@850
   373
    fi
yann@850
   374
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   375
yann@850
   376
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   377
    CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
yann@850
   378
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@850
   379
    CT_DoLog DEBUG "Extra config args passed: '${extra_config}'"
yann@850
   380
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   381
yann@1232
   382
    # Pre-seed the configparms file with values from the config option
yann@1627
   383
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@850
   384
yann@850
   385
    # For glibc 2.3.4 and later we need to set some autoconf cache
yann@850
   386
    # variables, because nptl/sysdeps/pthread/configure.in does not
yann@850
   387
    # work when cross-compiling.
yann@850
   388
    if [ "${CT_THREADS}" = "nptl" ]; then
yann@850
   389
        echo libc_cv_forced_unwind=yes
yann@850
   390
        echo libc_cv_c_cleanup=yes
yann@850
   391
    fi >config.cache
yann@850
   392
yann@2002
   393
    # ./configure is mislead by our tools override wrapper for bash
yann@2002
   394
    # so just tell it where the real bash is _on_the_target_!
yann@2002
   395
    # Notes:
yann@2002
   396
    # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
yann@2002
   397
    # - ${BASH_SHELL}            is only used to set BASH
yann@2002
   398
    # - ${BASH}                  is only used to set the shebang
yann@2002
   399
    #                            in two scripts to run on the target
yann@2002
   400
    # So we can safely bypass bash detection at compile time.
yann@2002
   401
    # Should this change in a future glibc release, we'd better
yann@2002
   402
    # directly mangle the generated scripts _after_ they get built,
yann@2002
   403
    # or even after they get installed... glibc is such a sucker...
yann@2002
   404
    echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
yann@2002
   405
yann@850
   406
    # Configure with --prefix the way we want it on the target...
yann@850
   407
    # There are a whole lot of settings here.  You'll probably want
yann@850
   408
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
yann@850
   409
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@850
   410
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
yann@850
   411
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
yann@850
   412
    # Set BUILD_CC, or you won't be able to build datafiles
yann@850
   413
    # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
yann@850
   414
yann@850
   415
    # OK. I'm fed up with those folks telling me what I should do.
yann@850
   416
    # I don't configure nptl? Well, maybe that's purposedly because
yann@850
   417
    # I don't want nptl! --disable-sanity-checks will shut up those
yann@850
   418
    # silly messages. GNU folks again, he?
yann@850
   419
yann@1041
   420
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@1551
   421
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2"  \
yann@850
   422
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@850
   423
    AR=${CT_TARGET}-ar                                              \
yann@850
   424
    RANLIB=${CT_TARGET}-ranlib                                      \
anthony@2154
   425
    CT_DoExecLog CFG                                                \
yann@1759
   426
    "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure"              \
yann@850
   427
        --prefix=/usr                                               \
yann@1041
   428
        --build=${CT_BUILD}                                         \
yann@850
   429
        --host=${CT_TARGET}                                         \
yann@850
   430
        --without-cvs                                               \
yann@850
   431
        --disable-profile                                           \
yann@850
   432
        --disable-debug                                             \
yann@850
   433
        --without-gd                                                \
yann@850
   434
        --disable-sanity-checks                                     \
yann@850
   435
        --cache-file=config.cache                                   \
yann@850
   436
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@1482
   437
        "${extra_config[@]}"                                        \
yann@850
   438
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}
yann@850
   439
yann@1016
   440
    # glibc initial build hacks
yann@1016
   441
    # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
yann@1016
   442
    case "${CT_ARCH},${CT_ARCH_CPU}" in
yann@1016
   443
	powerpc,8??)
yann@1016
   444
	    CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
yann@1016
   445
	    GLIBC_INITIAL_BUILD_ASFLAGS="-DBROKEN_PPC_8xx_CPU15";;
yann@1016
   446
    esac
yann@1016
   447
yann@850
   448
    # If this fails with an error like this:
yann@850
   449
    # ...  linux/autoconf.h: No such file or directory 
yann@850
   450
    # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
yann@850
   451
    # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
yann@850
   452
    # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
yann@850
   453
    CT_DoLog EXTRA "Building C library"
yann@850
   454
    CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
yann@1395
   455
                          RANLIB=${CT_TARGET}-ranlib                \
yann@1395
   456
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   457
                          ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
yann@1395
   458
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@2267
   459
                          all
yann@850
   460
yann@850
   461
    CT_DoLog EXTRA "Installing C library"
yann@850
   462
    CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
yann@850
   463
                          ${LIBC_SYSROOT_ARG}                       \
yann@850
   464
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   465
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@2267
   466
                          install
yann@850
   467
yann@850
   468
    # This doesn't seem to work when building a crosscompiler,
yann@850
   469
    # as it tries to execute localedef using the just-built ld.so!?
yann@850
   470
    #CT_DoLog EXTRA "Installing locales"
yann@850
   471
    #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL
yann@850
   472
yann@850
   473
    # Fix problems in linker scripts.
yann@850
   474
    #
yann@872
   475
    # Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
yann@850
   476
    # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
yann@1037
   477
    # No need to look into the lib64/ dirs here and there, they point to the
yann@1037
   478
    # corresponding lib/ directories.
yann@850
   479
    #
yann@850
   480
    # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
yann@850
   481
    CT_DoLog EXTRA "Fixing C library linker scripts"
yann@850
   482
    for file in libc.so libpthread.so libgcc_s.so; do
yann@1037
   483
        for dir in lib usr/lib; do
yann@850
   484
            if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
yann@850
   485
                CT_DoExecLog ALL cp -v "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
yann@850
   486
                CT_DoLog DEBUG "Fixing '${CT_SYS_ROOT_DIR}/${dir}/${file}'"
yann@872
   487
                CT_DoExecLog ALL sed -i -r -e '/BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}"
yann@850
   488
            fi
yann@850
   489
        done
yann@850
   490
    done
yann@850
   491
yann@850
   492
    CT_EndStep
yann@850
   493
}
yann@850
   494
yann@850
   495
# This function finishes the glibc install
yann@850
   496
do_libc_finish() {
yann@2267
   497
    :
yann@850
   498
}
yann@850
   499
yann@850
   500
# Build up the addons list, separated with $1
yann@850
   501
do_libc_add_ons_list() {
yann@850
   502
    local sep="$1"
yann@950
   503
    local addons_list=$(echo "${CT_LIBC_ADDONS_LIST}" |sed -r -e "s/[ ,]/${sep}/g;")
yann@850
   504
    case "${CT_THREADS}" in
yann@850
   505
        none)   ;;
yann@850
   506
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@850
   507
    esac
yann@850
   508
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@950
   509
    # Remove duplicate, leading and trailing separators
yann@950
   510
    echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
yann@850
   511
}
yann@850
   512
yann@950
   513
# Builds up the minimum supported Linux kernel version
yann@950
   514
do_libc_min_kernel_config() {
yann@950
   515
    local min_kernel_config=
yann@950
   516
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@950
   517
        *enable-kernel*) ;;
yann@950
   518
        *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
yann@950
   519
                # We can't rely on the kernel version from the configuration,
yann@950
   520
                # because it might not be available if the user uses pre-installed
yann@950
   521
                # headers. On the other hand, both method will have the kernel
yann@950
   522
                # version installed in "usr/include/linux/version.h" in the sys-root.
yann@950
   523
                # Parse that instead of having two code-paths.
yann@950
   524
                version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
yann@1929
   525
                if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
yann@1929
   526
                    CT_Abort "Linux version is unavailable in installed headers files"
yann@1929
   527
                fi
yann@950
   528
                version_code=$(grep -E LINUX_VERSION_CODE "${version_code_file}" |cut -d ' ' -f 3)
yann@950
   529
                version=$(((version_code>>16)&0xFF))
yann@950
   530
                patchlevel=$(((version_code>>8)&0xFF))
yann@950
   531
                sublevel=$((version_code&0xFF))
yann@950
   532
                min_kernel_config="--enable-kernel=${version}.${patchlevel}.${sublevel}"
yann@950
   533
            elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
yann@950
   534
                # Trim the fourth part of the linux version, keeping only the first three numbers
yann@950
   535
                min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
yann@950
   536
            fi
yann@950
   537
            ;;
yann@950
   538
    esac
yann@950
   539
    echo "${min_kernel_config}"
yann@950
   540
}