scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Mon Feb 13 21:47:25 2012 +0100 (2012-02-13)
changeset 2883 cea814c9932a
parent 2828 e47d17391ae3
child 2899 0b594b10c63b
permissions -rw-r--r--
libc/glibc: do not consume parameters when parsing them

Currently, there are two constructs used to parse arguments in
glibc backends, one that consumes args as they are parsed, and
one that does not.

Always use the construct that does not eat args as they are parsed.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.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         mkdir -p "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
   142         CT_Pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
   143 
   144         do_libc_backend_once extra_dir="${extra_dir}"               \
   145                              extra_flags="${extra_flags}"           \
   146                              libc_headers="${libc_headers}"         \
   147                              libc_startfiles="${libc_startfiles}"   \
   148                              libc_full="${libc_full}"
   149 
   150         CT_Popd
   151 
   152         if [ "${multi_dir}" != "." ]; then
   153             if [ "${libc_mode}" = "final" ]; then
   154                 CT_DoLog EXTRA "Fixing up multilib location"
   155 
   156                 # rewrite the library multiplexers
   157                 for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do
   158                     for l in libc libpthread libgcc_s; do
   159                         if [    -f "${CT_SYSROOT_DIR}/${d}/${l}.so"    \
   160                              -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so    ]
   161                         then
   162                             CT_DoExecLog DEBUG ${sed} -r -i                                 \
   163                                                       -e "s:/lib/:/lib/${multi_dir}/:g;"    \
   164                                                       "${CT_SYSROOT_DIR}/${d}/${l}.so"
   165                         fi
   166                     done
   167                 done
   168                 # Remove the multi_dir now it is no longer useful
   169                 CT_DoExecLog DEBUG rm -rf "${CT_SYSROOT_DIR}/${multi_dir}"
   170             fi # libc_mode == final
   171 
   172             CT_EndStep
   173         fi
   174     done
   175 
   176     CT_EndStep
   177 }
   178 
   179 # This backend builds the C library once
   180 # Usage: do_libc_backend_once param=value [...]
   181 #   Parameter           : Definition                            : Type      : Default
   182 #   libc_headers        : Build libc headers                    : bool      : n
   183 #   libc_startfiles     : Build libc start-files                : bool      : n
   184 #   libc_full           : Build full libc                       : bool      : n
   185 #   extra_flags         : Extra CFLAGS to use (for multilib)    : string    : (empty)
   186 #   extra_dir           : Extra subdir for multilib             : string    : (empty)
   187 do_libc_backend_once() {
   188     local libc_headers
   189     local libc_startfiles
   190     local libc_full
   191     local extra_flags
   192     local extra_dir
   193     local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
   194     local extra_cc_args
   195     local -a extra_config
   196     local -a extra_make_args
   197     local glibc_cflags
   198     local float_extra
   199     local endian_extra
   200     local arg
   201 
   202     for arg in "$@"; do
   203         eval "${arg// /\\ }"
   204     done
   205 
   206     CT_DoLog EXTRA "Configuring C library"
   207 
   208     case "${CT_LIBC}" in
   209         eglibc)
   210             if [ "${CT_EGLIBC_CUSTOM_CONFIG}" = "y" ]; then
   211                 CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/eglibc.config" option-groups.config
   212             fi
   213             if [ "${CT_EGLIBC_OPT_SIZE}" = "y" ]; then
   214                 OPTIMIZE=-Os
   215             else
   216                 OPTIMIZE=-O2
   217             fi
   218             ;;
   219         glibc)
   220             # glibc can't be built without -O2 (reference needed!)
   221             OPTIMIZE=-O2
   222             # Also, if those two are missing, iconv build breaks
   223             extra_config+=( --disable-debug --disable-sanity-checks )
   224             ;;
   225     esac
   226 
   227     # Add some default glibc config options if not given by user.
   228     # We don't need to be conditional on wether the user did set different
   229     # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
   230     # extra_config
   231 
   232     extra_config+=("$(do_libc_min_kernel_config)")
   233 
   234     case "${CT_THREADS}" in
   235         nptl)           extra_config+=("--with-__thread" "--with-tls");;
   236         linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
   237         none)           extra_config+=("--without-__thread" "--without-nptl")
   238                         case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   239                             *-tls*) ;;
   240                             *) extra_config+=("--without-tls");;
   241                         esac
   242                         ;;
   243     esac
   244 
   245     case "${CT_SHARED_LIBS}" in
   246         y) extra_config+=("--enable-shared");;
   247         *) extra_config+=("--disable-shared");;
   248     esac
   249 
   250     float_extra="$( echo "${extra_flags}"       \
   251                     |${sed} -r -e '/^(.*[[:space:]])?-m(hard|soft)-float([[:space:]].*)?$/!d;'  \
   252                                -e 's//\2/;'     \
   253                   )"
   254     case "${float_extra}" in
   255         hard)   extra_config+=("--with-fp");;
   256         soft)   extra_config+=("--without-fp");;
   257         "")
   258             case "${CT_ARCH_FLOAT}" in
   259                 hard|softfp)    extra_config+=("--with-fp");;
   260                 soft)           extra_config+=("--without-fp");;
   261             esac
   262             ;;
   263     esac
   264 
   265     if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
   266         extra_config+=("--disable-versioning")
   267     fi
   268 
   269     if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
   270         extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
   271     fi
   272 
   273     case "$(do_libc_add_ons_list ,)" in
   274         "") extra_config+=("--enable-add-ons=no");;
   275         *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
   276     esac
   277 
   278     if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   279         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   280         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   281     fi
   282 
   283     # Extract the endianness options if any
   284     # This should cover all possible endianness options
   285     # in gcc, but it is prone to bit-rot... :-(
   286     endian_extra="$( echo "${extra_flags}"      \
   287                      |${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \
   288                                 -e 's//\2/;'    \
   289                    )"
   290     case "${endian_extra}" in
   291         EB|mbig-endian|mbig|meb|mb)
   292             extra_cc_args="${extra_cc_args} ${endian_extra}"
   293             ;;
   294         EL|mlittle-endian|mlittle|mel|ml)
   295             extra_cc_args="${extra_cc_args} ${endian_extra}"
   296             ;;
   297         "") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
   298             ;;
   299     esac
   300 
   301     touch config.cache
   302     if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
   303         echo "libc_cv_forced_unwind=yes" >>config.cache
   304         echo "libc_cv_c_cleanup=yes" >>config.cache
   305     fi
   306 
   307     # Pre-seed the configparms file with values from the config option
   308     printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
   309 
   310     cross_cc=$(CT_Which "${CT_TARGET}-gcc")
   311     extra_cc_args+=" ${extra_flags}"
   312 
   313     case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
   314         y)  ;;
   315         *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
   316     esac
   317     glibc_cflags+=" ${CT_TARGET_CFLAGS} ${OPTIMIZE} ${CT_LIBC_GLIBC_EXTRA_CFLAGS}"
   318 
   319     # ./configure is mislead by our tools override wrapper for bash
   320     # so just tell it where the real bash is _on_the_target_!
   321     # Notes:
   322     # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
   323     # - ${BASH_SHELL}            is only used to set BASH
   324     # - ${BASH}                  is only used to set the shebang
   325     #                            in two scripts to run on the target
   326     # So we can safely bypass bash detection at compile time.
   327     # Should this change in a future eglibc release, we'd better
   328     # directly mangle the generated scripts _after_ they get built,
   329     # or even after they get installed... eglibc is such a sucker...
   330     echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
   331 
   332     # Configure with --prefix the way we want it on the target...
   333     # There are a whole lot of settings here.  You'll probably want
   334     # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
   335     # Compare these options with the ones used when installing the glibc headers above - they're different.
   336     # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
   337     # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
   338     # Set BUILD_CC, or we won't be able to build datafiles
   339     # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
   340     # when the shell is not bash... Sigh... :-(
   341 
   342     CT_DoLog DEBUG "Using gcc for target    : '${cross_cc}'"
   343     CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
   344     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
   345     CT_DoLog DEBUG "Extra CC args passed    : '${glibc_cflags}'"
   346     CT_DoLog DEBUG "Extra flags (multilib)  : '${extra_flags}'"
   347 
   348     CT_DoExecLog CFG                                                \
   349     BUILD_CC="${CT_BUILD}-gcc"                                      \
   350     CFLAGS="${glibc_cflags}"                                        \
   351     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
   352     AR=${CT_TARGET}-ar                                              \
   353     RANLIB=${CT_TARGET}-ranlib                                      \
   354     "${CONFIG_SHELL}"                                               \
   355     "${src_dir}/configure"                                          \
   356         --prefix=/usr                                               \
   357         --build=${CT_BUILD}                                         \
   358         --host=${CT_TARGET}                                         \
   359         --cache-file="$(pwd)/config.cache"                          \
   360         --without-cvs                                               \
   361         --disable-profile                                           \
   362         --without-gd                                                \
   363         --with-headers="${CT_HEADERS_DIR}"                          \
   364         "${extra_config[@]}"                                        \
   365         "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
   366 
   367     # build hacks
   368     case "${CT_ARCH},${CT_ARCH_CPU}" in
   369         powerpc,8??)
   370             # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
   371             CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
   372             extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
   373             ;;
   374     esac
   375 
   376     if [ "${libc_headers}" = "y" ]; then
   377         CT_DoLog EXTRA "Installing C library headers"
   378 
   379         # use the 'install-headers' makefile target to install the
   380         # headers
   381         CT_DoExecLog ALL make ${JOBSFLAGS}                          \
   382                          install_root=${CT_SYSROOT_DIR}${extra_dir} \
   383                          install-bootstrap-headers=yes              \
   384                          "${extra_make_args[@]}"                    \
   385                          install-headers
   386 
   387         # For glibc, a few headers need to be manually installed
   388         if [ "${CT_LIBC}" = "glibc" ]; then
   389             # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
   390             # so do them by hand.  We can tolerate an empty stubs.h for the moment.
   391             # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
   392             mkdir -p "${CT_HEADERS_DIR}/gnu"
   393             CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
   394             CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
   395                                    "${CT_HEADERS_DIR}/features.h"
   396 
   397             # Building the bootstrap gcc requires either setting inhibit_libc, or
   398             # having a copy of stdio_lim.h... see
   399             # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
   400             CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
   401 
   402             # Following error building gcc-4.0.0's gcj:
   403             #  error: bits/syscall.h: No such file or directory
   404             # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
   405             # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
   406             case "${CT_ARCH}" in
   407                 arm)    ;;
   408                 *)  CT_DoExecLog ALL cp -v "misc/syscall-list.h"            \
   409                                            "${CT_HEADERS_DIR}/bits/syscall.h"
   410                     ;;
   411             esac
   412         fi
   413     fi # libc_headers == y
   414 
   415     if [ "${libc_startfiles}" = "y" ]; then
   416         if [ "${CT_THREADS}" = "nptl" ]; then
   417             CT_DoLog EXTRA "Installing C library start files"
   418 
   419             # there are a few object files needed to link shared libraries,
   420             # which we build and install by hand
   421             CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
   422             CT_DoExecLog ALL make ${JOBSFLAGS}  \
   423                         "${extra_make_args[@]}" \
   424                         csu/subdir_lib
   425             CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o    \
   426                                 "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
   427 
   428             # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
   429             # However, since we will never actually execute its code,
   430             # it doesn't matter what it contains.  So, treating '/dev/null'
   431             # as a C source file, we produce a dummy 'libc.so' in one step
   432             CT_DoExecLog ALL "${cross_cc}" -nostdlib        \
   433                                            -nostartfiles    \
   434                                            -shared          \
   435                                            -x c /dev/null   \
   436                                            -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so"
   437         fi # threads == nptl
   438     fi # libc_headers == y
   439 
   440     if [ "${libc_full}" = "y" ]; then
   441         CT_DoLog EXTRA "Building C library"
   442         CT_DoExecLog ALL make ${JOBSFLAGS}              \
   443                               "${extra_make_args[@]}"   \
   444                               all
   445 
   446         CT_DoLog EXTRA "Installing C library"
   447         CT_DoExecLog ALL make ${JOBSFLAGS}                                  \
   448                               "${extra_make_args[@]}"                       \
   449                               install_root="${CT_SYSROOT_DIR}${extra_dir}"  \
   450                               install
   451 
   452         if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   453             CT_DoLog EXTRA "Building and installing the C library manual"
   454             # Omit JOBSFLAGS as GLIBC has problems building the
   455             # manuals in parallel
   456             CT_DoExecLog ALL make pdf html
   457             # EGLIBC doesn't have a install-{pdf.html} and leaves the manuals
   458             # in the source directory
   459             CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc
   460             CT_DoExecLog ALL cp -av ${src_dir}/manual/*.pdf ${src_dir}/manual/libc \
   461                 ${CT_PREFIX_DIR}/share/doc
   462         fi
   463 
   464         if [ "${CT_LIBC_LOCALES}" = "y" ]; then
   465             do_libc_locales
   466         fi
   467     fi # libc_full == y
   468 }
   469 
   470 # This function finishes the C library install
   471 # This is a no-op
   472 do_libc_finish() {
   473     :
   474 }
   475 
   476 # Build up the addons list, separated with $1
   477 do_libc_add_ons_list() {
   478     local sep="$1"
   479     local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
   480                           |sed -r -e "s/[[:space:],]/${sep}/g;" \
   481                         )"
   482     case "${CT_THREADS}" in
   483         none)   ;;
   484         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   485     esac
   486     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   487     # Remove duplicate, leading and trailing separators
   488     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   489 }
   490 
   491 # Compute up the minimum supported Linux kernel version
   492 do_libc_min_kernel_config() {
   493     local min_kernel_config
   494 
   495     case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   496         *--enable-kernel*) ;;
   497         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   498                 # We can't rely on the kernel version from the configuration,
   499                 # because it might not be available if the user uses pre-installed
   500                 # headers. On the other hand, both method will have the kernel
   501                 # version installed in "usr/include/linux/version.h" in the sysroot.
   502                 # Parse that instead of having two code-paths.
   503                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   504                 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
   505                     CT_Abort "Linux version is unavailable in installed headers files"
   506                 fi
   507                 version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
   508                                  |cut -d ' ' -f 3                                   \
   509                                )"
   510                 version=$(((version_code>>16)&0xFF))
   511                 patchlevel=$(((version_code>>8)&0xFF))
   512                 sublevel=$((version_code&0xFF))
   513                 min_kernel_config="${version}.${patchlevel}.${sublevel}"
   514             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   515                 # Trim the fourth part of the linux version, keeping only the first three numbers
   516                 min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
   517                                       |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
   518                                     )"
   519             fi
   520             echo "--enable-kernel=${min_kernel_config}"
   521             ;;
   522     esac
   523 }