scripts/build/libc/glibc-eglibc.sh-common
author Esben Haabendal <esben.haabendal@prevas.dk>
Fri Oct 07 15:06:44 2011 +0200 (2011-10-07)
changeset 2721 7b64746b0ab3
parent 2699 28a97cb454e2
child 2737 b5179235b925
permissions -rw-r--r--
scripts/functions: Fix CT_ExtractGit function.

Change CT_ExtractGit so that it clones the repository, instead of just
symlinking it. After cloning, any given ref is checked out, or if no
ref is given, the HEAD of the repository is checked out.

This makes CT_Extract behave similar for git repositories as it does
for tarballs, so that it for example can be used for passing glibc-ports
as a git repository.

Signed-off-by: "Esben Haabendal" <esben.haabendal@prevas.dk>
[yann.morin.1998@anciens.enib.fr: fix incomplete var rename]
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
yann@850
   135
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@1478
   136
        y,) extra_config+=("--with-fp");;
yann@1478
   137
        ,y) extra_config+=("--without-fp");;
yann@850
   138
    esac
yann@850
   139
bryanhundven@2180
   140
    if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
bryanhundven@2180
   141
        extra_config+=("--disable-versioning")
bryanhundven@2180
   142
    fi
bryanhundven@2180
   143
bryanhundven@2181
   144
    if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
bryanhundven@2181
   145
        extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
bryanhundven@2181
   146
    fi
bryanhundven@2181
   147
yann@850
   148
    case "$(do_libc_add_ons_list ,)" in
benoit@2573
   149
        "") extra_config+=("--enable-add-ons=no");;
yann@1478
   150
        *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
yann@850
   151
    esac
yann@850
   152
benoit@2489
   153
    if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
benoit@2503
   154
        extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
benoit@2503
   155
        [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
benoit@2489
   156
    fi
benoit@2489
   157
yann@850
   158
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   159
yann@2289
   160
    touch config.cache
yann@2289
   161
    if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
yann@2289
   162
        echo "libc_cv_forced_unwind=yes" >>config.cache
yann@2289
   163
        echo "libc_cv_c_cleanup=yes" >>config.cache
yann@2289
   164
    fi
yann@2289
   165
yann@2276
   166
    # Pre-seed the configparms file with values from the config option
yann@2276
   167
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@2276
   168
benoit@2489
   169
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   170
yann@850
   171
    CT_DoLog DEBUG "Using gcc for target:     '${cross_cc}'"
yann@850
   172
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@1478
   173
    CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
yann@850
   174
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   175
yann@2312
   176
    glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE}"
yann@2312
   177
    case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
yann@2312
   178
        y)  ;;
yann@2312
   179
        *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
yann@2312
   180
    esac
yann@2312
   181
bryanhundven@2229
   182
    # ./configure is mislead by our tools override wrapper for bash
bryanhundven@2229
   183
    # so just tell it where the real bash is _on_the_target_!
bryanhundven@2229
   184
    # Notes:
bryanhundven@2229
   185
    # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
bryanhundven@2229
   186
    # - ${BASH_SHELL}            is only used to set BASH
bryanhundven@2229
   187
    # - ${BASH}                  is only used to set the shebang
bryanhundven@2229
   188
    #                            in two scripts to run on the target
bryanhundven@2229
   189
    # So we can safely bypass bash detection at compile time.
bryanhundven@2229
   190
    # Should this change in a future eglibc release, we'd better
bryanhundven@2229
   191
    # directly mangle the generated scripts _after_ they get built,
bryanhundven@2229
   192
    # or even after they get installed... eglibc is such a sucker...
yann@2289
   193
    echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
bryanhundven@2229
   194
yann@2276
   195
    # Configure with --prefix the way we want it on the target...
yann@2276
   196
    # There are a whole lot of settings here.  You'll probably want
yann@2467
   197
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
yann@2276
   198
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@2276
   199
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
yann@2276
   200
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
yann@2276
   201
    # Set BUILD_CC, or we won't be able to build datafiles
yann@2706
   202
    # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
yann@2706
   203
    # when the shell is not bash... Sigh... :-(
yann@2276
   204
yann@2353
   205
    CT_DoExecLog CFG                                                \
yann@1041
   206
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@2312
   207
    CFLAGS="${glibc_cflags}"                                        \
yann@850
   208
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@850
   209
    AR=${CT_TARGET}-ar                                              \
yann@850
   210
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@2706
   211
    "${CONFIG_SHELL}"                                               \
