scripts/build/libc_glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 13 10:32:38 2008 +0000 (2008-07-13)
changeset 645 8e58024f8e37
parent 496 f31cc6a00472
child 710 021546adce69
child 904 07a013bc98a4
permissions -rw-r--r--
Ioannis E. VENETIS <venetis@mail.capsl.udel.edu> pointed out that GMP and MPFR were not used by gcc.
Turned out that none could use GMP and MPFR as the config option changed its name, but the change was not propagated to all users.

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