scripts/build/libc/glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Sep 23 14:48:10 2008 +0000 (2008-09-23)
changeset 872 fd4bf138f08f
parent 852 c17bb66e2aa5
child 884 35302e8a3483
permissions -rw-r--r--
Bart De VOS pointed out that removing absolute paths from the libc linker scripts is plainly wrong.
It dates from dawn ages of the original crosstool code, and is not well explained. At that time, binutils might not understand the sysroot stuff, and it was necessary to remove absolute paths in that case.

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