yann@2271
   212
    "${src_dir}/configure"                                          \
yann@850
   213
        --prefix=/usr                                               \
yann@1041
   214
        --build=${CT_BUILD}                                         \
yann@850
   215
        --host=${CT_TARGET}                                         \
yann@2289
   216
        --cache-file="$(pwd)/config.cache"                          \
yann@2276
   217
        --without-cvs                                               \
yann@850
   218
        --disable-profile                                           \
yann@850
   219
        --without-gd                                                \
yann@2276
   220
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@1478
   221
        "${extra_config[@]}"                                        \
yann@2467
   222
        "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
benoit@2489
   223
yann@2276
   224
    # build hacks
yann@2276
   225
    case "${CT_ARCH},${CT_ARCH_CPU}" in
yann@2276
   226
        powerpc,8??)
yann@2276
   227
            # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
yann@2276
   228
            CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
yann@2276
   229
            extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
yann@2271
   230
            ;;
yann@1328
   231
    esac
yann@1328
   232
bryanhundven@2515
   233
    if [ "${libc_mode}" = "startfiles" ]; then
bryanhundven@2515
   234
        CT_DoLog EXTRA "Installing C library headers"
yann@850
   235
bryanhundven@2515
   236
        # use the 'install-headers' makefile target to install the
bryanhundven@2515
   237
        # headers
bryanhundven@2515
   238
        CT_DoExecLog ALL make ${JOBSFLAGS}              \
bryanhundven@2515
   239
                         install_root=${CT_SYSROOT_DIR} \
bryanhundven@2515
   240
                         install-bootstrap-headers=yes  \
bryanhundven@2515
   241
                         "${extra_make_args[@]}"        \
bryanhundven@2515
   242
                         install-headers
bryanhundven@2515
   243
bryanhundven@2515
   244
        # For glibc, a few headers need to be manually installed
bryanhundven@2515
   245
        if [ "${CT_LIBC}" = "glibc" ]; then
bryanhundven@2515
   246
            # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
bryanhundven@2515
   247
            # so do them by hand.  We can tolerate an empty stubs.h for the moment.
bryanhundven@2515
   248
            # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
bryanhundven@2515
   249
            mkdir -p "${CT_HEADERS_DIR}/gnu"
bryanhundven@2515
   250
            CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
bryanhundven@2515
   251
            CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
bryanhundven@2515
   252
                                   "${CT_HEADERS_DIR}/features.h"
bryanhundven@2515
   253
bryanhundven@2515
   254
            # Building the bootstrap gcc requires either setting inhibit_libc, or
bryanhundven@2515
   255
            # having a copy of stdio_lim.h... see
bryanhundven@2515
   256
            # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
bryanhundven@2515
   257
            CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
bryanhundven@2515
   258
bryanhundven@2515
   259
            # Following error building gcc-4.0.0's gcj:
bryanhundven@2515
   260
            #  error: bits/syscall.h: No such file or directory
bryanhundven@2515
   261
            # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
bryanhundven@2515
   262
            # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
bryanhundven@2515
   263
            case "${CT_ARCH}" in
bryanhundven@2515
   264
                arm)    ;;
bryanhundven@2515
   265
                *)  CT_DoExecLog ALL cp -v "misc/syscall-list.h"            \
bryanhundven@2515
   266
                                           "${CT_HEADERS_DIR}/bits/syscall.h"
bryanhundven@2515
   267
                    ;;
bryanhundven@2515
   268
            esac
bryanhundven@2515
   269
        fi
bryanhundven@2515
   270
bryanhundven@2515
   271
        if [ "${CT_THREADS}" = "nptl" ]; then
bryanhundven@2515
   272
            CT_DoLog EXTRA "Installing C library start files"
bryanhundven@2515
   273
bryanhundven@2515
   274
            # there are a few object files needed to link shared libraries,
bryanhundven@2515
   275
            # which we build and install by hand
bryanhundven@2515
   276
            CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
bryanhundven@2515
   277
            CT_DoExecLog ALL make ${JOBSFLAGS}  \
bryanhundven@2515
   278
                        "${extra_make_args[@]}" \
bryanhundven@2515
   279
                        csu/subdir_lib
bryanhundven@2515
   280
            CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
bryanhundven@2515
   281
                                "${CT_SYSROOT_DIR}/usr/lib"
bryanhundven@2515
   282
bryanhundven@2515
   283
            # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
