scripts/build/libc/glibc.sh
author Martin Lund <mgl@doredevelopment.dk>
Sat May 29 15:08:11 2010 +0200 (2010-05-29)
changeset 1986 8946b80364fb
parent 1901 bdb3a98e064b
child 2002 1be81b72dea4
permissions -rw-r--r--
patches/gdb: Fix canadian building of GDB for powerpc

Adds patch for GDB v6.8, v7.0, v7.0.1 to fix canadian
cross building of GDB for powerpc.

See original patch information here:
http://sources.redhat.com/bugzilla/show_bug.cgi?id=9638

The patch is not required for GDB v7.1 (fixed).

Tested in canadian combination using mingw32 and powerpc toolchains.
Tested to not affect normal cross building of GDB for powerpc target.

Signed-off-by: Martin Lund <mgl@doredevelopment.dk>
     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 with --prefix the way we want it on the target...
   413     # There are a whole lot of settings here.  You'll probably want
   414     # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
   415     # Compare these options with the ones used when installing the glibc headers above - they're different.
   416     # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
   417     # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
   418     # Set BUILD_CC, or you won't be able to build datafiles
   419     # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
   420 
   421     # OK. I'm fed up with those folks telling me what I should do.
   422     # I don't configure nptl? Well, maybe that's purposedly because
   423     # I don't want nptl! --disable-sanity-checks will shut up those
   424     # silly messages. GNU folks again, he?
   425 
   426     BUILD_CC="${CT_BUILD}-gcc"                                      \
   427     CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2"  \
   428     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
   429     AR=${CT_TARGET}-ar                                              \
   430     RANLIB=${CT_TARGET}-ranlib                                      \
   431     CT_DoExecLog ALL                                                \
   432     "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure"              \
   433         --prefix=/usr                                               \
   434         --build=${CT_BUILD}                                         \
   435         --host=${CT_TARGET}                                         \
   436         --without-cvs                                               \
   437         --disable-profile                                           \
   438         --disable-debug                                             \
   439         --without-gd                                                \
   440         --disable-sanity-checks                                     \
   441         --cache-file=config.cache                                   \
   442         --with-headers="${CT_HEADERS_DIR}"                          \
   443         "${extra_config[@]}"                                        \
   444         ${CT_LIBC_GLIBC_EXTRA_CONFIG}
   445 
   446     if grep -l '^install-lib-all:' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/Makerules" > /dev/null; then
   447         # nptl-era glibc.
   448         # If the install-lib-all target (which is added by our make-install-lib-all.patch)
   449         # is present, it means we're building glibc-2.3.3 or later, and we can't
   450         # build programs yet, as they require libeh, which won't be installed
   451         # until full build of gcc
   452         # YEM-FIXME: This comment is misleading: latest glibc-s do not have the
   453         #            make-install-lib-all.patch applied, so do not pass through this
   454         #            part of the if statement; nonetheless, they do build, and
   455         #            the result is useable (maybe the dual-pass core gcc is
   456         #            responsible for this).
   457         GLIBC_INITIAL_BUILD_RULE=lib
   458         GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
   459         GLIBC_INSTALL_APPS_LATER=yes
   460     else
   461         # classic glibc.  
   462         # We can build and install everything with the bootstrap compiler.
   463         # YEM-FIXME: See the above FIXME as well.
   464         GLIBC_INITIAL_BUILD_RULE=all
   465         GLIBC_INITIAL_INSTALL_RULE=install
   466         GLIBC_INSTALL_APPS_LATER=no
   467     fi
   468 
   469     # glibc initial build hacks
   470     # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
   471     case "${CT_ARCH},${CT_ARCH_CPU}" in
   472 	powerpc,8??)
   473 	    CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
   474 	    GLIBC_INITIAL_BUILD_ASFLAGS="-DBROKEN_PPC_8xx_CPU15";;
   475     esac
   476 
   477     # If this fails with an error like this:
   478     # ...  linux/autoconf.h: No such file or directory 
   479     # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
   480     # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
   481     # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
   482     CT_DoLog EXTRA "Building C library"
   483     CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
   484                           RANLIB=${CT_TARGET}-ranlib                \
   485                           OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   486                           ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
   487                           PARALLELMFLAGS="${PARALLELMFLAGS}"        \
   488                           ${GLIBC_INITIAL_BUILD_RULE}
   489 
   490     CT_DoLog EXTRA "Installing C library"
   491     CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
   492                           ${LIBC_SYSROOT_ARG}                       \
   493                           OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   494                           PARALLELMFLAGS="${PARALLELMFLAGS}"        \
   495                           ${GLIBC_INITIAL_INSTALL_RULE}
   496 
   497     # This doesn't seem to work when building a crosscompiler,
   498     # as it tries to execute localedef using the just-built ld.so!?
   499     #CT_DoLog EXTRA "Installing locales"
   500     #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL
   501 
   502     # Fix problems in linker scripts.
   503     #
   504     # Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
   505     # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
   506     # No need to look into the lib64/ dirs here and there, they point to the
   507     # corresponding lib/ directories.
   508     #
   509     # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
   510     CT_DoLog EXTRA "Fixing C library linker scripts"
   511     for file in libc.so libpthread.so libgcc_s.so; do
   512         for dir in lib usr/lib; do
   513             if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
   514                 CT_DoExecLog ALL cp -v "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
   515                 CT_DoLog DEBUG "Fixing '${CT_SYS_ROOT_DIR}/${dir}/${file}'"
   516                 CT_DoExecLog ALL sed -i -r -e '/BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}"
   517             fi
   518         done
   519     done
   520 
   521     CT_EndStep
   522 }
   523 
   524 # This function finishes the glibc install
   525 do_libc_finish() {
   526     # Finally, build and install glibc programs, now that libeh (if any) is installed
   527     # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
   528     # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
   529     # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
   530     [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
   531 
   532     CT_DoStep INFO "Finishing C library"
   533 
   534     cd "${CT_BUILD_DIR}/build-libc"
   535 
   536     CT_DoLog EXTRA "Re-building C library"
   537     CT_DoExecLog ALL make LD=${CT_TARGET}-ld                        \
   538                           RANLIB=${CT_TARGET}-ranlib                \
   539                           OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   540                           ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}"  \
   541                           PARALLELMFLAGS="${PARALLELMFLAGS}"
   542 
   543     CT_DoLog EXTRA "Installing missing C library components"
   544     # note: should do full install and then fix linker scripts, but this is faster
   545     for t in bin rootsbin sbin data others; do
   546         CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}"          \
   547                               ${LIBC_SYSROOT_ARG}                       \
   548                               OBJDUMP_FOR_HOST="${CT_TARGET}-objdump"   \
   549                               PARALLELMFLAGS="${PARALLELMFLAGS}"        \
   550                               install-${t}
   551     done
   552 
   553     CT_EndStep
   554 }
   555 
   556 # Build up the addons list, separated with $1
   557 do_libc_add_ons_list() {
   558     local sep="$1"
   559     local addons_list=$(echo "${CT_LIBC_ADDONS_LIST}" |sed -r -e "s/[ ,]/${sep}/g;")
   560     case "${CT_THREADS}" in
   561         none)   ;;
   562         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   563     esac
   564     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   565     # Remove duplicate, leading and trailing separators
   566     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   567 }
   568 
   569 # Builds up the minimum supported Linux kernel version
   570 do_libc_min_kernel_config() {
   571     local min_kernel_config=
   572     case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
   573         *enable-kernel*) ;;
   574         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   575                 # We can't rely on the kernel version from the configuration,
   576                 # because it might not be available if the user uses pre-installed
   577                 # headers. On the other hand, both method will have the kernel
   578                 # version installed in "usr/include/linux/version.h" in the sys-root.
   579                 # Parse that instead of having two code-paths.
   580                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   581                 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
   582                     CT_Abort "Linux version is unavailable in installed headers files"
   583                 fi
   584                 version_code=$(grep -E LINUX_VERSION_CODE "${version_code_file}" |cut -d ' ' -f 3)
   585                 version=$(((version_code>>16)&0xFF))
   586                 patchlevel=$(((version_code>>8)&0xFF))
   587                 sublevel=$((version_code&0xFF))
   588                 min_kernel_config="--enable-kernel=${version}.${patchlevel}.${sublevel}"
   589             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   590                 # Trim the fourth part of the linux version, keeping only the first three numbers
   591                 min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
   592             fi
   593             ;;
   594     esac
   595     echo "${min_kernel_config}"
   596 }