scripts/build/libc/glibc-eglibc.sh-common
author Michael Hope <michael.hope@linaro.org>
Wed Oct 19 15:27:32 2011 +1300 (2011-10-19)
changeset 2739 f320e22f2cba
parent 2737 b5179235b925
child 2765 6c5658b8b588
permissions -rw-r--r--
arch: add softfp support

Some architectures support a mixed hard/soft floating point, where
the compiler emits hardware floating point instructions, but passes
the operands in core (aka integer) registers.

For example, ARM supports this mode (to come in the next changeset).

Add support for softfp cross compilers to the GCC and GLIBC
configuration. Needed for Ubuntu and other distros that are softfp.

Signed-off-by: Michael Hope <michael.hope@linaro.org>
[yann.morin.1998@anciens.enib.fr: split the original patch]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@2270
     1
# This file contains the functions common to glibc and eglibc
yann@850
     2
yann@2483
     3
# Extract the C library tarball(s)
yann@2483
     4
do_libc_extract() {
yann@2483
     5
    local addon
yann@2483
     6
yann@2483
     7
    # Extract the main tarball
yann@2483
     8
    CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}"
yann@2483
     9
    CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
yann@2483
    10
    CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}"
yann@2483
    11
yann@2483
    12
    # Extract the add-opns
yann@2483
    13
    for addon in $(do_libc_add_ons_list " "); do
yann@2496
    14
        # If the addon was bundled with the main archive, we do not
yann@2496
    15
        # need to extract it. Worse, if we were to try to extract
yann@2496
    16
        # it, we'd get an error.
yann@2496
    17
        if [ -d "${addon}" ]; then
yann@2496
    18
            CT_DoLog DEBUG "Add-on already present, spkipping extraction"
yann@2496
    19
            continue
yann@2496
    20
        fi
yann@2483
    21
yann@2483
    22
        CT_Extract nochdir "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
yann@2483
    23
yann@2483
    24
        CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \
yann@2483
    25
            -d "${addon}" -a -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
yann@2483
    26
yann@2483
    27
        # Some addons have the 'long' name, while others have the
yann@2483
    28
        # 'short' name, but patches are non-uniformly built with
yann@2483
    29
        # either the 'long' or 'short' name, whatever the addons name
yann@2483
    30
        # but we prefer the 'short' name and avoid duplicates.
yann@2483
    31
        if [ -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ]; then
esben@2699
    32
            CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}"
yann@2483
    33
        fi
yann@2483
    34
esben@2699
    35
        CT_DoExecLog FILE ln -s "${addon}" "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
yann@2483
    36
yann@2483
    37
        CT_Patch nochdir "${CT_LIBC}" "${addon}-${CT_LIBC_VERSION}"
yann@2483
    38
yann@2483
    39
        # Remove the long name since it can confuse configure scripts to run
yann@2483
    40
        # the same source twice.
yann@2483
    41
        rm "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
yann@2483
    42
    done
yann@2483
    43
yann@2483
    44
    # The configure files may be older than the configure.in files
yann@2483
    45
    # if using a snapshot (or even some tarballs). Fake them being
yann@2483
    46
    # up to date.
yann@2483
    47
    find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
yann@2483
    48
yann@2483
    49
    CT_Popd
benoit@2585
    50
benoit@2585
    51
    if [ "${CT_LIBC_LOCALES}" = "y" ]; then
benoit@2585
    52
        do_libc_locales_extract
benoit@2585
    53
    fi
yann@2483
    54
}
yann@2483
    55
yann@2270
    56
# Build and install headers and start files
yann@850
    57
do_libc_start_files() {
bryanhundven@2515
    58
    # Start files and Headers should be configured the same way as the
bryanhundven@2515
    59
    # final libc, but built and installed differently.
bryanhundven@2515
    60
    do_libc_backend libc_mode=startfiles
yann@850
    61
}
yann@850
    62
yann@2270
    63
# This function builds and install the full C library
yann@850
    64
do_libc() {
bryanhundven@2515
    65
    do_libc_backend libc_mode=final
bryanhundven@2515
    66
}
bryanhundven@2515
    67
