scripts/build/libc/glibc.sh
author Bart vdr. Meulen <bartvdrmeulen@gmail.com>
Sun Aug 02 16:45:43 2009 +0200 (2009-08-02)
changeset 1434 7e7290acccc1
parent 1260 777153645ab8
child 1482 d0d2d372fd46
permissions -rw-r--r--
fix wrapper script for symlinks

The wrapper script placed around the target binaries when
using the companion libraries does not work for symbolic links
The wrapper scripts needs to follow the links before calling the
actual binary

Signed-off-by: Bart vdr. Meulen <bartvdrmeulen@gmail.com>

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