scripts/build/libc/glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Dec 30 15:36:22 2009 +0100 (2009-12-30)
changeset 1669 61edd9d19e3c
parent 1627 8aa1d1051a6a
child 1719 5c0d326c2cea
permissions -rw-r--r--
scripts/functions: add aria2, a powerfull downloader

aria2 is a powerfull downloader that is capable of chunking and
parallel retrieval.

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