scripts/build/libc_glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
parent 391 11172b754564
child 481 d832c6a64f48
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
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@161
     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@63
    20
    CT_GetFile "${CT_LIBC_FILE}" ftp://ftp.gnu.org/gnu/glibc
yann@63
    21
yann@63
    22
    # C library addons
yann@151
    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@63
    26
        CT_GetFile "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ftp://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@151
    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@151
    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@410
    84
    addons_config=`echo "${addons_config}" |sed -r -e 's/^,+//; s/,+$//; s/,+/,/g;'`
yann@151
    85
yann@210
    86
    cross_cc=`CT_Which "${CT_TARGET}-gcc"`
yann@151
    87
    CT_DoLog DEBUG "Using gcc for target: \"${cross_cc}\""
yann@151
    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@136
   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@151
   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@328
   222
    if [ ${glibc_version_major} -ge 2 -a ${glibc_version_minor} -ge 6 ]; then
yann@328
   223
        # Don't use -pipe: configure chokes on it for glibc >= 2.6.
yann@332
   224
        CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
yann@328
   225
        extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
yann@328
   226
    else
yann@328
   227
        extra_cc_args="${CT_CFLAGS_FOR_HOST}"
yann@328
   228
    fi
yann@383
   229
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@136
   230
yann@210
   231
    cross_cc=`CT_Which "${CT_TARGET}-gcc"`
yann@151
   232
    CT_DoLog DEBUG "Using gcc for target    : \"${cross_cc}\""
yann@151
   233
    CT_DoLog DEBUG "Configuring with addons : \"`do_libc_add_ons_list ,`\""
yann@136
   234
    CT_DoLog DEBUG "Extra config args passed: \"${extra_config}\""
yann@151
   235
    CT_DoLog DEBUG "Extra CC args passed    : \"${extra_cc_args}\""
yann@136
   236
yann@391
   237
    # Super-H really needs to set configparms as of gcc-3.4/glibc-2.3.2
yann@391
   238
    # note: this is awkward, doesn't work well if you need more than one
yann@391
   239
    # line in configparms
yann@136
   240
    echo ${CT_LIBC_GLIBC_CONFIGPARMS} > configparms
yann@136
   241
yann@136
   242
    echo "libc_cv_forced_unwind=yes" > config.cache
yann@136
   243
    echo "libc_cv_c_cleanup=yes" >> config.cache
yann@136
   244
yann@136
   245
    # Please see the comment for the configure step in do_libc().
yann@136
   246
yann@136
   247
    BUILD_CC=${CT_CC_NATIVE}                                        \
yann@328
   248
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O "  \
yann@410
   249
    CC="${cross_cc} ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}"      \
yann@136
   250
    AR=${CT_TARGET}-ar                                              \
yann@136
   251
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@136
   252
    "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure"                       \
yann@136
   253
        --prefix=/usr                                               \
yann@136
   254
        --build="${CT_UNIQ_BUILD}"                                  \
yann@136
   255
        --host=${CT_TARGET}                                         \
yann@136
   256
        --without-cvs                                               \
yann@136
   257
        --disable-profile                                           \
yann@136
   258
        --disable-debug                                             \
yann@136
   259
        --without-gd                                                \
yann@136
   260
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@136
   261
        --cache-file=config.cache                                   \
yann@136
   262
        ${extra_config}                                             \
yann@136
   263
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}                               2>&1 |CT_DoLog ALL
yann@136
   264
yann@136
   265
yann@136
   266
    #TODO: should check whether slibdir has been set in configparms to */lib64
yann@136
   267
    #      and copy the startfiles into the appropriate libdir.
yann@328
   268
    CT_DoLog EXTRA "Building C library start files"
yann@136
   269
    make csu/subdir_lib 2>&1 |CT_DoLog ALL
yann@136
   270
yann@328
   271
    CT_DoLog EXTRA "Installing C library start files"
yann@136
   272
    if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@136
   273
        cp -fp csu/crt[1in].o "${CT_SYSROOT_DIR}/usr/lib/"
yann@136
   274
    else