bryanhundven@2515
    68
do_libc_backend() {
yann@2271
    69
    local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
bryanhundven@2515
    70
    local libc_mode=final
yann@2276
    71
    local extra_cc_args
yann@1478
    72
    local -a extra_config
yann@2271
    73
    local -a extra_make_args
yann@2312
    74
    local glibc_cflags
yann@1478
    75
bryanhundven@2515
    76
    while [ $# -ne 0 ]; do
yann@2542
    77
        eval "${1// /\\ }"
bryanhundven@2515
    78
        shift
bryanhundven@2515
    79
    done
yann@850
    80
bryanhundven@2515
    81
    if [ "${libc_mode}" = "startfiles" ]; then
bryanhundven@2515
    82
        CT_DoStep INFO "Installing C library headers & start files"
bryanhundven@2515
    83
        mkdir -p "${CT_BUILD_DIR}/build-libc-start-files"
bryanhundven@2515
    84
        cd "${CT_BUILD_DIR}/build-libc-start-files"
bryanhundven@2515
    85
    else # libc_mode = final
bryanhundven@2515
    86
        CT_DoStep INFO "Installing C library"
bryanhundven@2515
    87
        mkdir -p "${CT_BUILD_DIR}/build-libc"
bryanhundven@2515
    88
        cd "${CT_BUILD_DIR}/build-libc"
bryanhundven@2515
    89
    fi
yann@850
    90
yann@850
    91
    CT_DoLog EXTRA "Configuring C library"
yann@850
    92
yann@2271
    93
    case "${CT_LIBC}" in
yann@2271
    94
        eglibc)
yann@2271
    95
            if [ "${CT_EGLIBC_CUSTOM_CONFIG}" = "y" ]; then
yann@2271
    96
                CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/eglibc.config" option-groups.config
yann@2271
    97
            fi
yann@2271
    98
            if [ "${CT_EGLIBC_OPT_SIZE}" = "y" ]; then
yann@2271
    99
                OPTIMIZE=-Os
yann@2271
   100
            else
yann@2271
   101
                OPTIMIZE=-O2
yann@2271
   102
            fi
yann@2271
   103
            ;;
yann@2276
   104
        glibc)
yann@2276
   105
            # glibc can't be built without -O2 (reference needed!)
yann@2276
   106
            OPTIMIZE=-O2
yann@2276
   107
            # Also, if those two are missing, iconv build breaks
yann@2276
   108
            extra_config+=( --disable-debug --disable-sanity-checks )
yann@2276
   109
            ;;
yann@2271
   110
    esac
richard@1796
   111
yann@850
   112
    # Add some default glibc config options if not given by user.
yann@850
   113
    # We don't need to be conditional on wether the user did set different
yann@2467
   114
    # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
yann@2467
   115
    # extra_config
yann@850
   116
yann@2273
   117
    extra_config+=("$(do_libc_min_kernel_config)")
yann@850
   118
yann@850
   119
    case "${CT_THREADS}" in
yann@1478
   120
        nptl)           extra_config+=("--with-__thread" "--with-tls");;
yann@1478
   121
        linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
yann@1478
   122
        none)           extra_config+=("--without-__thread" "--without-nptl")
yann@2467
   123
                        case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
yann@850
   124
                            *-tls*) ;;
yann@1478
   125
                            *) extra_config+=("--without-tls");;
yann@850
   126
                        esac
yann@850
   127
                        ;;
yann@850
   128
    esac
yann@850
   129
yann@850
   130
    case "${CT_SHARED_LIBS}" in
yann@1478
   131
        y) extra_config+=("--enable-shared");;
yann@1478
   132
        *) extra_config+=("--disable-shared");;
yann@850
   133
    esac
yann@850
   134
michael@2737
   135
    case "${CT_ARCH_FLOAT}" in
michael@2737
   136
        hard)   extra_config+=("--with-fp");;
michael@2737
   137
        soft)   extra_config+=("--without-fp");;
michael@2739
   138
        softfp) extra_config+=("--with-fp");;
yann@850
   139
    esac
yann@850
   140
