scripts/build/libc/glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Sep 23 14:48:10 2008 +0000 (2008-09-23)
changeset 872 fd4bf138f08f
parent 852 c17bb66e2aa5
child 884 35302e8a3483
permissions -rw-r--r--
Bart De VOS pointed out that removing absolute paths from the libc linker scripts is plainly wrong.
It dates from dawn ages of the original crosstool code, and is not well explained. At that time, binutils might not understand the sysroot stuff, and it was necessary to remove absolute paths in that case.

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