yann@850: # This file adds functions to build glibc yann@850: # Copyright 2007 Yann E. MORIN yann@850: # Licensed under the GPL v2. See COPYING in the root of this package yann@850: yann@850: # Download glibc yann@850: do_libc_get() { yann@1260: local date yann@1260: local version yann@1482: local -a addons_list yann@1482: yann@1482: addons_list=($(do_libc_add_ons_list " ")) yann@1114: yann@1759: # Main source yann@1759: CT_GetFile "glibc-${CT_LIBC_VERSION}" \ yann@1759: {ftp,http}://ftp.gnu.org/gnu/glibc \ yann@1759: ftp://gcc.gnu.org/pub/glibc/releases \ yann@1759: ftp://gcc.gnu.org/pub/glibc/snapshots yann@1759: yann@1759: # C library addons yann@1759: for addon in "${addons_list[@]}"; do yann@1759: # NPTL addon is not to be downloaded, in any case yann@1759: [ "${addon}" = "nptl" ] && continue || true yann@1759: CT_GetFile "glibc-${addon}-${CT_LIBC_VERSION}" \ yann@850: {ftp,http}://ftp.gnu.org/gnu/glibc \ yann@850: ftp://gcc.gnu.org/pub/glibc/releases \ yann@850: ftp://gcc.gnu.org/pub/glibc/snapshots yann@1759: done yann@850: yann@850: return 0 yann@850: } yann@850: yann@850: # Extract glibc yann@850: do_libc_extract() { yann@1482: local -a addons_list yann@1482: yann@1482: addons_list=($(do_libc_add_ons_list " ")) yann@1260: yann@1759: CT_Extract "glibc-${CT_LIBC_VERSION}" yann@1260: yann@1759: CT_Pushd "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}" yann@1761: CT_Patch nochdir "glibc-${CT_LIBC_VERSION}" yann@850: yann@850: # C library addons yann@1482: for addon in "${addons_list[@]}"; do yann@850: # NPTL addon is not to be extracted, in any case yann@850: [ "${addon}" = "nptl" ] && continue || true yann@1761: CT_Extract nochdir "glibc-${addon}-${CT_LIBC_VERSION}" yann@1260: yann@1126: # Some addons have the 'long' name, while others have the yann@1126: # 'short' name, but patches are non-uniformly built with yann@1126: # either the 'long' or 'short' name, whatever the addons name yann@1126: # so we have to make symlinks from the existing to the missing yann@1126: # Fortunately for us, [ -d foo ], when foo is a symlink to a yann@1126: # directory, returns true! yann@1759: [ -d "${addon}" ] || CT_DoExecLog ALL ln -s "glibc-${addon}-${CT_LIBC_VERSION}" "${addon}" yann@1759: [ -d "glibc-${addon}-${CT_LIBC_VERSION}" ] || CT_DoExecLog ALL ln -s "${addon}" "glibc-${addon}-${CT_LIBC_VERSION}" yann@1761: CT_Patch nochdir "glibc-${addon}-${CT_LIBC_VERSION}" yann@850: done yann@850: yann@884: # The configure files may be older than the configure.in files yann@884: # if using a snapshot (or even some tarballs). Fake them being yann@884: # up to date. yann@1482: sleep 2 yann@1260: find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL yann@1260: yann@1260: CT_Popd yann@884: yann@850: return 0 yann@850: } yann@850: yann@850: # There is nothing to do for glibc check config yann@850: do_libc_check_config() { yann@850: : yann@850: } yann@850: yann@850: # This function installs the glibc headers needed to build the core compiler yann@850: do_libc_headers() { yann@1482: local -a extra_config yann@1719: local arch4hdrs yann@1260: yann@850: CT_DoStep INFO "Installing C library headers" yann@850: yann@850: mkdir -p "${CT_BUILD_DIR}/build-libc-headers" yann@850: cd "${CT_BUILD_DIR}/build-libc-headers" yann@850: yann@850: CT_DoLog EXTRA "Configuring C library" yann@850: yann@1719: # The x86 arch needs special care... Bizarelly enough... :-( yann@1747: case "${CT_ARCH}:${CT_ARCH_BITNESS}" in yann@1719: x86:32) arch4hdrs="i386";; yann@1719: x86:64) arch4hdrs="x86_64";; yann@1747: *) arch4hdrs="${CT_ARCH}";; yann@1719: esac yann@1719: yann@850: # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions. yann@850: # 1. override CC to keep glibc's configure from using $TARGET-gcc. yann@850: # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly yann@850: # 3. build with gcc 3.2 or later yann@850: # Compare these options with the ones used when building glibc for real below - they're different. yann@850: # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode yann@850: # so when configure checks to make sure gcc has access to the assembler you just built... yann@850: # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path. yann@850: # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet) yann@850: # Note: the warning yann@850: # "*** WARNING: Are you sure you do not want to use the `linuxthreads'" yann@850: # *** add-on?" yann@850: # is ok here, since all we want are the basic headers at this point. yann@850: # Override libc_cv_ppc_machine so glibc-cvs doesn't complain yann@850: # 'a version of binutils that supports .machine "altivec" is needed'. yann@850: yann@850: # We need to remove any threading addon when installing headers yann@1482: addons_list="$(do_libc_add_ons_list " " \ yann@1482: |sed -r -e 's/\<(nptl|linuxthreads)\>/ /g;' \ yann@1482: -e 's/ +/,/g; s/^,+//; s/,+$//;' \ yann@1482: )" yann@850: yann@1482: extra_config+=("--enable-add-ons=${addons_list}") yann@1482: yann@1482: extra_config+=("${addons_config}") yann@1482: extra_config+=("$(do_libc_min_kernel_config)") yann@852: yann@1232: # Pre-seed the configparms file with values from the config option yann@1627: printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms yann@1232: yann@850: cross_cc=$(CT_Which "${CT_TARGET}-gcc") yann@850: CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'" yann@1482: CT_DoLog DEBUG "Extra config passed : '${extra_config[*]}'" yann@850: yann@1260: libc_cv_ppc_machine=yes \ yann@1641: libc_cv_mlong_double_128=yes \ yann@1641: libc_cv_mlong_double_128ibm=yes \ yann@1260: CC=${cross_cc} \ yann@1260: CT_DoExecLog ALL \ yann@1759: "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure" \ yann@1260: --build="${CT_BUILD}" \ yann@1260: --host="${CT_TARGET}" \ yann@1260: --prefix=/usr \ yann@1260: --with-headers="${CT_HEADERS_DIR}" \ yann@1260: --without-cvs \ yann@1260: --disable-sanity-checks \ yann@1260: --enable-hacker-mode \ yann@1482: "${extra_config[@]}" \ yann@850: --without-nptl yann@850: yann@850: CT_DoLog EXTRA "Installing C library headers" yann@850: yann@1759: if grep -q GLIBC_2.3 "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/ChangeLog"; then yann@850: # glibc-2.3.x passes cross options to $(CC) when generating errlist-compat.c, yann@850: # which fails without a real cross-compiler. yann@850: # Fortunately, we don't need errlist-compat.c, since we just need .h yann@850: # files, so work around this by creating a fake errlist-compat.c and yann@850: # satisfying its dependencies. yann@850: # Another workaround might be to tell configure to not use any cross yann@850: # options to $(CC). yann@850: # The real fix would be to get install-headers to not generate yann@850: # errlist-compat.c. yann@850: # Note: BOOTSTRAP_GCC is used by: yann@850: # patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch yann@850: yann@850: libc_cv_ppc_machine=yes \ yann@850: CT_DoExecLog ALL \ yann@1551: make CFLAGS="-O2 -DBOOTSTRAP_GCC" \ yann@850: OBJDUMP_FOR_HOST="${CT_TARGET}-objdump" \ yann@1395: PARALLELMFLAGS="${PARALLELMFLAGS}" \ yann@850: sysdeps/gnu/errlist.c yann@850: mkdir -p stdio-common yann@850: yann@850: # sleep for 2 seconds for benefit of filesystems with lousy time yann@850: # resolution, like FAT, so make knows for sure errlist-compat.c doesn't yann@850: # need generating yann@850: sleep 2 yann@850: CT_DoExecLog ALL touch stdio-common/errlist-compat.c yann@850: fi yann@850: # Note: BOOTSTRAP_GCC (see above) yann@850: libc_cv_ppc_machine=yes \ yann@850: CT_DoExecLog ALL \ yann@850: make cross-compiling=yes \ yann@850: install_root=${CT_SYSROOT_DIR} \ yann@1551: CFLAGS="-O2 -DBOOTSTRAP_GCC" \ yann@850: ${LIBC_SYSROOT_ARG} \ yann@850: OBJDUMP_FOR_HOST="${CT_TARGET}-objdump" \ yann@1395: PARALLELMFLAGS="${PARALLELMFLAGS}" \ yann@850: install-headers yann@850: yann@850: # Two headers -- stubs.h and features.h -- aren't installed by install-headers, yann@850: # so do them by hand. We can tolerate an empty stubs.h for the moment. yann@850: # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html yann@850: mkdir -p "${CT_HEADERS_DIR}/gnu" yann@850: CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h" yann@1759: CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h" \ yann@850: "${CT_HEADERS_DIR}/features.h" yann@850: yann@850: # Building the bootstrap gcc requires either setting inhibit_libc, or yann@850: # having a copy of stdio_lim.h... see yann@850: # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html yann@850: CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h" yann@850: yann@850: # Following error building gcc-4.0.0's gcj: yann@850: # error: bits/syscall.h: No such file or directory yann@850: # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html yann@850: # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html yann@850: [ "${CT_ARCH}" != "arm" ] && CT_DoExecLog ALL cp -v misc/syscall-list.h "${CT_HEADERS_DIR}/bits/syscall.h" || true yann@850: yann@850: # Those headers are to be manually copied so gcc can build properly yann@1759: pthread_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/${CT_THREADS}/sysdeps/pthread/pthread.h" yann@850: pthreadtypes_h= yann@850: case "${CT_THREADS}" in yann@850: nptl) yann@850: # NOTE: for some archs, the pathes are different, but they are not yann@850: # supported by crosstool-NG right now. See original crosstool when they are. yann@1759: pthread_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/${CT_THREADS}/sysdeps/pthread/pthread.h" yann@1759: pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/nptl/sysdeps/unix/sysv/linux/${arch4hdrs}/bits/pthreadtypes.h" yann@850: if [ ! -f "${pthreadtypes_h}" ]; then yann@1759: pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/ports/sysdeps/unix/sysv/linux/${arch4hdrs}/nptl/bits/pthreadtypes.h" yann@850: fi yann@850: ;; yann@850: linuxthreads) yann@1759: pthreadtypes_h="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h" yann@850: ;; yann@850: *) yann@850: pthread_h= yann@850: pthreadtypes_h= yann@850: ;; yann@850: esac yann@850: if [ -n "${pthread_h}" ]; then yann@850: CT_DoExecLog ALL cp -v "${pthread_h}" "${CT_HEADERS_DIR}/pthread.h" yann@850: fi yann@850: if [ -n "${pthreadtypes_h}" ]; then yann@850: CT_DoExecLog ALL cp -v "${pthreadtypes_h}" "${CT_HEADERS_DIR}/bits/pthreadtypes.h" yann@850: fi yann@850: yann@850: CT_EndStep yann@850: } yann@850: yann@850: # Build and install start files yann@850: do_libc_start_files() { yann@1482: local -a extra_config yann@1260: yann@850: # Needed only in the NPTL case. Otherwise, return. yann@850: [ "${CT_THREADS}" = "nptl" ] || return 0 yann@850: yann@850: CT_DoStep INFO "Installing C library start files" yann@850: yann@850: mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles" yann@850: cd "${CT_BUILD_DIR}/build-libc-startfiles" yann@850: yann@850: CT_DoLog EXTRA "Configuring C library" yann@850: yann@850: # Add some default glibc config options if not given by user. yann@850: case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in yann@850: *-tls*) ;; yann@1482: *) extra_config+=("--with-tls") yann@850: esac yann@850: case "${CT_SHARED_LIBS}" in yann@1482: y) extra_config+=("--enable-shared");; yann@1482: *) extra_config+=("--disable-shared");; yann@850: esac yann@850: case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in yann@1482: y,) extra_config+=("--with-fp");; yann@1482: ,y) extra_config+=("--without-fp");; yann@850: esac yann@850: # Obviously, we want threads, as we come here only for NPTL yann@1482: extra_config+=("--with-__thread") yann@850: yann@850: addons_config="--enable-add-ons=$(do_libc_add_ons_list ,)" yann@1482: extra_config+=("${addons_config}") yann@850: yann@1482: extra_config+=("$(do_libc_min_kernel_config)") yann@950: yann@850: # Add some default CC args yann@1762: glibc_version="$( grep -E '\' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/version.h" \ yann@1762: |cut -d '"' -f 2 yann@1762: )" yann@1762: glibc_version_major=$(echo ${glibc_version} |sed -r -e 's/^([[:digit:]]+).*/\1/') yann@1762: glibc_version_minor=$(echo ${glibc_version} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/') yann@850: if [ ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6 \ yann@850: -o ${glibc_version_major} -gt 2 ]; then yann@850: # Don't use -pipe: configure chokes on it for glibc >= 2.6. yann@850: CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y" yann@850: extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}" yann@850: else yann@850: extra_cc_args="${CT_CFLAGS_FOR_HOST}" yann@850: fi yann@850: extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}" yann@850: yann@850: cross_cc=$(CT_Which "${CT_TARGET}-gcc") yann@850: CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'" yann@850: CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'" yann@1482: CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'" yann@850: CT_DoLog DEBUG "Extra CC args passed : '${extra_cc_args}'" yann@850: yann@1232: # Pre-seed the configparms file with values from the config option yann@1627: printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms yann@850: yann@850: echo "libc_cv_forced_unwind=yes" > config.cache yann@850: echo "libc_cv_c_cleanup=yes" >> config.cache yann@850: yann@850: # Please see the comment for the configure step in do_libc(). yann@850: yann@1041: BUILD_CC="${CT_BUILD}-gcc" \ yann@1551: CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2" \ yann@850: CC="${cross_cc} ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \ yann@850: AR=${CT_TARGET}-ar \ yann@850: RANLIB=${CT_TARGET}-ranlib \ yann@850: CT_DoExecLog ALL \ yann@1759: "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure" \ yann@850: --prefix=/usr \ yann@1041: --build="${CT_BUILD}" \ yann@850: --host=${CT_TARGET} \ yann@850: --without-cvs \ yann@850: --disable-profile \ yann@850: --disable-debug \ yann@850: --without-gd \ yann@850: --with-headers="${CT_HEADERS_DIR}" \ yann@850: --cache-file=config.cache \ yann@1482: "${extra_config[@]}" \ yann@850: ${CT_LIBC_GLIBC_EXTRA_CONFIG} yann@850: yann@850: #TODO: should check whether slibdir has been set in configparms to */lib64 yann@850: # and copy the startfiles into the appropriate libdir. yann@850: CT_DoLog EXTRA "Building C library start files" yann@1395: CT_DoExecLog ALL make OBJDUMP_FOR_HOST="${CT_TARGET}-objdump" \ yann@1395: PARALLELMFLAGS="${PARALLELMFLAGS}" \ yann@1395: csu/subdir_lib yann@850: yann@850: CT_DoLog EXTRA "Installing C library start files" yann@850: if [ "${CT_USE_SYSROOT}" = "y" ]; then yann@850: CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/usr/lib/" yann@850: else yann@850: CT_DoExecLog ALL cp -fpv csu/crt[1in].o "${CT_SYSROOT_DIR}/lib/" yann@850: fi yann@850: yann@850: CT_EndStep yann@850: } yann@850: yann@850: # This function builds and install the full glibc yann@850: do_libc() { yann@1482: local -a extra_config yann@1260: yann@850: CT_DoStep INFO "Installing C library" yann@850: yann@850: mkdir -p "${CT_BUILD_DIR}/build-libc" yann@850: cd "${CT_BUILD_DIR}/build-libc" yann@850: yann@850: CT_DoLog EXTRA "Configuring C library" yann@850: yann@850: # Add some default glibc config options if not given by user. yann@850: # We don't need to be conditional on wether the user did set different yann@850: # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config yann@850: yann@850: case "${CT_THREADS}" in yann@1482: nptl) extra_config+=("--with-__thread" "--with-tls");; yann@1482: linuxthreads) extra_config+=("--with-__thread" "--without-tls" "--without-nptl");; yann@1482: none) extra_config+=("--without-__thread" "--without-nptl") yann@850: case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in yann@850: *-tls*) ;; yann@1482: *) extra_config+=("--without-tls");; yann@850: esac yann@850: ;; yann@850: esac yann@850: yann@850: case "${CT_SHARED_LIBS}" in yann@1482: y) extra_config+=("--enable-shared");; yann@1482: *) extra_config+=("--disable-shared");; yann@850: esac yann@850: yann@850: case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in jimfriel@1486: y,) extra_config+=("--with-fp");; jimfriel@1486: ,y) extra_config+=("--without-fp");; yann@850: esac yann@850: yann@850: case "$(do_libc_add_ons_list ,)" in yann@850: "") ;; yann@1482: *) extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");; yann@850: esac yann@850: yann@1482: extra_config+=("$(do_libc_min_kernel_config)") yann@950: yann@850: # Add some default CC args yann@1150: glibc_version_major=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^([[:digit:]]+).*/\1/') yann@1150: glibc_version_minor=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^[[:digit:]]+[\.-_]([[:digit:]]+).*/\1/') yann@850: if [ ${glibc_version_major} -eq 2 -a ${glibc_version_minor} -ge 6 \ yann@850: -o ${glibc_version_major} -gt 2 ]; then yann@850: # Don't use -pipe: configure chokes on it for glibc >= 2.6. yann@850: CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y" yann@850: extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}" yann@850: else yann@850: extra_cc_args="${CT_CFLAGS_FOR_HOST}" yann@850: fi yann@850: extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}" yann@850: yann@850: cross_cc=$(CT_Which "${CT_TARGET}-gcc") yann@850: CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'" yann@850: CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'" yann@850: CT_DoLog DEBUG "Extra config args passed: '${extra_config}'" yann@850: CT_DoLog DEBUG "Extra CC args passed : '${extra_cc_args}'" yann@850: yann@1232: # Pre-seed the configparms file with values from the config option yann@1627: printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms yann@850: yann@850: # For glibc 2.3.4 and later we need to set some autoconf cache yann@850: # variables, because nptl/sysdeps/pthread/configure.in does not yann@850: # work when cross-compiling. yann@850: if [ "${CT_THREADS}" = "nptl" ]; then yann@850: echo libc_cv_forced_unwind=yes yann@850: echo libc_cv_c_cleanup=yes yann@850: fi >config.cache yann@850: yann@850: # Configure with --prefix the way we want it on the target... yann@850: # There are a whole lot of settings here. You'll probably want yann@850: # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG yann@850: # Compare these options with the ones used when installing the glibc headers above - they're different. yann@850: # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" yann@850: # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. yann@850: # Set BUILD_CC, or you won't be able to build datafiles yann@850: # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs yann@850: yann@850: # OK. I'm fed up with those folks telling me what I should do. yann@850: # I don't configure nptl? Well, maybe that's purposedly because yann@850: # I don't want nptl! --disable-sanity-checks will shut up those yann@850: # silly messages. GNU folks again, he? yann@850: yann@1041: BUILD_CC="${CT_BUILD}-gcc" \ yann@1551: CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O2" \ yann@850: CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \ yann@850: AR=${CT_TARGET}-ar \ yann@850: RANLIB=${CT_TARGET}-ranlib \ yann@850: CT_DoExecLog ALL \ yann@1759: "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/configure" \ yann@850: --prefix=/usr \ yann@1041: --build=${CT_BUILD} \ yann@850: --host=${CT_TARGET} \ yann@850: --without-cvs \ yann@850: --disable-profile \ yann@850: --disable-debug \ yann@850: --without-gd \ yann@850: --disable-sanity-checks \ yann@850: --cache-file=config.cache \ yann@850: --with-headers="${CT_HEADERS_DIR}" \ yann@1482: "${extra_config[@]}" \ yann@850: ${CT_LIBC_GLIBC_EXTRA_CONFIG} yann@850: yann@1759: if grep -l '^install-lib-all:' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/Makerules" > /dev/null; then yann@850: # nptl-era glibc. yann@850: # If the install-lib-all target (which is added by our make-install-lib-all.patch) yann@850: # is present, it means we're building glibc-2.3.3 or later, and we can't yann@850: # build programs yet, as they require libeh, which won't be installed yann@850: # until full build of gcc yann@850: # YEM-FIXME: This comment is misleading: latest glibc-s do not have the yann@850: # make-install-lib-all.patch applied, so do not pass through this yann@850: # part of the if statement; nonetheless, they do build, and yann@850: # the result is useable (maybe the dual-pass core gcc is yann@850: # responsible for this). yann@850: GLIBC_INITIAL_BUILD_RULE=lib yann@850: GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers" yann@850: GLIBC_INSTALL_APPS_LATER=yes yann@850: else yann@850: # classic glibc. yann@850: # We can build and install everything with the bootstrap compiler. yann@850: # YEM-FIXME: See the above FIXME as well. yann@850: GLIBC_INITIAL_BUILD_RULE=all yann@850: GLIBC_INITIAL_INSTALL_RULE=install yann@850: GLIBC_INSTALL_APPS_LATER=no yann@850: fi yann@850: yann@1016: # glibc initial build hacks yann@1016: # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html yann@1016: case "${CT_ARCH},${CT_ARCH_CPU}" in yann@1016: powerpc,8??) yann@1016: CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)" yann@1016: GLIBC_INITIAL_BUILD_ASFLAGS="-DBROKEN_PPC_8xx_CPU15";; yann@1016: esac yann@1016: yann@850: # If this fails with an error like this: yann@850: # ... linux/autoconf.h: No such file or directory yann@850: # then you need to set the KERNELCONFIG variable to point to a .config file for this arch. yann@850: # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc yann@850: # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx yann@850: CT_DoLog EXTRA "Building C library" yann@850: CT_DoExecLog ALL make LD=${CT_TARGET}-ld \ yann@1395: RANLIB=${CT_TARGET}-ranlib \ yann@1395: OBJDUMP_FOR_HOST="${CT_TARGET}-objdump" \ yann@1395: ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}" \ yann@1395: PARALLELMFLAGS="${PARALLELMFLAGS}" \ yann@1395: ${GLIBC_INITIAL_BUILD_RULE} yann@850: yann@850: CT_DoLog EXTRA "Installing C library" yann@850: CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}" \ yann@850: ${LIBC_SYSROOT_ARG} \ yann@850: OBJDUMP_FOR_HOST="${CT_TARGET}-objdump" \ yann@1395: PARALLELMFLAGS="${PARALLELMFLAGS}" \ yann@850: ${GLIBC_INITIAL_INSTALL_RULE} yann@850: yann@850: # This doesn't seem to work when building a crosscompiler, yann@850: # as it tries to execute localedef using the just-built ld.so!? yann@850: #CT_DoLog EXTRA "Installing locales" yann@850: #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL yann@850: yann@850: # Fix problems in linker scripts. yann@850: # yann@872: # Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html, yann@850: # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm yann@1037: # No need to look into the lib64/ dirs here and there, they point to the yann@1037: # corresponding lib/ directories. yann@850: # yann@850: # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig yann@850: CT_DoLog EXTRA "Fixing C library linker scripts" yann@850: for file in libc.so libpthread.so libgcc_s.so; do yann@1037: for dir in lib usr/lib; do yann@850: if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then yann@850: CT_DoExecLog ALL cp -v "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig" yann@850: CT_DoLog DEBUG "Fixing '${CT_SYS_ROOT_DIR}/${dir}/${file}'" yann@872: CT_DoExecLog ALL sed -i -r -e '/BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}" yann@850: fi yann@850: done yann@850: done yann@850: yann@850: CT_EndStep yann@850: } yann@850: yann@850: # This function finishes the glibc install yann@850: do_libc_finish() { yann@850: # Finally, build and install glibc programs, now that libeh (if any) is installed yann@850: # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with yann@850: # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info' yann@850: # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info' yann@850: [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0 yann@850: yann@850: CT_DoStep INFO "Finishing C library" yann@850: yann@850: cd "${CT_BUILD_DIR}/build-libc" yann@850: yann@850: CT_DoLog EXTRA "Re-building C library" yann@1395: CT_DoExecLog ALL make LD=${CT_TARGET}-ld \ yann@1395: RANLIB=${CT_TARGET}-ranlib \ yann@1395: OBJDUMP_FOR_HOST="${CT_TARGET}-objdump" \ yann@1395: ASFLAGS="${GLIBC_INITIAL_BUILD_ASFLAGS}" \ yann@1395: PARALLELMFLAGS="${PARALLELMFLAGS}" yann@850: yann@850: CT_DoLog EXTRA "Installing missing C library components" yann@850: # note: should do full install and then fix linker scripts, but this is faster yann@850: for t in bin rootsbin sbin data others; do yann@850: CT_DoExecLog ALL make install_root="${CT_SYSROOT_DIR}" \ yann@850: ${LIBC_SYSROOT_ARG} \ yann@850: OBJDUMP_FOR_HOST="${CT_TARGET}-objdump" \ yann@1395: PARALLELMFLAGS="${PARALLELMFLAGS}" \ yann@850: install-${t} yann@850: done yann@850: yann@850: CT_EndStep yann@850: } yann@850: yann@850: # Build up the addons list, separated with $1 yann@850: do_libc_add_ons_list() { yann@850: local sep="$1" yann@950: local addons_list=$(echo "${CT_LIBC_ADDONS_LIST}" |sed -r -e "s/[ ,]/${sep}/g;") yann@850: case "${CT_THREADS}" in yann@850: none) ;; yann@850: *) addons_list="${addons_list}${sep}${CT_THREADS}";; yann@850: esac yann@850: [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports" yann@950: # Remove duplicate, leading and trailing separators yann@950: echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;" yann@850: } yann@850: yann@950: # Builds up the minimum supported Linux kernel version yann@950: do_libc_min_kernel_config() { yann@950: local min_kernel_config= yann@950: case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in yann@950: *enable-kernel*) ;; yann@950: *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then yann@950: # We can't rely on the kernel version from the configuration, yann@950: # because it might not be available if the user uses pre-installed yann@950: # headers. On the other hand, both method will have the kernel yann@950: # version installed in "usr/include/linux/version.h" in the sys-root. yann@950: # Parse that instead of having two code-paths. yann@950: version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h" yann@950: CT_TestOrAbort "Linux version is unavailable in installed headers files" -f "${version_code_file}" -a -r "${version_code_file}" yann@950: version_code=$(grep -E LINUX_VERSION_CODE "${version_code_file}" |cut -d ' ' -f 3) yann@950: version=$(((version_code>>16)&0xFF)) yann@950: patchlevel=$(((version_code>>8)&0xFF)) yann@950: sublevel=$((version_code&0xFF)) yann@950: min_kernel_config="--enable-kernel=${version}.${patchlevel}.${sublevel}" yann@950: elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then yann@950: # Trim the fourth part of the linux version, keeping only the first three numbers yann@950: min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')" yann@950: fi yann@950: ;; yann@950: esac yann@950: echo "${min_kernel_config}" yann@950: }