bryanhundven@2180
   141
    if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
bryanhundven@2180
   142
        extra_config+=("--disable-versioning")
bryanhundven@2180
   143
    fi
bryanhundven@2180
   144
bryanhundven@2181
   145
    if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
bryanhundven@2181
   146
        extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
bryanhundven@2181
   147
    fi
bryanhundven@2181
   148
yann@850
   149
    case "$(do_libc_add_ons_list ,)" in
benoit@2573
   150
        "") extra_config+=("--enable-add-ons=no");;
yann@1478
   151
        *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
yann@850
   152
    esac
yann@850
   153
benoit@2489
   154
    if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
benoit@2503
   155
        extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
benoit@2503
   156
        [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
benoit@2489
   157
    fi
benoit@2489
   158
yann@850
   159
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   160
yann@2289
   161
    touch config.cache
yann@2289
   162
    if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
yann@2289
   163
        echo "libc_cv_forced_unwind=yes" >>config.cache
yann@2289
   164
        echo "libc_cv_c_cleanup=yes" >>config.cache
yann@2289
   165
    fi
yann@2289
   166
yann@2276
   167
    # Pre-seed the configparms file with values from the config option
yann@2276
   168
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@2276
   169
benoit@2489
   170
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   171
yann@850
   172
    CT_DoLog DEBUG "Using gcc for target:     '${cross_cc}'"
yann@850
   173
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@1478
   174
    CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
yann@850
   175
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   176
yann@2312
   177
    glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE}"
yann@2312
   178
    case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
yann@2312
   179
        y)  ;;
yann@2312
   180
        *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
yann@2312
   181
    esac
yann@2312
   182
bryanhundven@2229
   183
    # ./configure is mislead by our tools override wrapper for bash
bryanhundven@2229
   184
    # so just tell it where the real bash is _on_the_target_!
bryanhundven@2229
   185
    # Notes:
bryanhundven@2229
   186
    # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
bryanhundven@2229
   187
    # - ${BASH_SHELL}            is only used to set BASH
bryanhundven@2229
   188
    # - ${BASH}                  is only used to set the shebang
bryanhundven@2229
   189
    #                            in two scripts to run on the target
bryanhundven@2229
   190
    # So we can safely bypass bash detection at compile time.
bryanhundven@2229
   191
    # Should this change in a future eglibc release, we'd better
bryanhundven@2229
   192
    # directly mangle the generated scripts _after_ they get built,
bryanhundven@2229
   193
    # or even after they get installed... eglibc is such a sucker...
yann@2289
   194
    echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
bryanhundven@2229
   195
yann@2276
   196
    # Configure with --prefix the way we want it on the target...
yann@2276
   197
    # There are a whole lot of settings here.  You'll probably want
yann@2467
   198
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
yann@2276
   199
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@2276
   200
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
yann@2276
   201
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
yann@2276
   202
    # Set BUILD_CC, or we won't be able to build datafiles
yann@2706
   203
    # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
yann@2706
   204
    # when the shell is not bash... Sigh... :-(
yann@2276
   205
yann@2353
   206
    CT_DoExecLog CFG                                                \
yann@1041
   207
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@2312
   208
    CFLAGS="${glibc_cflags}"                                        \
yann@850
   209
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@850
   210
    AR=${CT_TARGET}-ar                                              \
yann@850
   211
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@2706
   212
    "${CONFIG_SHELL}"                                               \
yann@2271
   213
    "${src_dir}/configure"                                          \
yann@850
   214
        --prefix=/usr                                               \
yann@1041
   215
        --build=${CT_BUILD}                                         \
yann@850
   216
        --host=${CT_TARGET}                                         \
yann@2289
   217
        --cache-file="$(pwd)/config.cache"                          \
yann@2276
   218
        --without-cvs                                               \
yann@850
   219
        --disable-profile                                           \
yann@850
   220
        --without-gd                                                \
yann@2276
   221
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@1478
   222
        "${extra_config[@]}"                                        \
yann@2467
   223
        "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
benoit@2489
   224
yann@2276
   225
    # build hacks
