scripts/build/libc/glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Sep 04 17:27:16 2009 +0200 (2009-09-04)
changeset 1512 439a6b292917
parent 1482 d0d2d372fd46
child 1551 8c40b842e798
child 1557 a576367cac44
permissions -rw-r--r--
TODO: update

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