scripts/build/libc/glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Nov 16 17:49:15 2010 +0100 (2010-11-16)
changeset 2204 ea1c9143e1e3
parent 2180 d3af3efce68c
child 2267 7af68e6083aa
permissions -rw-r--r--
scripts: call curl and wget in sequence

It can happen, in some circumpstances, than one can succeed where
the other would fail. Those cases involves convoluted enterprise
networks with proxies playing tricks.

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@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                                      \
anthony@2154
   305
    CT_DoExecLog CFG                                                \
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
bryanhundven@2180
   372
    if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
bryanhundven@2180
   373
        extra_config+=("--disable-versioning")
bryanhundven@2180
   374
    fi
bryanhundven@2180
   375
bryanhundven@2181
   376
    if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
bryanhundven@2181
   377
        extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
bryanhundven@2181
   378
    fi
bryanhundven@2181
   379
yann@850
   380
    case "$(do_libc_add_ons_list ,)" in
yann@850
   381
        "") ;;
yann@1482
   382
        *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
yann@850
   383
    esac
yann@850
   384
yann@1482
   385
    extra_config+=("$(do_libc_min_kernel_config)")
yann@950
   386
yann@850
   387
    # Add some default CC args
yann@1764
   388
    glibc_version="$( grep -E '\<VERSION\>' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/version.h"  \
yann@1764
   389
                      |cut -d '"' -f 2
yann@1764
   390
                    )"
yann@1764
   391
    glibc_version_major=$(echo ${glibc_version} |sed -r -e 's/^([[:digit:]]+).*/\1/')
yann@1764
   392
    glibc_version_minor=$(echo ${glibc_version} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/')
yann@850
   393
    if [    ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6    \
yann@850
   394
         -o ${glibc_version_major} -gt 2                                    ]; then
yann@850
   395
        # Don't use -pipe: configure chokes on it for glibc >= 2.6.
yann@850
   396
        CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
yann@850
   397
        extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
yann@850
   398
    else
yann@850
   399
        extra_cc_args="${CT_CFLAGS_FOR_HOST}"
yann@850
   400
    fi
yann@850
   401
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   402
yann@850
   403
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   404
    CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
yann@850
   405
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@850
   406
    CT_DoLog DEBUG "Extra config args passed: '${extra_config}'"
yann@850
   407
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   408
yann@1232
   409
    # Pre-seed the configparms file with values from the config option
yann@1627
   410
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@850
   411
yann@850
   412
    # For glibc 2.3.4 and later we need to set some autoconf cache
yann@850
   413
    # variables, because nptl/sysdeps/pthread/configure.in does not
yann@850
   414
    # work when cross-compiling.
yann@850
   415
    if [ "${CT_THREADS}" = "nptl" ]; then
yann@850
   416
        echo libc_cv_forced_unwind=yes
yann@850
   417
        echo libc_cv_c_cleanup=yes
yann@850
   418
    fi >config.cache
yann@850
   419
yann@2002
   420
    # ./configure is mislead by our tools override wrapper for bash
yann@2002
   421
    # so just tell it where the real bash is _on_the_target_!
yann@2002
   422
    # Notes:
yann@2002
   423
    # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
yann@2002
   424
    # - ${BASH_SHELL}            is only used to set BASH
yann@2002
   425
    # - ${BASH}                  is only used to set the shebang
yann@2002
   426
    #                            in two scripts to run on the target
yann@2002
   427
    # So we can safely bypass bash detection at compile time.
yann@2002
   428
    # Should this change in a future glibc release, we'd better
yann@2002
   429
    # directly mangle the generated scripts _after_ they get built,
yann@2002
   430
    # or even after they get installed... glibc is such a sucker...
yann@2002
   431
    echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
yann@2002
   432
yann@850
   433
    # Configure with --prefix the way we want it on the target...
yann@850
   434
    # There are a whole lot of settings here.  You'll probably want
yann@850
   435
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
yann@850
   436
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@850
   437
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
yann@850
   438
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
yann@850
   439
    # Set BUILD_CC, or you won't be able to build datafiles
yann@850
   440
    # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
yann@850
   441
yann@850
   442
    # OK. I'm fed up with those folks telling me what I should do.
yann@850
   443
    # I don't configure nptl? Well, maybe that's purposedly because
yann@850
   444
    # I don't want nptl! --disable-sanity-checks will shut up those
yann@850
   445
    # silly messages. GNU folks again, he?
yann@850
   446
yann@1041
   447
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@1551
   448
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2"  \
yann@850
   449
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@850
   450
    AR=${CT_TARGET}-ar                                              \
yann@850
   451
    RANLIB=${CT_TARGET}-ranlib                                      \
anthony@2154
   452
    CT_DoExecLog CFG                                                \
yann@1759
   453
    "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure"              \
yann@850
   454
        --prefix=/usr                                               \
yann@1041
   455
        --build=${CT_BUILD}                                         \
yann@850
   456
        --host=${CT_TARGET}                                         \
yann@850
   457
        --without-cvs                                               \
yann@850
   458
        --disable-profile                                           \
yann@850
   459
        --disable-debug                                             \
yann@850
   460
        --without-gd                                                \
yann@850
   461
        --disable-sanity-checks                                     \
yann@850
   462
        --cache-file=config.cache                                   \
yann@850
   463
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@1482
   464
        "${extra_config[@]}"                                        \
yann@850
   465
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}
yann@850
   466