yann@136
   275
        cp -fp csu/crt[1in].o "${CT_SYSROOT_DIR}/lib/"
yann@136
   276
    fi
yann@136
   277
yann@1
   278
    CT_EndStep
yann@1
   279
}
yann@1
   280
yann@1
   281
# This function builds and install the full glibc
yann@1
   282
do_libc() {
yann@1
   283
    CT_DoStep INFO "Installing C library"
yann@1
   284
yann@1
   285
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@1
   286
    cd "${CT_BUILD_DIR}/build-libc"
yann@1
   287
yann@1
   288
    CT_DoLog EXTRA "Configuring C library"
yann@1
   289
yann@1
   290
    # Add some default glibc config options if not given by user.
yann@136
   291
    # We don't need to be conditional on wether the user did set different
yann@136
   292
    # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
yann@136
   293
yann@136
   294
    extra_config="--enable-kernel=`echo ${CT_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;'`"
yann@136
   295
yann@136
   296
    case "${CT_THREADS}" in
yann@136
   297
        nptl)           extra_config="${extra_config} --with-__thread --with-tls";;
yann@136
   298
        linuxthreads)   extra_config="${extra_config} --with-__thread --without-tls --without-nptl";;
yann@136
   299
        none)           extra_config="${extra_config} --without-__thread --without-nptl"
yann@136
   300
                        case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@136
   301
                            *-tls*) ;;
yann@136
   302
                            *) extra_config="${extra_config} --without-tls";;
yann@136
   303
                        esac
yann@136
   304
                        ;;
yann@1
   305
    esac
yann@136
   306
yann@1
   307
    case "${CT_SHARED_LIBS}" in
yann@1
   308
        y) extra_config="${extra_config} --enable-shared";;
yann@1
   309
        *) extra_config="${extra_config} --disable-shared";;
yann@1
   310
    esac
yann@136
   311
yann@136
   312
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@136
   313
        y,) extra_config="${extra_config} --with-fp";;
yann@136
   314
        ,y) extra_config="${extra_config} --without-fp";;
yann@1
   315
    esac
yann@78
   316
yann@151
   317
    case "`do_libc_add_ons_list ,`" in
yann@151
   318
        "") ;;
yann@151
   319
        *)  extra_config="${extra_config} --enable-add-ons=`do_libc_add_ons_list ,`";;
yann@136
   320
    esac
yann@151
   321
yann@136
   322
yann@136
   323
    # Add some default CC args
yann@328
   324
    glibc_version_major=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^([^\.]+)\..*/\1/')
yann@328
   325
    glibc_version_minor=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^[^\.]+\.([^.]+).*/\1/')
yann@328
   326
    if [ ${glibc_version_major} -ge 2 -a ${glibc_version_minor} -ge 6 ]; then
yann@328
   327
        # Don't use -pipe: configure chokes on it for glibc >= 2.6.
yann@332
   328
        CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
yann@328
   329
        extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
yann@328
   330
    else
yann@328
   331
        extra_cc_args="${CT_CFLAGS_FOR_HOST}"
yann@136
   332
    fi
yann@383
   333
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@1
   334
yann@210
   335
    cross_cc=`CT_Which "${CT_TARGET}-gcc"`
yann@151
   336
    CT_DoLog DEBUG "Using gcc for target    : \"${cross_cc}\""
yann@151
   337
    CT_DoLog DEBUG "Configuring with addons : \"`do_libc_add_ons_list ,`\""
yann@78
   338
    CT_DoLog DEBUG "Extra config args passed: \"${extra_config}\""
yann@151
   339
    CT_DoLog DEBUG "Extra CC args passed    : \"${extra_cc_args}\""
yann@1
   340
yann@1
   341
    # sh3 and sh4 really need to set configparms as of gcc-3.4/glibc-2.3.2
yann@1
   342
    # note: this is awkward, doesn't work well if you need more than one line in configparms
yann@1
   343
    echo ${CT_LIBC_GLIBC_CONFIGPARMS} > configparms
yann@1
   344
yann@1
   345
    # For glibc 2.3.4 and later we need to set some autoconf cache
