scripts/build/libc/glibc.sh
author Remy Bohmer <linux@bohmer.net>
Thu May 27 23:18:19 2010 +0200 (2010-05-27)
changeset 2060 51e4597b07fc
parent 1929 f5d5e279af95
child 2154 250cdcc86441
permissions -rw-r--r--
scripts: add option to strip all toolchain executables

To reduce filesizes of the toolchain and even improve build times
of projects to be build with this toolchain it is usefull to strip
the delivered toolchain executables. Since it is not likely that we
will debug the toolchain executables itself we do not need the
debug information inside the executables itself.

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