yann@1759
   467
    if grep -l '^install-lib-all:' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/Makerules" > /dev/null; then
yann@850
   468
        # nptl-era glibc.
yann@850
   469
        # If the install-lib-all target (which is added by our make-install-lib-all.patch)
yann@850
   470
        # is present, it means we're building glibc-2.3.3 or later, and we can't
yann@850
   471
        # build programs yet, as they require libeh, which won't be installed
yann@850
   472
        # until full build of gcc
yann@850
   473
        # YEM-FIXME: This comment is misleading: latest glibc-s do not have the
yann@850
   474
        #            make-install-lib-all.patch applied, so do not pass through this
yann@850
   475
        #            part of the if statement; nonetheless, they do build, and
yann@850
   476
        #            the result is useable (maybe the dual-pass core gcc is
yann@850
   477
        #            responsible for this).
yann@850
   478
        GLIBC_INITIAL_BUILD_RULE=lib
yann@850
   479
        GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
yann@850
   480
        GLIBC_INSTALL_APPS_LATER=yes
yann@850
   481
    else
yann@850
   482
        # classic glibc.  
yann@850
   483
        # We can build and install everything with the bootstrap compiler.
yann@850
   484
        # YEM-FIXME: See the above FIXME as well.
yann@850
   485
        GLIBC_INITIAL_BUILD_RULE=all
yann@850
   486
        GLIBC_INITIAL_INSTALL_RULE=install
yann@850
   487
        GLIBC_INSTALL_APPS_LATER=no
yann@850
   488
    fi
yann@850
   489
yann@1016
   490
    # glibc initial build hacks
yann@1016
   491
    # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
yann@1016
   492
    case "${CT_ARCH},${CT_ARCH_CPU}" in
yann@1016
   493
	powerpc,8??)
yann@1016
   494
	    CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
yann@1016
   495
	    GLIBC_INITIAL_BUILD_ASFLAGS="-DBROKEN_PPC_8xx_CPU15";;
yann@1016
   496
    esac
yann@1016
   497
yann@850
   498
    # If this fails with an error like this:
yann@850
   499
    # ...  linux/autoconf.h: No such file or directory 
yann@850
   500
    # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
yann@850
   501
    # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
yann@850
   502
    # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
yann@850
   503
    CT_DoLog EXTRA "Building C library"
yann@850
   504
    CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
yann@1395
   505
                          RANLIB=${CT_TARGET}-ranlib                \
yann@1395
   506
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   507
                          ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
yann@1395
   508
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@1395
   509
                          ${GLIBC_INITIAL_BUILD_RULE}
yann@850
   510
yann@850
   511
    CT_DoLog EXTRA "Installing C library"
yann@850
   512
    CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
yann@850
   513
                          ${LIBC_SYSROOT_ARG}                       \
yann@850
   514
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   515
                          PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@850
   516
                          ${GLIBC_INITIAL_INSTALL_RULE}
yann@850
   517
yann@850
   518
    # This doesn't seem to work when building a crosscompiler,
yann@850
   519
    # as it tries to execute localedef using the just-built ld.so!?
yann@850
   520
    #CT_DoLog EXTRA "Installing locales"
yann@850
   521
    #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL
yann@850
   522
yann@850
   523
    # Fix problems in linker scripts.
yann@850
   524
    #
yann@872
   525
    # Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
yann@850
   526
    # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
yann@1037
   527
    # No need to look into the lib64/ dirs here and there, they point to the
yann@1037
   528
    # corresponding lib/ directories.
yann@850
   529
    #
yann@850
   530
    # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
