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@2272: # Add the definitions common to glibc and eglibc yann@2272: # do_libc_headers yann@2272: # do_libc_start_files yann@2272: . "${CT_LIB_DIR}/scripts/build/libc/glibc-eglibc.sh-common" yann@2272: 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@1901: 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@1901: 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 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: bryanhundven@2180: if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then bryanhundven@2180: extra_config+=("--disable-versioning") bryanhundven@2180: fi bryanhundven@2180: bryanhundven@2181: if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then bryanhundven@2181: extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}") bryanhundven@2181: fi bryanhundven@2181: 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@1764: glibc_version="$( grep -E '\' "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/version.h" \ yann@1764: |cut -d '"' -f 2 yann@1764: )" yann@1764: glibc_version_major=$(echo ${glibc_version} |sed -r -e 's/^([[:digit:]]+).*/\1/') yann@1764: 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@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@2002: # ./configure is mislead by our tools override wrapper for bash yann@2002: # so just tell it where the real bash is _on_the_target_! yann@2002: # Notes: yann@2002: # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL yann@2002: # - ${BASH_SHELL} is only used to set BASH yann@2002: # - ${BASH} is only used to set the shebang yann@2002: # in two scripts to run on the target yann@2002: # So we can safely bypass bash detection at compile time. yann@2002: # Should this change in a future glibc release, we'd better yann@2002: # directly mangle the generated scripts _after_ they get built, yann@2002: # or even after they get installed... glibc is such a sucker... yann@2002: echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache yann@2002: 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 \ anthony@2154: CT_DoExecLog CFG \ 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@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@2267: all 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@2267: install 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: }