yann@2276
   226
    case "${CT_ARCH},${CT_ARCH_CPU}" in
yann@2276
   227
        powerpc,8??)
yann@2276
   228
            # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
yann@2276
   229
            CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
yann@2276
   230
            extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
yann@2271
   231
            ;;
yann@1328
   232
    esac
yann@1328
   233
bryanhundven@2515
   234
    if [ "${libc_mode}" = "startfiles" ]; then
bryanhundven@2515
   235
        CT_DoLog EXTRA "Installing C library headers"
yann@850
   236
bryanhundven@2515
   237
        # use the 'install-headers' makefile target to install the
bryanhundven@2515
   238
        # headers
bryanhundven@2515
   239
        CT_DoExecLog ALL make ${JOBSFLAGS}              \
bryanhundven@2515
   240
                         install_root=${CT_SYSROOT_DIR} \
bryanhundven@2515
   241
                         install-bootstrap-headers=yes  \
bryanhundven@2515
   242
                         "${extra_make_args[@]}"        \
bryanhundven@2515
   243
                         install-headers
bryanhundven@2515
   244
bryanhundven@2515
   245
        # For glibc, a few headers need to be manually installed
bryanhundven@2515
   246
        if [ "${CT_LIBC}" = "glibc" ]; then
bryanhundven@2515
   247
            # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
bryanhundven@2515
   248
            # so do them by hand.  We can tolerate an empty stubs.h for the moment.
bryanhundven@2515
   249
            # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
bryanhundven@2515
   250
            mkdir -p "${CT_HEADERS_DIR}/gnu"
bryanhundven@2515
   251
            CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
bryanhundven@2515
   252
            CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
bryanhundven@2515
   253
                                   "${CT_HEADERS_DIR}/features.h"
bryanhundven@2515
   254
bryanhundven@2515
   255
            # Building the bootstrap gcc requires either setting inhibit_libc, or
bryanhundven@2515
   256
            # having a copy of stdio_lim.h... see
bryanhundven@2515
   257
            # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
bryanhundven@2515
   258
            CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
bryanhundven@2515
   259
bryanhundven@2515
   260
            # Following error building gcc-4.0.0's gcj:
bryanhundven@2515
   261
            #  error: bits/syscall.h: No such file or directory
bryanhundven@2515
   262
            # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
bryanhundven@2515
   263
            # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
bryanhundven@2515
   264
            case "${CT_ARCH}" in
bryanhundven@2515
   265
                arm)    ;;
bryanhundven@2515
   266
                *)  CT_DoExecLog ALL cp -v "misc/syscall-list.h"            \
bryanhundven@2515
   267
                                           "${CT_HEADERS_DIR}/bits/syscall.h"
bryanhundven@2515
   268
                    ;;
bryanhundven@2515
   269
            esac
bryanhundven@2515
   270
        fi
bryanhundven@2515
   271
bryanhundven@2515
   272
        if [ "${CT_THREADS}" = "nptl" ]; then
bryanhundven@2515
   273
            CT_DoLog EXTRA "Installing C library start files"
bryanhundven@2515
   274
bryanhundven@2515
   275
            # there are a few object files needed to link shared libraries,
bryanhundven@2515
   276
            # which we build and install by hand
bryanhundven@2515
   277
            CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
bryanhundven@2515
   278
            CT_DoExecLog ALL make ${JOBSFLAGS}  \
bryanhundven@2515
   279
                        "${extra_make_args[@]}" \
bryanhundven@2515
   280
                        csu/subdir_lib
bryanhundven@2515
   281
            CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
bryanhundven@2515
   282
                                "${CT_SYSROOT_DIR}/usr/lib"
bryanhundven@2515
   283
bryanhundven@2515
   284
            # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
bryanhundven@2515
   285
            # However, since we will never actually execute its code,
bryanhundven@2515
   286
            # it doesn't matter what it contains.  So, treating '/dev/null'
bryanhundven@2515
   287
            # as a C source file, we produce a dummy 'libc.so' in one step
bryanhundven@2515
   288
            CT_DoExecLog ALL "${cross_cc}" -nostdlib        \
