scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Wed Dec 26 13:30:51 2012 +0100 (2012-12-26)
changeset 3145 598880dab0f3
parent 3143 d06a9462cc20
child 3162 e51eb0a614c7
permissions -rw-r--r--
libc/glibc: both glibc and eglibc have pkgversion and bugurl

Well, all eglibc version we support do, and latest glibc versions
we support do.

Not all glibc versions do, but older versions simply ignore the
unrecognised ./configure flags.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
     1 # This file contains the functions common to glibc and eglibc
     2 
     3 # Extract the C library tarball(s)
     4 do_libc_extract() {
     5     local addon
     6 
     7     # Extract the main tarball
     8     CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}"
     9     CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
    10     CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}"
    11 
    12     # Extract the add-opns
    13     for addon in $(do_libc_add_ons_list " "); do
    14         # If the addon was bundled with the main archive, we do not
    15         # need to extract it. Worse, if we were to try to extract
    16         # it, we'd get an error.
    17         if [ -d "${addon}" ]; then
    18             CT_DoLog DEBUG "Add-on already present, spkipping extraction"
    19             continue
    20         fi
    21 
    22         CT_Extract nochdir "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    23 
    24         CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \
    25             -d "${addon}" -a -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    26 
    27         # Some addons have the 'long' name, while others have the
    28         # 'short' name, but patches are non-uniformly built with
    29         # either the 'long' or 'short' name, whatever the addons name
    30         # but we prefer the 'short' name and avoid duplicates.
    31         if [ -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ]; then
    32             CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}"
    33         fi
    34 
    35         CT_DoExecLog FILE ln -s "${addon}" "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    36 
    37         CT_Patch nochdir "${CT_LIBC}" "${addon}-${CT_LIBC_VERSION}"
    38 
    39         # Remove the long name since it can confuse configure scripts to run
    40         # the same source twice.
    41         rm "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    42     done
    43 
    44     # The configure files may be older than the configure.in files
    45     # if using a snapshot (or even some tarballs). Fake them being
    46     # up to date.
    47     find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
    48 
    49     CT_Popd
    50 
    51     if [ "${CT_LIBC_LOCALES}" = "y" ]; then
    52         do_libc_locales_extract
    53     fi
    54 }
    55 
    56 # Build and install headers and start files
    57 do_libc_start_files() {
    58     # Start files and Headers should be configured the same way as the
    59     # final libc, but built and installed differently.
    60     do_libc_backend libc_mode=startfiles
    61 }
    62 
    63 # This function builds and install the full C library
    64 do_libc() {
    65     do_libc_backend libc_mode=final
    66 }
    67 
    68 # This backend builds the C library once for each multilib
    69 # variant the compiler gives us
    70 # Usage: do_libc_backend param=value [...]
    71 #   Parameter           : Definition                            : Type      : Default
    72 #   libc_mode           : 'startfiles' or 'final'               : string    : (none)
    73 do_libc_backend() {
    74     local libc_mode
    75     local -a multilibs
    76     local multilib
    77     local multi_dir
    78     local multi_flags
    79     local extra_dir
    80     local libc_headers libc_startfiles libc_full
    81     local hdr
    82     local arg
    83 
    84     for arg in "$@"; do
    85         eval "${arg// /\\ }"
    86     done
    87 
    88     case "${libc_mode}" in
    89         startfiles)
    90             CT_DoStep INFO "Installing C library headers & start files"
    91             hdr=y
    92             libc_startfiles=y
    93             libc_full=
    94             ;;
    95         final)
    96             CT_DoStep INFO "Installing C library"
    97             hdr=
    98             libc_startfiles=
    99             libc_full=y
   100             ;;
   101         *)  CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
   102     esac
   103 
   104     # If gcc is not configured for multilib, it still prints
   105     # a single line for the default settings
   106     multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) )
   107     for multilib in "${multilibs[@]}"; do
   108         multi_dir="${multilib%%;*}"
   109         if [ "${multi_dir}" != "." ]; then
   110             CT_DoStep INFO "Building for multilib subdir='${multi_dir}'"
   111 
   112             extra_flags="$( echo "${multilib#*;}"       \
   113                             |${sed} -r -e 's/@/ -/g;'   \
   114                           )"
   115             extra_dir="/${multi_dir}"
   116 
   117             # glibc install its files in ${extra_dir}/{usr/,}lib
   118             # while gcc expects them in {,usr/}lib/${extra_dir}.
   119             # Prepare some symlinks so glibc installs in fact in
   120             # the proper place
   121             # We do it in the start-files step, so it is not needed
   122             # to do it in the final step, as the symlinks will
   123             # already exist
   124             if [ "${libc_mode}" = "startfiles" ]; then
   125                 CT_Pushd "${CT_SYSROOT_DIR}"
   126                 CT_DoExecLog ALL mkdir -p "lib/${multi_dir}"        \
   127                                           "usr/lib/${multi_dir}"    \
   128                                           "${multi_dir}"            \
   129                                           "${multi_dir}/usr"
   130                 CT_DoExecLog ALL ln -sf "../lib/${multi_dir}" "${multi_dir}/lib"
   131                 CT_DoExecLog ALL ln -sf "../../usr/lib/${multi_dir}" "${multi_dir}/usr/lib"
   132                 CT_Popd
   133             fi
   134             libc_headers=
   135         else
   136             extra_dir=
   137             extra_flags=
   138             libc_headers="${hdr}"
   139         fi
   140 
   141         CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
   142 
   143         do_libc_backend_once extra_dir="${extra_dir}"               \
   144                              extra_flags="${extra_flags}"           \
   145                              libc_headers="${libc_headers}"         \
   146                              libc_startfiles="${libc_startfiles}"   \
   147                              libc_full="${libc_full}"
   148 
   149         CT_Popd
   150 
   151         if [ "${multi_dir}" != "." ]; then
   152             if [ "${libc_mode}" = "final" ]; then
   153                 CT_DoLog EXTRA "Fixing up multilib location"
   154 
   155                 # rewrite the library multiplexers
   156                 for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do
   157                     for l in libc libpthread libgcc_s; do
   158                         if [    -f "${CT_SYSROOT_DIR}/${d}/${l}.so"    \
   159                              -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so    ]
   160                         then
   161                             CT_DoExecLog DEBUG ${sed} -r -i                                 \
   162                                                       -e "s:/lib/:/lib/${multi_dir}/:g;"    \
   163                                                       "${CT_SYSROOT_DIR}/${d}/${l}.so"
   164                         fi
   165                     done
   166                 done
   167                 # Remove the multi_dir now it is no longer useful
   168                 CT_DoExecLog DEBUG rm -rf "${CT_SYSROOT_DIR}/${multi_dir}"
   169             fi # libc_mode == final
   170 
   171             CT_EndStep
   172         fi
   173     done
   174 
   175     CT_EndStep
   176 }
   177 
   178 # This backend builds the C library once
   179 # Usage: do_libc_backend_once param=value [...]
   180 #   Parameter           : Definition                            : Type      : Default
   181 #   libc_headers        : Build libc headers                    : bool      : n
   182 #   libc_startfiles     : Build libc start-files                : bool      : n
   183 #   libc_full           : Build full libc                       : bool      : n
   184 #   extra_flags         : Extra CFLAGS to use (for multilib)    : string    : (empty)
   185 #   extra_dir           : Extra subdir for multilib             : string    : (empty)
   186 do_libc_backend_once() {
   187     local libc_headers
   188     local libc_startfiles
   189     local libc_full
   190     local extra_flags
   191     local extra_dir
   192     local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
   193     local extra_cc_args
   194     local -a extra_config
   195     local -a extra_make_args
   196     local glibc_cflags
   197     local float_extra
   198     local endian_extra
   199     local arg
   200 
   201     for arg in "$@"; do
   202         eval "${arg// /\\ }"
   203     done
   204 
   205     CT_DoLog EXTRA "Configuring C library"
   206 
   207     case "${CT_LIBC}" in
   208         eglibc)
   209             if [ "${CT_EGLIBC_CUSTOM_CONFIG}" = "y" ]; then
   210                 CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/eglibc.config" option-groups.config
   211             fi
   212             if [ "${CT_EGLIBC_OPT_SIZE}" = "y" ]; then
   213                 OPTIMIZE=-Os
   214             else
   215                 OPTIMIZE=-O2
   216             fi
   217             # always include rpc, the user can still override it with TI-RPC
   218             extra_config+=( --enable-obsolete-rpc )
   219             ;;
   220         glibc)
   221             # glibc can't be built without -O2 (reference needed!)
   222             OPTIMIZE=-O2
   223             # Also, if those two are missing, iconv build breaks
   224             extra_config+=( --disable-debug --disable-sanity-checks )
   225             ;;
   226     esac
   227 
   228     # Add some default glibc config options if not given by user.
   229     # We don't need to be conditional on wether the user did set different
   230     # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
   231     # extra_config
   232 
   233     extra_config+=("$(do_libc_min_kernel_config)")
   234 
   235     case "${CT_THREADS}" in
   236         nptl)           extra_config+=("--with-__thread" "--with-tls");;
   237         linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
   238         none)           extra_config+=("--without-__thread" "--without-nptl")
   239                         case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   240                             *-tls*) ;;
   241                             *) extra_config+=("--without-tls");;
   242                         esac
   243                         ;;
   244     esac
   245 
   246     case "${CT_SHARED_LIBS}" in
   247         y) extra_config+=("--enable-shared");;
   248         *) extra_config+=("--disable-shared");;
   249     esac
   250 
   251     float_extra="$( echo "${extra_flags}"       \
   252                     |${sed} -r -e '/^(.*[[:space:]])?-m(hard|soft)-float([[:space:]].*)?$/!d;'  \
   253                                -e 's//\2/;'     \
   254                   )"
   255     case "${float_extra}" in
   256         hard)   extra_config+=("--with-fp");;
   257         soft)   extra_config+=("--without-fp");;
   258         "")
   259             case "${CT_ARCH_FLOAT}" in
   260                 hard|softfp)    extra_config+=("--with-fp");;
   261                 soft)           extra_config+=("--without-fp");;
   262             esac
   263             ;;
   264     esac
   265 
   266     if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
   267         extra_config+=("--disable-versioning")
   268     fi
   269 
   270     if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
   271         extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
   272     fi
   273 
   274     case "$(do_libc_add_ons_list ,)" in
   275         "") extra_config+=("--enable-add-ons=no");;
   276         *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
   277     esac
   278 
   279     extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   280     [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   281 
   282     # Extract the endianness options if any
   283     # This should cover all possible endianness options
   284     # in gcc, but it is prone to bit-rot... :-(
   285     endian_extra="$( echo "${extra_flags}"      \
   286                      |${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \
   287                                 -e 's//\2/;'    \
   288                    )"
   289     case "${endian_extra}" in
   290         EB|mbig-endian|mbig|meb|mb)
   291             extra_cc_args="${extra_cc_args} ${endian_extra}"
   292             ;;
   293         EL|mlittle-endian|mlittle|mel|ml)
   294             extra_cc_args="${extra_cc_args} ${endian_extra}"
   295             ;;
   296         "") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
   297             ;;
   298     esac
   299 
   300     touch config.cache
   301     if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
   302         echo "libc_cv_forced_unwind=yes" >>config.cache
   303         echo "libc_cv_c_cleanup=yes" >>config.cache
   304     fi
   305 
   306     # Pre-seed the configparms file with values from the config option
   307     printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
   308 
   309     cross_cc=$(CT_Which "${CT_TARGET}-gcc")
   310     extra_cc_args+=" ${extra_flags}"
   311 
   312     case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
   313         y)  ;;
   314         *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
   315     esac
   316     glibc_cflags+=" ${CT_TARGET_CFLAGS} ${OPTIMIZE} ${CT_LIBC_GLIBC_EXTRA_CFLAGS}"
   317 
   318     # ./configure is mislead by our tools override wrapper for bash
   319     # so just tell it where the real bash is _on_the_target_!
   320     # Notes:
   321     # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
   322     # - ${BASH_SHELL}            is only used to set BASH
   323     # - ${BASH}                  is only used to set the shebang
   324     #                            in two scripts to run on the target
   325     # So we can safely bypass bash detection at compile time.
   326     # Should this change in a future eglibc release, we'd better
   327     # directly mangle the generated scripts _after_ they get built,
   328     # or even after they get installed...
   329     echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
   330 
   331     # Configure with --prefix the way we want it on the target...
   332     # There are a whole lot of settings here.  You'll probably want
   333     # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
   334     # Compare these options with the ones used when installing the glibc headers above - they're different.
   335     # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
   336     # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
   337     # Set BUILD_CC, or we won't be able to build datafiles
   338     # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
   339     # when the shell is not bash... Sigh... :-(
   340 
   341     CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
   342     CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
   343     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
   344     CT_DoLog DEBUG "Extra CC args passed    : '${glibc_cflags}'"
   345     CT_DoLog DEBUG "Extra flags (multilib)  : '${extra_flags}'"
   346 
   347     CT_DoExecLog CFG                                                \
   348     BUILD_CC="${CT_BUILD}-gcc"                                      \
   349     CFLAGS="${glibc_cflags}"                                        \
   350     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
   351     AR=${CT_TARGET}-ar                                              \
   352     RANLIB=${CT_TARGET}-ranlib                                      \
   353     "${CONFIG_SHELL}"                                               \
   354     "${src_dir}/configure"                                          \
   355         --prefix=/usr                                               \
   356         --build=${CT_BUILD}                                         \
   357         --host=${CT_TARGET}                                         \
   358         --cache-file="$(pwd)/config.cache"                          \
   359         --without-cvs                                               \
   360         --disable-profile                                           \
   361         --without-gd                                                \
   362         --with-headers="${CT_HEADERS_DIR}"                          \
   363         "${extra_config[@]}"                                        \
   364         "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
   365 
   366     # build hacks
   367     case "${CT_ARCH},${CT_ARCH_CPU}" in
   368         powerpc,8??)
   369             # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
   370             CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
   371             extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
   372             ;;
   373     esac
   374 
   375     if [ "${libc_headers}" = "y" ]; then
   376         CT_DoLog EXTRA "Installing C library headers"
   377 
   378         # use the 'install-headers' makefile target to install the
   379         # headers
   380         CT_DoExecLog ALL make ${JOBSFLAGS}                          \
   381                          install_root=${CT_SYSROOT_DIR}${extra_dir} \
   382                          install-bootstrap-headers=yes              \
   383                          "${extra_make_args[@]}"                    \
   384                          install-headers
   385 
   386         # For glibc, a few headers need to be manually installed
   387         if [ "${CT_LIBC}" = "glibc" ]; then
   388             # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
   389             # so do them by hand.  We can tolerate an empty stubs.h for the moment.
   390             # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
   391             mkdir -p "${CT_HEADERS_DIR}/gnu"
   392             CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
   393             CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
   394                                    "${CT_HEADERS_DIR}/features.h"
   395 
   396             # Building the bootstrap gcc requires either setting inhibit_libc, or
   397             # having a copy of stdio_lim.h... see
   398             # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
   399             CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
   400 
   401             # Following error building gcc-4.0.0's gcj:
   402             #  error: bits/syscall.h: No such file or directory
   403             # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
   404             # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
   405             case "${CT_ARCH}" in
   406                 arm)    ;;
   407                 *)  CT_DoExecLog ALL cp -v "misc/syscall-list.h"            \
   408                                            "${CT_HEADERS_DIR}/bits/syscall.h"
   409                     ;;
   410             esac
   411         fi
   412     fi # libc_headers == y
   413 
   414     if [ "${libc_startfiles}" = "y" ]; then
   415         if [ "${CT_THREADS}" = "nptl" ]; then
   416             CT_DoLog EXTRA "Installing C library start files"
   417 
   418             # there are a few object files needed to link shared libraries,
   419             # which we build and install by hand
   420             CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
   421             CT_DoExecLog ALL make ${JOBSFLAGS}  \
   422                         "${extra_make_args[@]}" \
   423                         csu/subdir_lib
   424             CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o    \
   425                                 "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
   426 
   427             # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
   428             # However, since we will never actually execute its code,
   429             # it doesn't matter what it contains.  So, treating '/dev/null'
   430             # as a C source file, we produce a dummy 'libc.so' in one step
   431             CT_DoExecLog ALL "${cross_cc}" -nostdlib        \
   432                                            -nostartfiles    \
   433                                            -shared          \
   434                                            -x c /dev/null   \
   435                                            -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so"
   436         fi # threads == nptl
   437     fi # libc_headers == y
   438 
   439     if [ "${libc_full}" = "y" ]; then
   440         CT_DoLog EXTRA "Building C library"
   441         CT_DoExecLog ALL make ${JOBSFLAGS}              \
   442                               "${extra_make_args[@]}"   \
   443                               all
   444 
   445         CT_DoLog EXTRA "Installing C library"
   446         CT_DoExecLog ALL make ${JOBSFLAGS}                                  \
   447                               "${extra_make_args[@]}"                       \
   448                               install_root="${CT_SYSROOT_DIR}${extra_dir}"  \
   449                               install
   450 
   451         if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   452             CT_DoLog EXTRA "Building and installing the C library manual"
   453             # Omit JOBSFLAGS as GLIBC has problems building the
   454             # manuals in parallel
   455             CT_DoExecLog ALL make pdf html
   456             # EGLIBC doesn't have a install-{pdf.html}, and older
   457             # versions leave the manuals in the source directory
   458             CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc
   459             if [ "${CT_LIBC_EGLIBC_2_16_or_later}" = "y" ]; then
   460                 CT_DoExecLog ALL cp -av manual/*.pdf manual/libc \
   461                     ${CT_PREFIX_DIR}/share/doc
   462             else
   463                 CT_DoExecLog ALL cp -av ${src_dir}/manual/*.pdf ${src_dir}/manual/libc \
   464                     ${CT_PREFIX_DIR}/share/doc
   465             fi
   466         fi
   467 
   468         if [ "${CT_LIBC_LOCALES}" = "y" ]; then
   469             do_libc_locales
   470         fi
   471     fi # libc_full == y
   472 }
   473 
   474 # This function finishes the C library install
   475 # This is a no-op
   476 do_libc_finish() {
   477     :
   478 }
   479 
   480 # Build up the addons list, separated with $1
   481 do_libc_add_ons_list() {
   482     local sep="$1"
   483     local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
   484                           |sed -r -e "s/[[:space:],]/${sep}/g;" \
   485                         )"
   486     case "${CT_THREADS}" in
   487         none)   ;;
   488         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   489     esac
   490     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   491     # Remove duplicate, leading and trailing separators
   492     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   493 }
   494 
   495 # Compute up the minimum supported Linux kernel version
   496 do_libc_min_kernel_config() {
   497     local min_kernel_config
   498 
   499     case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   500         *--enable-kernel*) ;;
   501         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   502                 # We can't rely on the kernel version from the configuration,
   503                 # because it might not be available if the user uses pre-installed
   504                 # headers. On the other hand, both method will have the kernel
   505                 # version installed in "usr/include/linux/version.h" in the sysroot.
   506                 # Parse that instead of having two code-paths.
   507                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   508                 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
   509                     CT_Abort "Linux version is unavailable in installed headers files"
   510                 fi
   511                 version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
   512                                  |cut -d ' ' -f 3                                   \
   513                                )"
   514                 version=$(((version_code>>16)&0xFF))
   515                 patchlevel=$(((version_code>>8)&0xFF))
   516                 sublevel=$((version_code&0xFF))
   517                 min_kernel_config="${version}.${patchlevel}.${sublevel}"
   518             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   519                 # Trim the fourth part of the linux version, keeping only the first three numbers
   520                 min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
   521                                       |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
   522                                     )"
   523             fi
   524             echo "--enable-kernel=${min_kernel_config}"
   525             ;;
   526     esac
   527 }