scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Apr 28 00:13:41 2011 +0200 (2011-04-28)
changeset 2412 20edcd78cf67
parent 2314 9e1a17fdf363
child 2466 b7df125a1c78
permissions -rw-r--r--
scripts/addToolsVersion: versions can be either in the .in or the .in.2

The components have their version selection handled either in the .in
file or the .in.2 file. Handle both cases.

Also, when dumping an existing version, keep the user's grep options
(ie. do override neither options nor colors).

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