yann@1
   346
    # variables, because nptl/sysdeps/pthread/configure.in does not
yann@1
   347
    # work when cross-compiling.
yann@136
   348
    if [ "${CT_THREADS}" = "nptl" ]; then
yann@136
   349
        echo libc_cv_forced_unwind=yes
yann@136
   350
        echo libc_cv_c_cleanup=yes
yann@136
   351
    fi >config.cache
yann@1
   352
yann@1
   353
    # Configure with --prefix the way we want it on the target...
yann@1
   354
    # There are a whole lot of settings here.  You'll probably want
yann@1
   355
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
yann@1
   356
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@1
   357
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
yann@1
   358
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
yann@1
   359
    # Set BUILD_CC, or you won't be able to build datafiles
yann@1
   360
    # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
yann@1
   361
yann@136
   362
    # OK. I'm fed up with those folks telling me what I should do.
yann@136
   363
    # I don't configure nptl? Well, maybe that's purposedly because
yann@136
   364
    # I don't want nptl! --disable-sanity-checks will shut up those
yann@136
   365
    # silly messages. GNU folks again, he?
yann@136
   366
yann@1
   367
    BUILD_CC=${CT_CC_NATIVE}                                        \
yann@1
   368
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O"   \
yann@328
   369
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@1
   370
    AR=${CT_TARGET}-ar                                              \
yann@1
   371
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@1
   372
    "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure"                       \
yann@1
   373
        --prefix=/usr                                               \
yann@136
   374
        --build=${CT_UNIQ_BUILD}                                    \
yann@136
   375
        --host=${CT_TARGET}                                         \
yann@1
   376
        --without-cvs                                               \
yann@1
   377
        --disable-profile                                           \
yann@1
   378
        --disable-debug                                             \
yann@1
   379
        --without-gd                                                \
yann@136
   380
        --disable-sanity-checks                                     \
yann@136
   381
        --cache-file=config.cache                                   \
yann@78
   382
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@78
   383
        ${extra_config}                                             \
yann@78
   384
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}                               2>&1 |CT_DoLog ALL
yann@1
   385
yann@1
   386
    if grep -l '^install-lib-all:' "${CT_SRC_DIR}/${CT_LIBC_FILE}/Makerules" > /dev/null; then
yann@1
   387
        # nptl-era glibc.
yann@1
   388
        # If the install-lib-all target (which is added by our make-install-lib-all.patch)
yann@1
   389
        # is present, it means we're building glibc-2.3.3 or later, and we can't
yann@1
   390
        # build programs yet, as they require libeh, which won't be installed
yann@1
   391
        # until full build of gcc
yann@1
   392
        GLIBC_INITIAL_BUILD_RULE=lib
yann@1
   393
        GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
yann@1
   394
        GLIBC_INSTALL_APPS_LATER=yes
yann@1
   395
    else
yann@1
   396
        # classic glibc.  
yann@1
   397
        # We can build and install everything with the bootstrap compiler.
yann@1
   398
        GLIBC_INITIAL_BUILD_RULE=all
yann@1
   399
        GLIBC_INITIAL_INSTALL_RULE=install
yann@1
   400
        GLIBC_INSTALL_APPS_LATER=no
yann@1
   401
    fi
yann@1
   402
yann@1
   403
    # If this fails with an error like this:
yann@1
   404
    # ...  linux/autoconf.h: No such file or directory 
yann@1
   405
    # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
yann@1
   406
    # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
yann@1
   407
    # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
yann@1
   408
    # No need for PARALLELMFLAGS here, Makefile already reads this environment variable
yann@1
   409
    CT_DoLog EXTRA "Building C library"
yann@1
   410
    make LD=${CT_TARGET}-ld             \
yann@1
   411
         RANLIB=${CT_TARGET}-ranlib     \
yann@78
   412
         ${GLIBC_INITIAL_BUILD_RULE}    2>&1 |CT_DoLog ALL
yann@1
   413
yann@1
   414
    CT_DoLog EXTRA "Installing C library"
yann@1
   415
    make install_root="${CT_SYSROOT_DIR}"   \