bryanhundven@2515
   284
            # However, since we will never actually execute its code,
bryanhundven@2515
   285
            # it doesn't matter what it contains.  So, treating '/dev/null'
bryanhundven@2515
   286
            # as a C source file, we produce a dummy 'libc.so' in one step
bryanhundven@2515
   287
            CT_DoExecLog ALL "${cross_cc}" -nostdlib        \
bryanhundven@2515
   288
                                           -nostartfiles    \
bryanhundven@2515
   289
                                           -shared          \
bryanhundven@2515
   290
                                           -x c /dev/null   \
bryanhundven@2515
   291
                                           -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
bryanhundven@2515
   292
        fi # threads == nptl
bryanhundven@2515
   293
    else # libc_mode = final
bryanhundven@2515
   294
        CT_DoLog EXTRA "Building C library"
bryanhundven@2515
   295
        CT_DoExecLog ALL make ${JOBSFLAGS}                      \
bryanhundven@2515
   296
                              "${extra_make_args[@]}"           \
bryanhundven@2515
   297
                              all
bryanhundven@2515
   298
bryanhundven@2515
   299
        CT_DoLog EXTRA "Installing C library"
bryanhundven@2515
   300
        CT_DoExecLog ALL make ${JOBSFLAGS}                      \
bryanhundven@2515
   301
                              "${extra_make_args[@]}"           \
bryanhundven@2515
   302
                              install_root="${CT_SYSROOT_DIR}"  \
bryanhundven@2515
   303
                              install
benoit@2585
   304
benoit@2585
   305
        if [ "${CT_LIBC_LOCALES}" = "y" ]; then
benoit@2585
   306
            do_libc_locales
benoit@2585
   307
        fi
bryanhundven@2515
   308
    fi
yann@850
   309
yann@850
   310
    CT_EndStep
yann@850
   311
}
yann@850
   312
yann@2270
   313
# This function finishes the C library install
yann@2270
   314
# This is a no-op
yann@850
   315
do_libc_finish() {
yann@850
   316
    :
yann@850
   317
}
yann@850
   318
yann@850
   319
# Build up the addons list, separated with $1
yann@850
   320
do_libc_add_ons_list() {
yann@850
   321
    local sep="$1"
yann@2274
   322
    local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
yann@2274
   323
                          |sed -r -e "s/[[:space:],]/${sep}/g;" \
yann@2274
   324
                        )"
yann@850
   325
    case "${CT_THREADS}" in
yann@850
   326
        none)   ;;
yann@850
   327
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@850
   328
    esac
yann@850
   329
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@2274
   330
    # Remove duplicate, leading and trailing separators
yann@2274
   331
    echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
yann@850
   332
}
yann@2273
   333
yann@2273
   334
# Compute up the minimum supported Linux kernel version
yann@2273
   335
do_libc_min_kernel_config() {
yann@2273
   336
    local min_kernel_config
yann@2273
   337
yann@2467
   338
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
yann@2273
   339
        *--enable-kernel*) ;;
yann@2273
   340
        *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
yann@2273
   341
                # We can't rely on the kernel version from the configuration,
yann@2273
   342
                # because it might not be available if the user uses pre-installed
yann@2273
   343
                # headers. On the other hand, both method will have the kernel
yann@2279
   344
                # version installed in "usr/include/linux/version.h" in the sysroot.
yann@2273
   345
                # Parse that instead of having two code-paths.
yann@2273
   346
                version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
yann@2273
   347
                if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
yann@2273
   348
                    CT_Abort "Linux version is unavailable in installed headers files"
yann@2273
   349
                fi
yann@2273
   350
                version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
yann@2273
   351
                                 |cut -d ' ' -f 3                                   \
yann@2273
   352
                               )"
yann@2273
   353
                version=$(((version_code>>16)&0xFF))
yann@2273
   354
                patchlevel=$(((version_code>>8)&0xFF))
yann@2273
   355
                sublevel=$((version_code&0xFF))
yann@2273
   356
                min_kernel_config="${version}.${patchlevel}.${sublevel}"
yann@2273
   357
            elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
yann@2273
   358
                # Trim the fourth part of the linux version, keeping only the first three numbers
yann@2276
   359
                min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
yann@2276
   360
                                      |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
yann@2273
   361
                                    )"
yann@2273
   362
            fi
yann@2273
   363
            echo "--enable-kernel=${min_kernel_config}"
yann@2273
   364
            ;;
yann@2273
   365
    esac
yann@2273
   366
}