# HG changeset patch # User "Yann E. MORIN" # Date 1224524803 0 # Node ID 82209e5c862a8fac06628ae75be4168290e2d4dd # Parent 513d1a0c021a34c60747b7902d5aafd2165e2d30 Correctly handle the minimum supported kernel version in glibc. Should be propagated to eglibc as well... /trunk/scripts/build/libc/glibc.sh | 78 39 39 0 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff -r 513d1a0c021a -r 82209e5c862a scripts/build/libc/glibc.sh --- a/scripts/build/libc/glibc.sh Mon Oct 20 09:50:45 2008 +0000 +++ b/scripts/build/libc/glibc.sh Mon Oct 20 17:46:43 2008 +0000 @@ -88,23 +88,14 @@ # Override libc_cv_ppc_machine so glibc-cvs doesn't complain # 'a version of binutils that supports .machine "altivec" is needed'. - addons_config="--enable-add-ons=$(do_libc_add_ons_list ,)" + addons_list="$(do_libc_add_ons_list ,)" # We need to remove any threading addon when installing headers - addons_config="${addons_config//nptl/}" - addons_config="${addons_config//linuxthreads/}" - addons_config=$(echo "${addons_config}" |sed -r -e 's/^,+//; s/,+$//; s/,+/,/g;') + addons_list="${addons_list//nptl/}" + addons_list="${addons_list//linuxthreads/}" + # Remove duplicate, leading and trailing separators + addons_config="--enable-add-ons=$(echo "${addons_list}" |sed -r -e 's/,+/,/; s/^,//; s/,$//g;')" - extra_config="${addons_config}" - min_kernel_config= - case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in - *enable-kernel*) ;; - *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" \ - -o "${CT_LIBC_GLIBC_USE_HEADERS_MIN_KERNEL}" = "y" ]; then - min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')" - fi - ;; - esac - extra_config="${extra_config} ${min_kernel_config}" + extra_config="${addons_config} $(do_libc_min_kernel_config)" cross_cc=$(CT_Which "${CT_TARGET}-gcc") CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'" @@ -226,16 +217,6 @@ # Add some default glibc config options if not given by user. extra_config= - min_kernel_config= - case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in - *enable-kernel*) ;; - *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" \ - -o "${CT_LIBC_GLIBC_USE_HEADERS_MIN_KERNEL}" = "y" ]; then - min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')" - fi - ;; - esac - extra_config="${extra_config} ${min_kernel_config}" case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in *-tls*) ;; *) extra_config="${extra_config} --with-tls" @@ -254,6 +235,8 @@ addons_config="--enable-add-ons=$(do_libc_add_ons_list ,)" extra_config="${extra_config} ${addons_config}" + extra_config="${extra_config} $(do_libc_min_kernel_config)" + # Add some default CC args glibc_version_major=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^([^\.]+)\..*/\1/') glibc_version_minor=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^[^\.]+\.([^.]+).*/\1/') @@ -338,17 +321,6 @@ # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config extra_config= - min_kernel_config="" - case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in - *enable-kernel*) ;; - *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" \ - -o "${CT_LIBC_GLIBC_USE_HEADERS_MIN_KERNEL}" = "y" ]; then - min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')" - fi - ;; - esac - extra_config="${extra_config} ${min_kernel_config}" - case "${CT_THREADS}" in nptl) extra_config="${extra_config} --with-__thread --with-tls";; linuxthreads) extra_config="${extra_config} --with-__thread --without-tls --without-nptl";; @@ -375,6 +347,8 @@ *) extra_config="${extra_config} --enable-add-ons=$(do_libc_add_ons_list ,)";; esac + extra_config="${extra_config} $(do_libc_min_kernel_config)" + # Add some default CC args glibc_version_major=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^([^\.]+)\..*/\1/') glibc_version_minor=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^[^\.]+\.([^.]+).*/\1/') @@ -542,13 +516,39 @@ # Build up the addons list, separated with $1 do_libc_add_ons_list() { local sep="$1" - local addons_list=$(echo "${CT_LIBC_ADDONS_LIST//,/${sep}}" |tr -s ,) + local addons_list=$(echo "${CT_LIBC_ADDONS_LIST}" |sed -r -e "s/[ ,]/${sep}/g;") case "${CT_THREADS}" in none) ;; *) addons_list="${addons_list}${sep}${CT_THREADS}";; esac [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports" - addons_list="${addons_list%%${sep}}" - echo "${addons_list##${sep}}" + # Remove duplicate, leading and trailing separators + echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;" } +# Builds up the minimum supported Linux kernel version +do_libc_min_kernel_config() { + local min_kernel_config= + case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in + *enable-kernel*) ;; + *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then + # We can't rely on the kernel version from the configuration, + # because it might not be available if the user uses pre-installed + # headers. On the other hand, both method will have the kernel + # version installed in "usr/include/linux/version.h" in the sys-root. + # Parse that instead of having two code-paths. + version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h" + CT_TestOrAbort "Linux version is unavailable in installed headers files" -f "${version_code_file}" -a -r "${version_code_file}" + version_code=$(grep -E LINUX_VERSION_CODE "${version_code_file}" |cut -d ' ' -f 3) + version=$(((version_code>>16)&0xFF)) + patchlevel=$(((version_code>>8)&0xFF)) + sublevel=$((version_code&0xFF)) + min_kernel_config="--enable-kernel=${version}.${patchlevel}.${sublevel}" + elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then + # Trim the fourth part of the linux version, keeping only the first three numbers + min_kernel_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')" + fi + ;; + esac + echo "${min_kernel_config}" +}