scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed May 18 23:00:46 2011 +0200 (2011-05-18)
changeset 2467 200836977ce6
parent 2466 b7df125a1c78
child 2483 fa3a18f9abcf
permissions -rw-r--r--
config: rename variables that are arrays

Make it explicit that a variable is an array bu the name of the variable.
It will be used later when .config gets munged to allow both multiple
arguments and arguments with spaces at the same time to be passed from the
configuration down to the build scripts.

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@2467
   154
    # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
yann@2467
   155
    # extra_config
yann@850
   156
yann@2273
   157
    extra_config+=("$(do_libc_min_kernel_config)")
yann@850
   158
yann@850
   159
    case "${CT_THREADS}" in
yann@1478
   160
        nptl)           extra_config+=("--with-__thread" "--with-tls");;
yann@1478
   161
        linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
yann@1478
   162
        none)           extra_config+=("--without-__thread" "--without-nptl")
yann@2467
   163
                        case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
yann@850
   164
                            *-tls*) ;;
yann@1478
   165
                            *) extra_config+=("--without-tls");;
yann@850
   166
                        esac
yann@850
   167
                        ;;
yann@850
   168
    esac
yann@850
   169
yann@850
   170
    case "${CT_SHARED_LIBS}" in
yann@1478
   171
        y) extra_config+=("--enable-shared");;
yann@1478
   172
        *) extra_config+=("--disable-shared");;
yann@850
   173
    esac
yann@850
   174
yann@850
   175
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@1478
   176
        y,) extra_config+=("--with-fp");;
yann@1478
   177
        ,y) extra_config+=("--without-fp");;
yann@850
   178
    esac
yann@850
   179
bryanhundven@2180
   180
    if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
bryanhundven@2180
   181
        extra_config+=("--disable-versioning")
bryanhundven@2180
   182
    fi
bryanhundven@2180
   183
bryanhundven@2181
   184
    if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
bryanhundven@2181
   185
        extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
bryanhundven@2181
   186
    fi
bryanhundven@2181
   187
yann@850
   188
    case "$(do_libc_add_ons_list ,)" in
yann@850
   189
        "") ;;
yann@1478
   190
        *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
yann@850
   191
    esac
yann@850
   192
yann@850
   193
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   194
yann@2289
   195
    touch config.cache
yann@2289
   196
    if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
yann@2289
   197
        echo "libc_cv_forced_unwind=yes" >>config.cache
yann@2289
   198
        echo "libc_cv_c_cleanup=yes" >>config.cache
yann@2289
   199
    fi
yann@2289
   200
yann@2276
   201
    # Pre-seed the configparms file with values from the config option
yann@2276
   202
    printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
yann@2276
   203
yann@850
   204
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")    
yann@850
   205
yann@850
   206
    CT_DoLog DEBUG "Using gcc for target:     '${cross_cc}'"
yann@850
   207
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@1478
   208
    CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
yann@850
   209
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   210
yann@2312
   211
    glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE}"
yann@2312
   212
    case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
yann@2312
   213
        y)  ;;
yann@2312
   214
        *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
yann@2312
   215
    esac
yann@2312
   216
bryanhundven@2229
   217
    # ./configure is mislead by our tools override wrapper for bash
bryanhundven@2229
   218
    # so just tell it where the real bash is _on_the_target_!
bryanhundven@2229
   219
    # Notes:
bryanhundven@2229
   220
    # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
bryanhundven@2229
   221
    # - ${BASH_SHELL}            is only used to set BASH
bryanhundven@2229
   222
    # - ${BASH}                  is only used to set the shebang
bryanhundven@2229
   223
    #                            in two scripts to run on the target
bryanhundven@2229
   224
    # So we can safely bypass bash detection at compile time.
bryanhundven@2229
   225
    # Should this change in a future eglibc release, we'd better
bryanhundven@2229
   226
    # directly mangle the generated scripts _after_ they get built,
bryanhundven@2229
   227
    # or even after they get installed... eglibc is such a sucker...
yann@2289
   228
    echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
bryanhundven@2229
   229
yann@2276
   230
    # Configure with --prefix the way we want it on the target...
yann@2276
   231
    # There are a whole lot of settings here.  You'll probably want
yann@2467
   232
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
yann@2276
   233
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@2276
   234
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
yann@2276
   235
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
yann@2276
   236
    # Set BUILD_CC, or we won't be able to build datafiles
yann@2276
   237
yann@2353
   238
    CT_DoExecLog CFG                                                \
yann@1041
   239
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@2312
   240
    CFLAGS="${glibc_cflags}"                                        \
