scripts/build/libc/glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Jan 13 20:46:01 2010 +0100 (2010-01-13)
changeset 1732 6b2ae7804c6f
parent 1641 fce0c507c9e5
child 1747 8e8b72bdcea0
permissions -rw-r--r--
debug/gdb: staticaly link to ncurses for the native gdb

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