scripts/build/libc/glibc-eglibc.sh-common
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
parent 2883 cea814c9932a
child 3041 b9f695c2f5b7
permissions -rw-r--r--
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
     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             ;;
   218         glibc)
   219             # glibc can't be built without -O2 (reference needed!)
   220             OPTIMIZE=-O2
   221             # Also, if those two are missing, iconv build breaks
   222             extra_config+=( --disable-debug --disable-sanity-checks )
   223             ;;
   224     esac
   225 
   226     # Add some default glibc config options if not given by user.
   227     # We don't need to be conditional on wether the user did set different
   228     # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
   229     # extra_config
   230 
   231     extra_config+=("$(do_libc_min_kernel_config)")
   232 
   233     case "${CT_THREADS}" in
   234         nptl)           extra_config+=("--with-__thread" "--with-tls");;
   235         linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
   236         none)           extra_config+=("--without-__thread" "--without-nptl")
   237                         case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   238                             *-tls*) ;;
   239                             *) extra_config+=("--without-tls");;
   240                         esac
   241                         ;;
   242     esac
   243 
   244     case "${CT_SHARED_LIBS}" in
   245         y) extra_config+=("--enable-shared");;
   246         *) extra_config+=("--disable-shared");;
   247     esac
   248 
   249     float_extra="$( echo "${extra_flags}"       \
   250                     |${sed} -r -e '/^(.*[[:space:]])?-m(hard|soft)-float([[:space:]].*)?$/!d;'  \
   251                                -e 's//\2/;'     \
   252                   )"
   253     case "${float_extra}" in
   254         hard)   extra_config+=("--with-fp");;
   255         soft)   extra_config+=("--without-fp");;
   256         "")
   257             case "${CT_ARCH_FLOAT}" in
   258                 hard|softfp)    extra_config+=("--with-fp");;
   259                 soft)           extra_config+=("--without-fp");;
   260             esac
   261             ;;
   262     esac
   263 
   264     if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
   265         extra_config+=("--disable-versioning")
   266     fi
   267 
   268     if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
   269         extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
   270     fi
   271 
   272     case "$(do_libc_add_ons_list ,)" in
   273         "") extra_config+=("--enable-add-ons=no");;
   274         *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
   275     esac
   276 
   277     if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   278         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   279         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   280     fi
   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... eglibc is such a sucker...
   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 leaves the manuals
   457             # in the source directory
   458             CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc
   459             CT_DoExecLog ALL cp -av ${src_dir}/manual/*.pdf ${src_dir}/manual/libc \
   460                 ${CT_PREFIX_DIR}/share/doc
   461         fi
   462 
   463         if [ "${CT_LIBC_LOCALES}" = "y" ]; then
   464             do_libc_locales
   465         fi
   466     fi # libc_full == y
   467 }
   468 
   469 # This function finishes the C library install
   470 # This is a no-op
   471 do_libc_finish() {
   472     :
   473 }
   474 
   475 # Build up the addons list, separated with $1
   476 do_libc_add_ons_list() {
   477     local sep="$1"
   478     local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
   479                           |sed -r -e "s/[[:space:],]/${sep}/g;" \
   480                         )"
   481     case "${CT_THREADS}" in
   482         none)   ;;
   483         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   484     esac
   485     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   486     # Remove duplicate, leading and trailing separators
   487     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   488 }
   489 
   490 # Compute up the minimum supported Linux kernel version
   491 do_libc_min_kernel_config() {
   492     local min_kernel_config
   493 
   494     case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   495         *--enable-kernel*) ;;
   496         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   497                 # We can't rely on the kernel version from the configuration,
   498                 # because it might not be available if the user uses pre-installed
   499                 # headers. On the other hand, both method will have the kernel
   500                 # version installed in "usr/include/linux/version.h" in the sysroot.
   501                 # Parse that instead of having two code-paths.
   502                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   503                 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
   504                     CT_Abort "Linux version is unavailable in installed headers files"
   505                 fi
   506                 version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
   507                                  |cut -d ' ' -f 3                                   \
   508                                )"
   509                 version=$(((version_code>>16)&0xFF))
   510                 patchlevel=$(((version_code>>8)&0xFF))
   511                 sublevel=$((version_code&0xFF))
   512                 min_kernel_config="${version}.${patchlevel}.${sublevel}"
   513             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   514                 # Trim the fourth part of the linux version, keeping only the first three numbers
   515                 min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
   516                                       |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
   517                                     )"
   518             fi
   519             echo "--enable-kernel=${min_kernel_config}"
   520             ;;
   521     esac
   522 }