yann@850
   531
    CT_DoLog EXTRA "Fixing C library linker scripts"
yann@850
   532
    for file in libc.so libpthread.so libgcc_s.so; do
yann@1037
   533
        for dir in lib usr/lib; do
yann@850
   534
            if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
yann@850
   535
                CT_DoExecLog ALL cp -v "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
yann@850
   536
                CT_DoLog DEBUG "Fixing '${CT_SYS_ROOT_DIR}/${dir}/${file}'"
yann@872
   537
                CT_DoExecLog ALL sed -i -r -e '/BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}"
yann@850
   538
            fi
yann@850
   539
        done
yann@850
   540
    done
yann@850
   541
yann@850
   542
    CT_EndStep
yann@850
   543
}
yann@850
   544
yann@850
   545
# This function finishes the glibc install
yann@850
   546
do_libc_finish() {
yann@850
   547
    # Finally, build and install glibc programs, now that libeh (if any) is installed
yann@850
   548
    # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
yann@850
   549
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
yann@850
   550
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
yann@850
   551
    [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
yann@850
   552
yann@850
   553
    CT_DoStep INFO "Finishing C library"
yann@850
   554
yann@850
   555
    cd "${CT_BUILD_DIR}/build-libc"
yann@850
   556
yann@850
   557
    CT_DoLog EXTRA "Re-building C library"
yann@1395
   558
    CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
yann@1395
   559
                          RANLIB=${CT_TARGET}-ranlib                \
yann@1395
   560
                          OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   561
                          ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
yann@1395
   562
                          PARALLELMFLAGS="${PARALLELMFLAGS}"
yann@850
   563
yann@850
   564
    CT_DoLog EXTRA "Installing missing C library components"
yann@850
   565
    # note: should do full install and then fix linker scripts, but this is faster
yann@850
   566
    for t in bin rootsbin sbin data others; do
yann@850
   567
        CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
yann@850
   568
                              ${LIBC_SYSROOT_ARG}                       \
yann@850
   569
                              OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
yann@1395
   570
                              PARALLELMFLAGS="${PARALLELMFLAGS}"        \
yann@850
   571
                              install-${t}
yann@850
   572
    done
yann@850
   573
yann@850
   574
    CT_EndStep
yann@850
   575
}
yann@850
   576
yann@850
   577
# Build up the addons list, separated with $1
yann@850
   578
do_libc_add_ons_list() {
yann@850
   579
    local sep="$1"
yann@950
   580
    local addons_list=$(echo "${CT_LIBC_ADDONS_LIST}" |sed -r -e "s/[ ,]/${sep}/g;")
yann@850
   581
    case "${CT_THREADS}" in
yann@850
   582
        none)   ;;
yann@850
   583
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@850
   584
    esac
yann@850
   585
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@950
   586
    # Remove duplicate, leading and trailing separators
yann@950
   587
    echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
yann@850
   588
}
yann@850
   589
yann@950
   590
# Builds up the minimum supported Linux kernel version
yann@950
   591
do_libc_min_kernel_config() {
yann@950
   592
    local min_kernel_config=
yann@950
   593
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@950
   594
        *enable-kernel*) ;;
yann@950
   595
        *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
yann@950
   596
                # We can't rely on the kernel version from the configuration,
yann@950
   597
                # because it might not be available if the user uses pre-installed
yann@950
   598
                # headers. On the other hand, both method will have the kernel
yann@950
   599
                # version installed in "usr/include/linux/version.h" in the sys-root.
yann@950
   600
                # Parse that instead of having two code-paths.
yann@950
   601
                version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
yann@1929
   602
                if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
yann@1929
   603
                    CT_Abort "Linux version is unavailable in installed headers files"
yann@1929
   604
                fi
yann@950
   605
                version_code=$(grep -E LINUX_VERSION_CODE "${version_code_file}" |cut -d ' ' -f 3)
yann@950
   606
                version=$(((version_code>>16)&0xFF))
yann@950
   607
                patchlevel=$(((version_code>>8)&0xFF))
yann@950
   608
                sublevel=$((version_code&0xFF))
yann@950
   609
                min_kernel_config="--enable-kernel=${version}.${patchlevel}.${sublevel}"
yann@950
   610
            elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
yann@950
   611
                # Trim the fourth part of the linux version, keeping only the first three numbers
yann@950
   612
                min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
yann@950
   613
            fi
yann@950
   614
            ;;
yann@950
   615
    esac
yann@950
   616
    echo "${min_kernel_config}"
yann@950
   617
}