yann@1
   416
         ${LIBC_SYSROOT_ARG}                \
yann@78
   417
         ${GLIBC_INITIAL_INSTALL_RULE}      2>&1 |CT_DoLog ALL
yann@1
   418
yann@1
   419
    # This doesn't seem to work when building a crosscompiler,
yann@1
   420
    # as it tries to execute localedef using the just-built ld.so!?
yann@1
   421
    #CT_DoLog EXTRA "Installing locales"
yann@78
   422
    #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL
yann@1
   423
yann@1
   424
    # Fix problems in linker scripts.
yann@1
   425
    #
yann@1
   426
    # 1. Remove absolute paths
yann@1
   427
    # Any file in a list of known suspects that isn't a symlink is assumed to be a linker script.
yann@1
   428
    # FIXME: test -h is not portable
yann@1
   429
    # FIXME: probably need to check more files than just these three...
yann@1
   430
    # Need to use sed instead of just assuming we know what's in libc.so because otherwise alpha breaks
yann@1
   431
    #
yann@1
   432
    # 2. Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
yann@1
   433
    # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
yann@1
   434
    #
yann@1
   435
    # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
yann@1
   436
    CT_DoLog EXTRA "Fixing C library linker scripts"
yann@1
   437
    for file in libc.so libpthread.so libgcc_s.so; do
yann@1
   438
        for dir in lib lib64 usr/lib usr/lib64; do
yann@1
   439
            if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
yann@78
   440
                cp "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
yann@1
   441
                CT_DoLog DEBUG "Fixing \"${CT_SYS_ROOT_DIR}/${dir}/${file}\""
yann@1
   442
                sed -i -r -e 's,/usr/lib/,,g;
yann@1
   443
                              s,/usr/lib64/,,g;
yann@1
   444
                              s,/lib/,,g;
yann@1
   445
                              s,/lib64/,,g;
yann@78
   446
                              /BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}"
yann@1
   447
            fi
yann@1
   448
        done
yann@1
   449
    done
yann@1
   450
yann@1
   451
    CT_EndStep
yann@1
   452
}
yann@1
   453
yann@1
   454
# This function finishes the glibc install
yann@1
   455
do_libc_finish() {
yann@1
   456
    # Finally, build and install glibc programs, now that libeh (if any) is installed
yann@1
   457
    # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
yann@1
   458
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
yann@1
   459
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
yann@1
   460
    [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
yann@1
   461
yann@1
   462
    CT_DoStep INFO "Finishing C library"
yann@1
   463
yann@1
   464
    cd "${CT_BUILD_DIR}/build-libc"
yann@1
   465
yann@1
   466
    CT_DoLog EXTRA "Re-building C library"
yann@78
   467
    make LD=${CT_TARGET}-ld RANLIB=${CT_TARGET}-ranlib 2>&1 |CT_DoLog ALL
yann@1
   468
yann@1
   469
    CT_DoLog EXTRA "Installing missing C library components"
yann@1
   470
    # note: should do full install and then fix linker scripts, but this is faster
yann@1
   471
    for t in bin rootsbin sbin data others; do
yann@1
   472
        make install_root="${CT_SYSROOT_DIR}"   \
yann@1
   473
             ${LIBC_SYSROOT_ARG}                \
yann@78
   474
             install-${t}                       2>&1 |CT_DoLog ALL
yann@1
   475
    done
yann@78
   476
yann@78
   477
    CT_EndStep
yann@1
   478
}
yann@151
   479
yann@151
   480
# Build up the addons list, separated with $1
yann@151
   481
do_libc_add_ons_list() {
yann@151
   482
    local sep="$1"
yann@151
   483
    local addons_list=`echo "${CT_LIBC_ADDONS_LIST//,/${sep}}" |tr -s ,`
yann@151
   484
    case "${CT_THREADS}" in
yann@151
   485
        none)   ;;
yann@151
   486
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@151
   487
    esac
yann@151
   488
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@151
   489
    addons_list="${addons_list%%${sep}}"
yann@151
   490
    echo "${addons_list##${sep}}"
yann@151
   491
}
yann@151
   492