bryanhundven@2515
   289
                                           -nostartfiles    \
bryanhundven@2515
   290
                                           -shared          \
bryanhundven@2515
   291
                                           -x c /dev/null   \
bryanhundven@2515
   292
                                           -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
bryanhundven@2515
   293
        fi # threads == nptl
bryanhundven@2515
   294
    else # libc_mode = final
bryanhundven@2515
   295
        CT_DoLog EXTRA "Building C library"
bryanhundven@2515
   296
        CT_DoExecLog ALL make ${JOBSFLAGS}                      \
bryanhundven@2515
   297
                              "${extra_make_args[@]}"           \
bryanhundven@2515
   298
                              all
bryanhundven@2515
   299
bryanhundven@2515
   300
        CT_DoLog EXTRA "Installing C library"
bryanhundven@2515
   301
        CT_DoExecLog ALL make ${JOBSFLAGS}                      \
bryanhundven@2515
   302
                              "${extra_make_args[@]}"           \
bryanhundven@2515
   303
                              install_root="${CT_SYSROOT_DIR}"  \
bryanhundven@2515
   304
                              install
benoit@2585
   305
benoit@2585
   306
        if [ "${CT_LIBC_LOCALES}" = "y" ]; then
benoit@2585
   307
            do_libc_locales
benoit@2585
   308
        fi
bryanhundven@2515
   309
    fi
yann@850
   310
yann@850
   311
    CT_EndStep
yann@850
   312
}
yann@850
   313
yann@2270
   314
# This function finishes the C library install
yann@2270
   315
# This is a no-op
yann@850
   316
do_libc_finish() {
yann@850
   317
    :
yann@850
   318
}
yann@850
   319
yann@850
   320
# Build up the addons list, separated with $1
yann@850
   321
do_libc_add_ons_list() {
yann@850
   322
    local sep="$1"
yann@2274
   323
    local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
yann@2274
   324
                          |sed -r -e "s/[[:space:],]/${sep}/g;" \
yann@2274
   325
                        )"
yann@850
   326
    case "${CT_THREADS}" in
yann@850
   327
        none)   ;;
yann@850
   328
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@850
   329
    esac
yann@850
   330
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@2274
   331
    # Remove duplicate, leading and trailing separators
yann@2274
   332
    echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
yann@850
   333
}
yann@2273
   334
yann@2273
   335
# Compute up the minimum supported Linux kernel version
yann@2273
   336
do_libc_min_kernel_config() {
yann@2273
   337
    local min_kernel_config
yann@2273
   338
yann@2467
   339
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
yann@2273
   340
        *--enable-kernel*) ;;
yann@2273
   341
        *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
yann@2273
   342
                # We can't rely on the kernel version from the configuration,
yann@2273
   343
                # because it might not be available if the user uses pre-installed
yann@2273
   344
                # headers. On the other hand, both method will have the kernel
yann@2279
   345
                # version installed in "usr/include/linux/version.h" in the sysroot.
yann@2273
   346
                # Parse that instead of having two code-paths.
yann@2273
   347
                version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
yann@2273
   348
                if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
yann@2273
   349
                    CT_Abort "Linux version is unavailable in installed headers files"
yann@2273
   350
                fi
yann@2273
   351
                version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
yann@2273
   352
                                 |cut -d ' ' -f 3                                   \
yann@2273
   353
                               )"
yann@2273
   354
                version=$(((version_code>>16)&0xFF))
yann@2273
   355
                patchlevel=$(((version_code>>8)&0xFF))
yann@2273
   356
                sublevel=$((version_code&0xFF))
yann@2273
   357
                min_kernel_config="${version}.${patchlevel}.${sublevel}"
yann@2273
   358
            elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
yann@2273
   359
                # Trim the fourth part of the linux version, keeping only the first three numbers
yann@2276
   360
                min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
yann@2276
   361
                                      |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
yann@2273
   362
                                    )"
yann@2273
   363
            fi
yann@2273
   364
            echo "--enable-kernel=${min_kernel_config}"
yann@2273
   365
            ;;
yann@2273
   366
    esac
yann@2273
   367
}