yann@850
   241
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@850
   242
    AR=${CT_TARGET}-ar                                              \
yann@850
   243
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@2271
   244
    "${src_dir}/configure"                                          \
yann@850
   245
        --prefix=/usr                                               \
yann@1041
   246
        --build=${CT_BUILD}                                         \
yann@850
   247
        --host=${CT_TARGET}                                         \
yann@2289
   248
        --cache-file="$(pwd)/config.cache"                          \
yann@2276
   249
        --without-cvs                                               \
yann@850
   250
        --disable-profile                                           \
yann@850
   251
        --without-gd                                                \
yann@2276
   252
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@1478
   253
        "${extra_config[@]}"                                        \
yann@2467
   254
        "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
yann@850
   255
    
yann@2276
   256
    # build hacks
yann@2276
   257
    case "${CT_ARCH},${CT_ARCH_CPU}" in
yann@2276
   258
        powerpc,8??)
yann@2276
   259
            # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
yann@2276
   260
            CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
yann@2276
   261
            extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
yann@2271
   262
            ;;
yann@1328
   263
    esac
yann@1328
   264
yann@2276
   265
    CT_DoLog EXTRA "Building C library"
yann@2277
   266
    CT_DoExecLog ALL make ${JOBSFLAGS}                      \
yann@2276
   267
                          "${extra_make_args[@]}"           \
yann@2276
   268
                          all
yann@850
   269
yann@850
   270
    CT_DoLog EXTRA "Installing C library"
yann@2277
   271
    CT_DoExecLog ALL make ${JOBSFLAGS}                      \
yann@2276
   272
                          "${extra_make_args[@]}"           \
yann@2276
   273
                          install_root="${CT_SYSROOT_DIR}"  \
yann@2276
   274
                          install
yann@850
   275
yann@850
   276
    CT_EndStep
yann@850
   277
}
yann@850
   278
yann@2270
   279
# This function finishes the C library install
yann@2270
   280
# This is a no-op
yann@850
   281
do_libc_finish() {
yann@850
   282
    :
yann@850
   283
}
yann@850
   284
yann@850
   285
# Build up the addons list, separated with $1
yann@850
   286
do_libc_add_ons_list() {
yann@850
   287
    local sep="$1"
yann@2274
   288
    local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
yann@2274
   289
                          |sed -r -e "s/[[:space:],]/${sep}/g;" \
yann@2274
   290
                        )"
yann@850
   291
    case "${CT_THREADS}" in
yann@850
   292
        none)   ;;
yann@850
   293
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@850
   294
    esac
yann@850
   295
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@2274
   296
    # Remove duplicate, leading and trailing separators
yann@2274
   297
    echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
yann@850
   298
}
yann@2273
   299
yann@2273
   300
# Compute up the minimum supported Linux kernel version
yann@2273
   301
do_libc_min_kernel_config() {
yann@2273
   302
    local min_kernel_config
yann@2273
   303
yann@2467
   304
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
yann@2273
   305
        *--enable-kernel*) ;;
yann@2273
   306
        *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
yann@2273
   307
                # We can't rely on the kernel version from the configuration,
yann@2273
   308
                # because it might not be available if the user uses pre-installed
yann@2273
   309
                # headers. On the other hand, both method will have the kernel
yann@2279
   310
                # version installed in "usr/include/linux/version.h" in the sysroot.
yann@2273
   311
                # Parse that instead of having two code-paths.
yann@2273
   312
                version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
yann@2273
   313
                if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
yann@2273
   314
                    CT_Abort "Linux version is unavailable in installed headers files"
yann@2273
   315
                fi
yann@2273
   316
                version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
yann@2273
   317
                                 |cut -d ' ' -f 3                                   \
yann@2273
   318
                               )"
yann@2273
   319
                version=$(((version_code>>16)&0xFF))
yann@2273
   320
                patchlevel=$(((version_code>>8)&0xFF))
yann@2273
   321
                sublevel=$((version_code&0xFF))
yann@2273
   322
                min_kernel_config="${version}.${patchlevel}.${sublevel}"
yann@2273
   323
            elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
yann@2273
   324
                # Trim the fourth part of the linux version, keeping only the first three numbers
yann@2276
   325
                min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
yann@2276
   326
                                      |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
yann@2273
   327
                                    )"
yann@2273
   328
            fi
yann@2273
   329
            echo "--enable-kernel=${min_kernel_config}"
yann@2273
   330
            ;;
yann@2273
   331
    esac
yann@2273
   332
}