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