scripts/build/libc/glibc.sh
author Jim F <jimfriel@gmail.com>
Mon Aug 24 19:20:57 2009 +0200 (2009-08-24)
changeset 1486 7155f2a00364
parent 1482 d0d2d372fd46
child 1551 8c40b842e798
child 1557 a576367cac44
permissions -rw-r--r--
glibc: fix build error caused by incorrect variable assignment

During the conversion to using bash arrays, the glibc build script
was improperly converted, and contains an incorrect variable
assignment to the config_options array.
     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 #    elif [ "${CT_LIBC_GLIBC_SNAPSHOT}" = "y" ]; then
    51 #        : # Not yet handled...
    52     fi
    53 
    54     return 0
    55 }
    56 
    57 # Extract glibc
    58 do_libc_extract() {
    59     local cvs
    60     local -a addons_list
    61 
    62     addons_list=($(do_libc_add_ons_list " "))
    63 
    64     [ "${CT_LIBC_GLIBC_CVS}" = "y" ] && cvs="cvs-"
    65 
    66     CT_Extract "glibc-${cvs}${CT_LIBC_VERSION}"
    67 
    68     CT_Pushd "${CT_SRC_DIR}/glibc-${cvs}${CT_LIBC_VERSION}"
    69     CT_Patch "glibc-${CT_LIBC_VERSION}" nochdir
    70 
    71     # C library addons
    72     for addon in "${addons_list[@]}"; do
    73         # NPTL addon is not to be extracted, in any case
    74         [ "${addon}" = "nptl" ] && continue || true
    75         CT_Extract "glibc-${addon}-${cvs}${CT_LIBC_VERSION}" nochdir
    76 
    77         # Some addons have the 'long' name, while others have the
    78         # 'short' name, but patches are non-uniformly built with
    79         # either the 'long' or 'short' name, whatever the addons name
    80         # so we have to make symlinks from the existing to the missing
    81         # Fortunately for us, [ -d foo ], when foo is a symlink to a
    82         # directory, returns true!
    83         [ -d "${addon}" ] || CT_DoExecLog ALL ln -s "glibc-${addon}-${cvs}${CT_LIBC_VERSION}" "${addon}"
    84         [ -d "glibc-${addon}-${cvs}${CT_LIBC_VERSION}" ] || CT_DoExecLog ALL ln -s "${addon}" "glibc-${addon}-${cvs}${CT_LIBC_VERSION}"
    85         CT_Patch "glibc-${addon}-${CT_LIBC_VERSION}" nochdir
    86     done
    87 
    88     # The configure files may be older than the configure.in files
    89     # if using a snapshot (or even some tarballs). Fake them being
    90     # up to date.
    91     sleep 2
    92     find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
    93 
    94     CT_Popd
    95 
    96     return 0
    97 }
    98 
    99 # There is nothing to do for glibc check config
   100 do_libc_check_config() {
   101     :
   102 }
   103 
   104 # This function installs the glibc headers needed to build the core compiler
   105 do_libc_headers() {
   106     local cvs
   107     local -a extra_config
   108 
   109     CT_DoStep INFO "Installing C library headers"
   110 
   111     [ "${CT_LIBC_GLIBC_CVS}" = "y" ] && cvs="cvs-"
   112 
   113     mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
   114     cd "${CT_BUILD_DIR}/build-libc-headers"
   115 
   116     CT_DoLog EXTRA "Configuring C library"
   117 
   118     # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions.
   119     # 1. override CC to keep glibc's configure from using $TARGET-gcc. 
   120     # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly
   121     # 3. build with gcc 3.2 or later
   122     # Compare these options with the ones used when building glibc for real below - they're different.
   123     # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode
   124     # so when configure checks to make sure gcc has access to the assembler you just built...
   125     # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path.
   126     # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet)
   127     # Note: the warning
   128     # "*** WARNING: Are you sure you do not want to use the `linuxthreads'"
   129     # *** add-on?"
   130     # is ok here, since all we want are the basic headers at this point.
   131     # Override libc_cv_ppc_machine so glibc-cvs doesn't complain
   132     # 'a version of binutils that supports .machine "altivec" is needed'.
   133 
   134     # We need to remove any threading addon when installing headers
   135     addons_list="$(do_libc_add_ons_list " "                     \
   136                    |sed -r -e 's/\<(nptl|linuxthreads)\>/ /g;'  \
   137                            -e 's/ +/,/g; s/^,+//; s/,+$//;'     \
   138                   )"
   139 
   140     extra_config+=("--enable-add-ons=${addons_list}")
   141 
   142     extra_config+=("${addons_config}")
   143     extra_config+=("$(do_libc_min_kernel_config)")
   144 
   145     # Pre-seed the configparms file with values from the config option
   146     echo "${CT_LIBC_GLIBC_CONFIGPARMS}" > configparms
   147 
   148     cross_cc=$(CT_Which "${CT_TARGET}-gcc")
   149     CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
   150     CT_DoLog DEBUG "Extra config passed : '${extra_config[*]}'"
   151 
   152     libc_cv_ppc_machine=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="-O -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="-O -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     # In case we're using a snapshot, fake a >=2.6 version.
   298     if [    "${CT_LIBC_V_LATEST}" = "y" \
   299          -o "${CT_LIBC_V_date}" = "y"   ]; then
   300         glibc_version_major=3
   301         glibc_version_minor=0
   302     fi
   303     if [    ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6    \
   304          -o ${glibc_version_major} -gt 2                                    ]; then
   305         # Don't use -pipe: configure chokes on it for glibc >= 2.6.
   306         CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
   307         extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
   308     else
   309         extra_cc_args="${CT_CFLAGS_FOR_HOST}"
   310     fi
   311     extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
   312 
   313     cross_cc=$(CT_Which "${CT_TARGET}-gcc")
   314     CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
   315     CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
   316     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
   317     CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
   318 
   319     # Pre-seed the configparms file with values from the config option
   320     echo "${CT_LIBC_GLIBC_CONFIGPARMS}" > configparms
   321 
   322     echo "libc_cv_forced_unwind=yes" > config.cache
   323     echo "libc_cv_c_cleanup=yes" >> config.cache
   324 
   325     # Please see the comment for the configure step in do_libc().
   326 
   327     BUILD_CC="${CT_BUILD}-gcc"                                      \
   328     CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O "  \
   329     CC="${cross_cc} ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}"      \
   330     AR=${CT_TARGET}-ar                                              \
   331     RANLIB=${CT_TARGET}-ranlib                                      \
   332     CT_DoExecLog ALL                                                \
   333     "${CT_SRC_DIR}/glibc-${cvs}${CT_LIBC_VERSION}/configure"        \
   334         --prefix=/usr                                               \
   335         --build="${CT_BUILD}"                                       \
   336         --host=${CT_TARGET}                                         \
   337         --without-cvs                                               \
   338         --disable-profile                                           \
   339         --disable-debug                                             \
   340         --without-gd                                                \
   341         --with-headers="${CT_HEADERS_DIR}"                          \
   342         --cache-file=config.cache                                   \
   343         "${extra_config[@]}"                                        \
   344         ${CT_LIBC_GLIBC_EXTRA_CONFIG}
   345 
   346     #TODO: should check whether slibdir has been set in configparms to */lib64
   347     #      and copy the startfiles into the appropriate libdir.
   348     CT_DoLog EXTRA "Building C library start files"
   349     CT_DoExecLog ALL make OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   350                           PARALLELMFLAGS="${PARALLELMFLAGS}"        \
   351                           csu/subdir_lib
   352 
   353     CT_DoLog EXTRA "Installing C library start files"
   354     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   355         CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/usr/lib/"
   356     else
   357         CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/lib/"
   358     fi
   359 
   360     CT_EndStep
   361 }
   362 
   363 # This function builds and install the full glibc
   364 do_libc() {
   365     local cvs
   366     local -a extra_config
   367 
   368     CT_DoStep INFO "Installing C library"
   369 
   370     [ "${CT_LIBC_GLIBC_CVS}" = "y" ] && cvs="cvs-"
   371 
   372     mkdir -p "${CT_BUILD_DIR}/build-libc"
   373     cd "${CT_BUILD_DIR}/build-libc"
   374 
   375     CT_DoLog EXTRA "Configuring C library"
   376 
   377     # Add some default glibc config options if not given by user.
   378     # We don't need to be conditional on wether the user did set different
   379     # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
   380 
   381     case "${CT_THREADS}" in
   382         nptl)           extra_config+=("--with-__thread" "--with-tls");;
   383         linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
   384         none)           extra_config+=("--without-__thread" "--without-nptl")
   385                         case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
   386                             *-tls*) ;;
   387                             *) extra_config+=("--without-tls");;
   388                         esac
   389                         ;;
   390     esac
   391 
   392     case "${CT_SHARED_LIBS}" in
   393         y) extra_config+=("--enable-shared");;
   394         *) extra_config+=("--disable-shared");;
   395     esac
   396 
   397     case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
   398         y,) extra_config+=("--with-fp");;
   399         ,y) extra_config+=("--without-fp");;
   400     esac
   401 
   402     case "$(do_libc_add_ons_list ,)" in
   403         "") ;;
   404         *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
   405     esac
   406 
   407     extra_config+=("$(do_libc_min_kernel_config)")
   408 
   409     # Add some default CC args
   410     glibc_version_major=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^([[:digit:]]+).*/\1/')
   411     glibc_version_minor=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/')
   412     # In case we're using a snapshot, fake a >=2.6 version.
   413     if [    "${CT_LIBC_V_LATEST}" = "y" \
   414          -o "${CT_LIBC_V_date}" = "y"   ]; then
   415         glibc_version_major=3
   416         glibc_version_minor=0
   417     fi
   418     if [    ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6    \
   419          -o ${glibc_version_major} -gt 2                                    ]; then
   420         # Don't use -pipe: configure chokes on it for glibc >= 2.6.
   421         CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
   422         extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
   423     else
   424         extra_cc_args="${CT_CFLAGS_FOR_HOST}"
   425     fi
   426     extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
   427 
   428     cross_cc=$(CT_Which "${CT_TARGET}-gcc")
   429     CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
   430     CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
   431     CT_DoLog DEBUG "Extra config args passed: '${extra_config}'"
   432     CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
   433 
   434     # Pre-seed the configparms file with values from the config option
   435     echo "${CT_LIBC_GLIBC_CONFIGPARMS}" > configparms
   436 
   437     # For glibc 2.3.4 and later we need to set some autoconf cache
   438     # variables, because nptl/sysdeps/pthread/configure.in does not
   439     # work when cross-compiling.
   440     if [ "${CT_THREADS}" = "nptl" ]; then
   441         echo libc_cv_forced_unwind=yes
   442         echo libc_cv_c_cleanup=yes
   443     fi >config.cache
   444 
   445     # Configure with --prefix the way we want it on the target...
   446     # There are a whole lot of settings here.  You'll probably want
   447     # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
   448     # Compare these options with the ones used when installing the glibc headers above - they're different.
   449     # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
   450     # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
   451     # Set BUILD_CC, or you won't be able to build datafiles
   452     # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
   453 
   454     # OK. I'm fed up with those folks telling me what I should do.
   455     # I don't configure nptl? Well, maybe that's purposedly because
   456     # I don't want nptl! --disable-sanity-checks will shut up those
   457     # silly messages. GNU folks again, he?
   458 
   459     BUILD_CC="${CT_BUILD}-gcc"                                      \
   460     CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O"   \
   461     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
   462     AR=${CT_TARGET}-ar                                              \
   463     RANLIB=${CT_TARGET}-ranlib                                      \
   464     CT_DoExecLog ALL                                                \
   465     "${CT_SRC_DIR}/glibc-${cvs}${CT_LIBC_VERSION}/configure"        \
   466         --prefix=/usr                                               \
   467         --build=${CT_BUILD}                                         \
   468         --host=${CT_TARGET}                                         \
   469         --without-cvs                                               \
   470         --disable-profile                                           \
   471         --disable-debug                                             \
   472         --without-gd                                                \
   473         --disable-sanity-checks                                     \
   474         --cache-file=config.cache                                   \
   475         --with-headers="${CT_HEADERS_DIR}"                          \
   476         "${extra_config[@]}"                                        \
   477         ${CT_LIBC_GLIBC_EXTRA_CONFIG}
   478 
   479     if grep -l '^install-lib-all:' "${CT_SRC_DIR}/glibc-${cvs}${CT_LIBC_VERSION}/Makerules" > /dev/null; then
   480         # nptl-era glibc.
   481         # If the install-lib-all target (which is added by our make-install-lib-all.patch)
   482         # is present, it means we're building glibc-2.3.3 or later, and we can't
   483         # build programs yet, as they require libeh, which won't be installed
   484         # until full build of gcc
   485         # YEM-FIXME: This comment is misleading: latest glibc-s do not have the
   486         #            make-install-lib-all.patch applied, so do not pass through this
   487         #            part of the if statement; nonetheless, they do build, and
   488         #            the result is useable (maybe the dual-pass core gcc is
   489         #            responsible for this).
   490         GLIBC_INITIAL_BUILD_RULE=lib
   491         GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
   492         GLIBC_INSTALL_APPS_LATER=yes
   493     else
   494         # classic glibc.  
   495         # We can build and install everything with the bootstrap compiler.
   496         # YEM-FIXME: See the above FIXME as well.
   497         GLIBC_INITIAL_BUILD_RULE=all
   498         GLIBC_INITIAL_INSTALL_RULE=install
   499         GLIBC_INSTALL_APPS_LATER=no
   500     fi
   501 
   502     # glibc initial build hacks
   503     # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
   504     case "${CT_ARCH},${CT_ARCH_CPU}" in
   505 	powerpc,8??)
   506 	    CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
   507 	    GLIBC_INITIAL_BUILD_ASFLAGS="-DBROKEN_PPC_8xx_CPU15";;
   508     esac
   509 
   510     # If this fails with an error like this:
   511     # ...  linux/autoconf.h: No such file or directory 
   512     # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
   513     # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
   514     # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
   515     CT_DoLog EXTRA "Building C library"
   516     CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
   517                           RANLIB=${CT_TARGET}-ranlib                \
   518                           OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   519                           ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
   520                           PARALLELMFLAGS="${PARALLELMFLAGS}"        \
   521                           ${GLIBC_INITIAL_BUILD_RULE}
   522 
   523     CT_DoLog EXTRA "Installing C library"
   524     CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
   525                           ${LIBC_SYSROOT_ARG}                       \
   526                           OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   527                           PARALLELMFLAGS="${PARALLELMFLAGS}"        \
   528                           ${GLIBC_INITIAL_INSTALL_RULE}
   529 
   530     # This doesn't seem to work when building a crosscompiler,
   531     # as it tries to execute localedef using the just-built ld.so!?
   532     #CT_DoLog EXTRA "Installing locales"
   533     #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL
   534 
   535     # Fix problems in linker scripts.
   536     #
   537     # Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
   538     # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
   539     # No need to look into the lib64/ dirs here and there, they point to the
   540     # corresponding lib/ directories.
   541     #
   542     # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
   543     CT_DoLog EXTRA "Fixing C library linker scripts"
   544     for file in libc.so libpthread.so libgcc_s.so; do
   545         for dir in lib usr/lib; do
   546             if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
   547                 CT_DoExecLog ALL cp -v "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
   548                 CT_DoLog DEBUG "Fixing '${CT_SYS_ROOT_DIR}/${dir}/${file}'"
   549                 CT_DoExecLog ALL sed -i -r -e '/BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}"
   550             fi
   551         done
   552     done
   553 
   554     CT_EndStep
   555 }
   556 
   557 # This function finishes the glibc install
   558 do_libc_finish() {
   559     # Finally, build and install glibc programs, now that libeh (if any) is installed
   560     # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
   561     # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
   562     # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
   563     [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
   564 
   565     CT_DoStep INFO "Finishing C library"
   566 
   567     cd "${CT_BUILD_DIR}/build-libc"
   568 
   569     CT_DoLog EXTRA "Re-building C library"
   570     CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
   571                           RANLIB=${CT_TARGET}-ranlib                \
   572                           OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   573                           ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
   574                           PARALLELMFLAGS="${PARALLELMFLAGS}"
   575 
   576     CT_DoLog EXTRA "Installing missing C library components"
   577     # note: should do full install and then fix linker scripts, but this is faster
   578     for t in bin rootsbin sbin data others; do
   579         CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
   580                               ${LIBC_SYSROOT_ARG}                       \
   581                               OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   582                               PARALLELMFLAGS="${PARALLELMFLAGS}"        \
   583                               install-${t}
   584     done
   585 
   586     CT_EndStep
   587 }
   588 
   589 # Build up the addons list, separated with $1
   590 do_libc_add_ons_list() {
   591     local sep="$1"
   592     local addons_list=$(echo "${CT_LIBC_ADDONS_LIST}" |sed -r -e "s/[ ,]/${sep}/g;")
   593     case "${CT_THREADS}" in
   594         none)   ;;
   595         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   596     esac
   597     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   598     # Remove duplicate, leading and trailing separators
   599     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   600 }
   601 
   602 # Builds up the minimum supported Linux kernel version
   603 do_libc_min_kernel_config() {
   604     local min_kernel_config=
   605     case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
   606         *enable-kernel*) ;;
   607         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   608                 # We can't rely on the kernel version from the configuration,
   609                 # because it might not be available if the user uses pre-installed
   610                 # headers. On the other hand, both method will have the kernel
   611                 # version installed in "usr/include/linux/version.h" in the sys-root.
   612                 # Parse that instead of having two code-paths.
   613                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   614                 CT_TestOrAbort "Linux version is unavailable in installed headers files" -f "${version_code_file}" -a -r "${version_code_file}"
   615                 version_code=$(grep -E LINUX_VERSION_CODE "${version_code_file}" |cut -d ' ' -f 3)
   616                 version=$(((version_code>>16)&0xFF))
   617                 patchlevel=$(((version_code>>8)&0xFF))
   618                 sublevel=$((version_code&0xFF))
   619                 min_kernel_config="--enable-kernel=${version}.${patchlevel}.${sublevel}"
   620             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   621                 # Trim the fourth part of the linux version, keeping only the first three numbers
   622                 min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
   623             fi
   624             ;;
   625     esac
   626     echo "${min_kernel_config}"
   627 }