scripts/build/libc/uClibc.sh
author Remy Bohmer <linux@bohmer.net>
Thu May 27 23:18:19 2010 +0200 (2010-05-27)
changeset 2060 51e4597b07fc
parent 2037 cd00fdab6117
child 2081 223aaf040327
permissions -rw-r--r--
scripts: add option to strip all toolchain executables

To reduce filesizes of the toolchain and even improve build times
of projects to be build with this toolchain it is usefull to strip
the delivered toolchain executables. Since it is not likely that we
will debug the toolchain executables itself we do not need the
debug information inside the executables itself.

Signed-off-by: Remy Bohmer <linux@bohmer.net>
yann@850
     1
# This file declares functions to install the uClibc C library
yann@850
     2
# Copyright 2007 Yann E. MORIN
yann@850
     3
# Licensed under the GPL v2. See COPYING in the root of this package
yann@850
     4
yann@2037
     5
# This is a constant because it does not change very often.
yann@2037
     6
# We're in 2010, and are still using data from 7 years ago.
yann@2037
     7
uclibc_locales_version=030818
yann@2037
     8
uclibc_local_tarball="uClibc-locales-${uclibc_locale_version}"
yann@2037
     9
yann@850
    10
# Download uClibc
yann@850
    11
do_libc_get() {
yann@850
    12
    libc_src="http://www.uclibc.org/downloads
yann@850
    13
              http://www.uclibc.org/downloads/snapshots
yann@850
    14
              http://www.uclibc.org/downloads/old-releases"
yann@850
    15
    # For uClibc, we have almost every thing: releases, and snapshots
yann@850
    16
    # for the last month or so. We'll have to deal with svn revisions
yann@850
    17
    # later...
yann@1123
    18
    CT_GetFile "uClibc-${CT_LIBC_VERSION}" ${libc_src}
yann@850
    19
    # uClibc locales
yann@2036
    20
    if [ "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y" ]; then
yann@2037
    21
        CT_GetFile "${uclibc_local_tarball}" ${libc_src}
yann@1126
    22
    fi
yann@850
    23
yann@850
    24
    return 0
yann@850
    25
}
yann@850
    26
yann@2008
    27
libc_uclibc_src_dir() {
yann@2008
    28
    if [    -z "${CT_LIBC_V_snapshot}"      \
yann@2008
    29
         -a -z "${CT_LIBC_V_specific_date}" \
yann@2008
    30
       ]; then
yann@2008
    31
        echo "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}"
yann@2008
    32
    else
yann@2008
    33
        echo "${CT_SRC_DIR}/uClibc"
yann@2008
    34
    fi
yann@2008
    35
}
yann@2008
    36
yann@850
    37
# Extract uClibc
yann@850
    38
do_libc_extract() {
yann@1126
    39
    CT_Extract "uClibc-${CT_LIBC_VERSION}"
yann@2008
    40
    # Don't patch snapshots
yann@2008
    41
    if [    -z "${CT_LIBC_V_snapshot}"      \
yann@2008
    42
         -a -z "${CT_LIBC_V_specific_date}" \
yann@2008
    43
       ]; then
yann@2008
    44
        CT_Patch "uClibc" "${CT_LIBC_VERSION}"
yann@2008
    45
    fi
yann@1126
    46
yann@850
    47
    # uClibc locales
yann@2036
    48
    # Extracting pregen locales ourselves is kinda
yann@2036
    49
    # broken, so just link it in place...
yann@2036
    50
    if [    "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y"           \
yann@2037
    51
         -a ! -f "${CT_SRC_DIR}/.${uclibc_local_tarball}.extracted" ]; then
yann@2008
    52
        CT_Pushd "$(libc_uclibc_src_dir)/extra/locale"
yann@2037
    53
        CT_DoExecLog ALL ln -s "${CT_TARBALLS_DIR}/${uclibc_local_tarball}.tgz" .
yann@1123
    54
        CT_Popd
yann@2037
    55
        touch "${CT_SRC_DIR}/.${uclibc_local_tarball}.extracted"
yann@1123
    56
    fi
yann@850
    57
yann@850
    58
    return 0
yann@850
    59
}
yann@850
    60
yann@850
    61
# Check that uClibc has been previously configured
yann@850
    62
do_libc_check_config() {
yann@850
    63
    CT_DoStep INFO "Checking C library configuration"
yann@850
    64
yann@850
    65
    CT_TestOrAbort "You did not provide a uClibc config file!" -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" -a -f "${CT_LIBC_UCLIBC_CONFIG_FILE}"
yann@850
    66
yann@1247
    67
    if grep -E '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then
yann@850
    68
        CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad."
yann@850
    69
        CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade."
yann@850
    70
    fi
yann@850
    71
yann@850
    72
    CT_DoLog EXTRA "Munging uClibc configuration"
yann@1272
    73
    mungeuClibcConfig "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_CONFIG_DIR}/uClibc.config"
yann@850
    74
yann@850
    75
    CT_EndStep
yann@850
    76
}
yann@850
    77
yann@850
    78
# This functions installs uClibc's headers
yann@850
    79
do_libc_headers() {
yann@1326
    80
    local install_rule
yann@2009
    81
    local cross
yann@1326
    82
yann@850
    83
    CT_DoStep INFO "Installing C library headers"
yann@850
    84
yann@1678
    85
    # Simply copy files until uClibc has the ability to build out-of-tree
yann@1678
    86
    CT_DoLog EXTRA "Copying sources to build dir"
yann@2008
    87
    CT_DoExecLog ALL cp -av "$(libc_uclibc_src_dir)"            \
yann@1678
    88
                            "${CT_BUILD_DIR}/build-libc-headers"
yann@850
    89
    cd "${CT_BUILD_DIR}/build-libc-headers"
yann@850
    90
yann@850
    91
    # Retrieve the config file
yann@1678
    92
    CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/uClibc.config" .config
yann@850
    93
yann@850
    94
    # uClibc uses the CROSS environment variable as a prefix to the
yann@850
    95
    # compiler tools to use.  Setting it to the empty string forces
yann@850
    96
    # use of the native build host tools, which we need at this
yann@850
    97
    # stage, as we don't have target tools yet.
yann@2009
    98
    # BUT! With NPTL, we need a cross-compiler (and we have it)
yann@2009
    99
    if [ "${CT_THREADS}" = "nptl" ]; then
yann@2009
   100
        cross="${CT_TARGET}-"
yann@2009
   101
    fi
yann@2009
   102
yann@2037
   103
    # Force the date of the pregen locale data, as the
yann@2037
   104
    # newer ones that are referenced are not available
yann@850
   105
    CT_DoLog EXTRA "Applying configuration"
yann@2038
   106
    CT_DoYes "" |CT_DoExecLog ALL                                   \
yann@2038
   107
                 make CROSS="${cross}"                              \
yann@2038
   108
                 PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2037
   109
                 LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@2009
   110
                 oldconfig
yann@850
   111
yann@850
   112
    CT_DoLog EXTRA "Building headers"
yann@2038
   113
    CT_DoExecLog ALL                                        \
yann@2038
   114
    make ${CT_LIBC_UCLIBC_VERBOSITY}                        \
yann@2038
   115
         CROSS="${cross}"                                   \
yann@2038
   116
         PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2037
   117
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@2009
   118
         headers
yann@850
   119
yann@1326
   120
    if [ "${CT_LIBC_UCLIBC_0_9_30_or_later}" = "y" ]; then
yann@1326
   121
        install_rule=install_headers
yann@1326
   122
    else
yann@1326
   123
        install_rule=install_dev
yann@1326
   124
    fi
yann@1326
   125
yann@850
   126
    CT_DoLog EXTRA "Installing headers"
yann@2038
   127
    CT_DoExecLog ALL                                        \
yann@2038
   128
    make ${CT_LIBC_UCLIBC_VERBOSITY}                        \
yann@2038
   129
         CROSS="${cross}"                                   \
yann@2038
   130
         PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2037
   131
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@2009
   132
         ${install_rule}
yann@2009
   133
yann@2009
   134
    if [ "${CT_THREADS}" = "nptl" ]; then
yann@2009
   135
        CT_DoLog EXTRA "Building start files"
yann@2038
   136
        CT_DoExecLog ALL                                        \
yann@2038
   137
        make ${CT_LIBC_UCLIBC_PARALLEL:+${PARALLELMFLAGS}}      \
yann@2038
   138
             CROSS="${cross}"                                   \
yann@2038
   139
             PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2038
   140
             STRIPTOOL=true                                     \
yann@2038
   141
             ${CT_LIBC_UCLIBC_VERBOSITY}                        \
yann@2037
   142
             LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@2009
   143
             lib/crt1.o lib/crti.o lib/crtn.o
yann@2009
   144
yann@2009
   145
        # From:  http://git.openembedded.org/cgit.cgi/openembedded/commit/?id=ad5668a7ac7e0436db92e55caaf3fdf782b6ba3b
yann@2009
   146
        # libm.so is needed for ppc, as libgcc is linked against libm.so
yann@2009
   147
        # No problem to create it for other archs.
yann@2009
   148
        CT_DoLog EXTRA "Building dummy shared libs"
yann@2009
   149
        CT_DoExecLog ALL "${cross}gcc" -nostdlib        \
yann@2009
   150
                                       -nostartfiles    \
yann@2009
   151
                                       -shared          \
yann@2009
   152
                                       -x c /dev/null   \
yann@2009
   153
                                       -o libdummy.so
yann@2009
   154
yann@2009
   155
        CT_DoLog EXTRA "Installing start files"
yann@2009
   156
        CT_DoExecLog ALL install -m 0644 lib/crt1.o lib/crti.o lib/crtn.o   \
yann@2009
   157
                                         "${CT_SYSROOT_DIR}/usr/lib"
yann@2009
   158
yann@2009
   159
        CT_DoLog EXTRA "Installing dummy shared libs"
yann@2009
   160
        CT_DoExecLog ALL install -m 0755 libdummy.so "${CT_SYSROOT_DIR}/usr/lib/libc.so"
yann@2009
   161
        CT_DoExecLog ALL install -m 0755 libdummy.so "${CT_SYSROOT_DIR}/usr/lib/libm.so"
yann@2009
   162
    fi # CT_THREADS == nptl
yann@850
   163
yann@850
   164
    CT_EndStep
yann@850
   165
}
yann@850
   166
yann@850
   167
# Build and install start files
yann@850
   168
do_libc_start_files() {
yann@850
   169
    :
yann@850
   170
}
yann@850
   171
yann@850
   172
# This function build and install the full uClibc
yann@850
   173
do_libc() {
yann@850
   174
    CT_DoStep INFO "Installing C library"
yann@850
   175
yann@1678
   176
    # Simply copy files until uClibc has the ability to build out-of-tree
yann@1678
   177
    CT_DoLog EXTRA "Copying sources to build dir"
yann@2008
   178
    CT_DoExecLog ALL cp -av "$(libc_uclibc_src_dir)"    \
yann@1678
   179
                            "${CT_BUILD_DIR}/build-libc"
yann@850
   180
    cd "${CT_BUILD_DIR}/build-libc"
yann@850
   181
yann@850
   182
    # Retrieve the config file
yann@1678
   183
    CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/uClibc.config" .config
yann@850
   184
yann@850
   185
    # uClibc uses the CROSS environment variable as a prefix to the compiler
yann@850
   186
    # tools to use.  The newly built tools should be in our path, so we need
yann@850
   187
    # only give the correct name for them.
yann@850
   188
    # Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
yann@850
   189
    # depending  on the configuration of the library. That is, they are tailored
yann@850
   190
    # to best fit the target. So it is useless and seems to be a bad thing to
yann@850
   191
    # use LIBC_EXTRA_CFLAGS here.
yann@850
   192
    CT_DoLog EXTRA "Applying configuration"
yann@2038
   193
    CT_DoYes "" |CT_DoExecLog ALL                                   \
yann@2038
   194
                 make CROSS=${CT_TARGET}-                           \
yann@2038
   195
                 PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2037
   196
                 LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@850
   197
                 oldconfig
yann@850
   198
yann@850
   199
    # We do _not_ want to strip anything for now, in case we specifically
yann@850
   200
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
yann@1029
   201
    # /Old/ versions can not build in //
yann@850
   202
    CT_DoLog EXTRA "Building C library"
yann@2038
   203
    CT_DoExecLog ALL                                        \
yann@2038
   204
    make -j1                                                \
yann@2038
   205
         CROSS=${CT_TARGET}-                                \
yann@2038
   206
         PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2038
   207
         STRIPTOOL=true                                     \
yann@2038
   208
         ${CT_LIBC_UCLIBC_VERBOSITY}                        \
yann@2037
   209
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@2009
   210
         pregen
yann@2038
   211
    CT_DoExecLog ALL                                        \
yann@2038
   212
    make ${CT_LIBC_UCLIBC_PARALLEL:+${PARALLELMFLAGS}}      \
yann@2038
   213
         CROSS=${CT_TARGET}-                                \
yann@2038
   214
         PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2038
   215
         STRIPTOOL=true                                     \
yann@2038
   216
         ${CT_LIBC_UCLIBC_VERBOSITY}                        \
yann@2037
   217
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@850
   218
         all
yann@850
   219
yann@1326
   220
    # YEM-FIXME:
yann@1326
   221
    # - we want to install 'runtime' files, eg. lib*.{a,so*}, crti.o and
yann@1326
   222
    #   such files, except the headers as they already are installed
yann@1326
   223
    # - "make install_dev" installs the headers, the crti.o... and the
yann@1326
   224
    #   static libs, but not the dynamic libs
yann@1326
   225
    # - "make install_runtime" installs the dynamic libs only
yann@1326
   226
    # - "make install" calls install_runtime and install_dev
yann@1326
   227
    # - so we're left with re-installing the headers... Sigh...
yann@1326
   228
    #
yann@850
   229
    # We do _not_ want to strip anything for now, in case we specifically
yann@1027
   230
    # asked for a debug toolchain, hence the STRIPTOOL= assignment
yann@1326
   231
    #
yann@1326
   232
    # Note: PARALLELMFLAGS is not usefull for installation.
yann@1326
   233
    #
yann@850
   234
    CT_DoLog EXTRA "Installing C library"
yann@2038
   235
    CT_DoExecLog ALL                                        \
yann@2038
   236
    make CROSS=${CT_TARGET}-                                \
yann@2038
   237
         PREFIX="${CT_SYSROOT_DIR}/"                        \
yann@2038
   238
         STRIPTOOL=true                                     \
yann@2038
   239
         ${CT_LIBC_UCLIBC_VERBOSITY}                        \
yann@2037
   240
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
yann@850
   241
         install
yann@850
   242
yann@850
   243
    CT_EndStep
yann@850
   244
}
yann@850
   245
yann@850
   246
# This function is used to install those components needing the final C compiler
yann@850
   247
do_libc_finish() {
yann@1209
   248
    :
yann@850
   249
}
yann@850
   250
yann@850
   251
# Initialises the .config file to sensible values
yann@850
   252
# $1: original file
yann@850
   253
# $2: munged file
yann@850
   254
mungeuClibcConfig() {
yann@850
   255
    src_config_file="$1"
yann@850
   256
    dst_config_file="$2"
yann@850
   257
    munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed"
yann@850
   258
yann@850
   259
    # Start with a fresh file
yann@850
   260
    rm -f "${munge_file}"
yann@850
   261
    touch "${munge_file}"
yann@850
   262
yann@1674
   263
    # Do it all in a sub-shell, it's easier to redirect output
yann@1674
   264
    (
yann@1674
   265
yann@850
   266
    # Hack our target in the config file.
yann@1750
   267
    case "${CT_ARCH}:${CT_ARCH_BITNESS}" in
thomas@1910
   268
        x86:32)      arch=i386;;
thomas@1910
   269
        x86:64)      arch=x86_64;;
thomas@1910
   270
        sh:32)       arch="sh";;
thomas@1910
   271
        sh:64)       arch="sh64";;
thomas@1910
   272
        blackfin:32) arch="bfin";;
thomas@1910
   273
        *)           arch="${CT_ARCH}";;
yann@1750
   274
    esac
yann@850
   275
    # Also remove stripping: its the responsibility of the
yann@850
   276
    # firmware builder to strip or not.
yann@1674
   277
    cat <<-ENDSED
yann@1674
   278
		s/^(TARGET_.*)=y$/# \\1 is not set/
yann@1750
   279
		s/^# TARGET_${arch} is not set/TARGET_${arch}=y/
yann@1750
   280
		s/^TARGET_ARCH=".*"/TARGET_ARCH="${arch}"/
yann@1674
   281
		s/.*(DOSTRIP).*/# \\1 is not set/
yann@1674
   282
		ENDSED
yann@850
   283
yann@850
   284
    # Ah. We may one day need architecture-specific handler here...
yann@1675
   285
    if [ "${CT_ARCH}" = "arm" ]; then
yann@1675
   286
        # Hack the ARM {E,O}ABI into the config file
yann@1675
   287
        if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
yann@1675
   288
            cat <<-ENDSED
yann@1675
   289
				s/.*(CONFIG_ARM_OABI).*/# \\1 is not set/
yann@1675
   290
				s/.*(CONFIG_ARM_EABI).*/\\1=y/
yann@1675
   291
				ENDSED
yann@1675
   292
        else
yann@1675
   293
            cat <<-ENDSED
yann@1675
   294
				s/.*(CONFIG_ARM_OABI).*/\\1=y/
yann@1675
   295
				s/.*(CONFIG_ARM_EABI).*/# \\1 is not set/
yann@1675
   296
				ENDSED
yann@1675
   297
        fi
yann@850
   298
    fi
yann@850
   299
yann@850
   300
    # Accomodate for old and new uClibc versions, where the
yann@850
   301
    # way to select between big/little endian has changed
yann@850
   302
    case "${CT_ARCH_BE},${CT_ARCH_LE}" in
yann@1674
   303
        y,) cat <<-ENDSED
yann@1674
   304
				s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1674
   305
				s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
yann@1674
   306
				s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1674
   307
				s/.*(ARCH_WANTS_BIG_ENDIAN).*/\\1=y/
yann@1674
   308
				ENDSED
yann@850
   309
        ;;
yann@1674
   310
        ,y) cat <<-ENDSED
yann@1674
   311
				s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
yann@1674
   312
				s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
yann@1674
   313
				s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/\\1=y/
yann@1674
   314
				s/.*(ARCH_WANTS_BIG_ENDIAN).*/# \\1 is not set/
yann@1674
   315
				ENDSED
yann@850
   316
        ;;
yann@850
   317
    esac
yann@850
   318
yann@850
   319
    # Accomodate for old and new uClibc version, where the
yann@850
   320
    # way to select between hard/soft float has changed
yann@850
   321
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@1674
   322
        y,) cat <<-ENDSED
yann@1674
   323
				s/^[^_]*(HAS_FPU).*/\\1=y/
yann@1674
   324
				s/.*(UCLIBC_HAS_FPU).*/\\1=y/
yann@1674
   325
				ENDSED
yann@850
   326
            ;;
yann@1674
   327
        ,y) cat <<-ENDSED
yann@1674
   328
				s/^[^_]*(HAS_FPU).*/\\# \\1 is not set/
yann@1674
   329
				s/.*(UCLIBC_HAS_FPU).*/# \\1 is not set/
yann@1674
   330
				ENDSED
yann@850
   331
            ;;
yann@850
   332
    esac
yann@850
   333
yann@850
   334
    # Change paths to work with crosstool-NG
yann@850
   335
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
yann@850
   336
    #  " we just want the kernel headers, not the whole kernel source ...
yann@850
   337
    #  " so people may need to update their paths slightly
yann@850
   338
    quoted_kernel_source=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\/,g;')
yann@850
   339
    quoted_headers_dir=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/,\\/,g;')
yann@850
   340
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
yann@850
   341
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
yann@850
   342
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
yann@1674
   343
    # newer versions use KERNEL_HEADERS (which is right).
yann@1674
   344
    cat <<-ENDSED
yann@1674
   345
		s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
yann@1674
   346
		s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
yann@1674
   347
		s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
yann@1674
   348
		s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
yann@1674
   349
		s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
yann@1674
   350
		s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
yann@1674
   351
		ENDSED
yann@850
   352
yann@850
   353
    if [ "${CT_USE_PIPES}" = "y" ]; then
yann@850
   354
        if grep UCLIBC_EXTRA_CFLAGS extra/Configs/Config.in >/dev/null 2>&1; then
yann@850
   355
            # Good, there is special provision for such things as -pipe!
yann@1674
   356
            cat <<-ENDSED
yann@1674
   357
				s/^(UCLIBC_EXTRA_CFLAGS=".*)"$/\\1 -pipe"/
yann@1674
   358
				ENDSED
yann@850
   359
        else
yann@850
   360
            # Hack our -pipe into WARNINGS, which will be internally incorporated to
yann@850
   361
            # CFLAGS. This a dirty hack, but yet needed
yann@1674
   362
            cat <<-ENDSED
yann@1674
   363
				s/^(WARNINGS=".*)"$/\\1 -pipe"/
yann@1674
   364
				ENDSED
yann@850
   365
        fi
yann@850
   366
    fi
yann@850
   367
yann@1028
   368
    # Locales support
yann@850
   369
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
yann@850
   370
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
yann@850
   371
    # assume the user has already made all the appropriate generation
yann@850
   372
    # arrangements.  Note that having the uClibc Makefile download the
yann@850
   373
    # pregenerated locales is not compatible with crosstool; besides,
yann@850
   374
    # crosstool downloads them as part of getandpatch.sh.
yann@2036
   375
    case "${CT_LIBC_UCLIBC_LOCALES}:${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" in
yann@2036
   376
        :*)
yann@2036
   377
            ;;
yann@2036
   378
        y:)
yann@2036
   379
            cat <<-ENDSED
yann@2036
   380
				s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\
yann@2036
   381
				# UCLIBC_PREGENERATED_LOCALE_DATA is not set\\
yann@2036
   382
				# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\
yann@2036
   383
				# UCLIBC_HAS_XLOCALE is not set/
yann@2036
   384
				ENDSED
yann@2036
   385
            ;;
yann@2036
   386
        y:y)
yann@2036
   387
            cat <<-ENDSED
yann@2036
   388
				s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\
yann@2036
   389
				UCLIBC_PREGENERATED_LOCALE_DATA=y\\
yann@2036
   390
				# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\
yann@2036
   391
				# UCLIBC_HAS_XLOCALE is not set/
yann@2036
   392
				ENDSED
yann@2036
   393
            ;;
yann@2036
   394
    esac
yann@1028
   395
fpasch@1639
   396
    # WCHAR support
fpasch@1639
   397
    if [ "${CT_LIBC_UCLIBC_WCHAR}" = "y" ] ; then
yann@1674
   398
        cat <<-ENDSED
yann@1674
   399
			s/^.*UCLIBC_HAS_WCHAR.*/UCLIBC_HAS_WCHAR=y/
yann@1674
   400
			ENDSED
fpasch@1639
   401
    else
yann@1674
   402
        cat <<-ENDSED
yann@1674
   403
			s/^.*UCLIBC_HAS_WCHAR.*/UCLIBC_HAS_WCHAR=n/
yann@1674
   404
			ENDSED
fpasch@1639
   405
    fi
fpasch@1639
   406
yann@1028
   407
    # Force on options needed for C++ if we'll be making a C++ compiler.
yann@1028
   408
    # I'm not sure locales are a requirement for doing C++... Are they?
yann@850
   409
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
yann@1674
   410
        cat <<-ENDSED
yann@1674
   411
			s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
yann@1674
   412
			s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/
yann@1674
   413
			s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
yann@1674
   414
			ENDSED
yann@850
   415
    fi
yann@850
   416
yann@1977
   417
    # Push the threading model
yann@1977
   418
    # Note: we take into account all of the .28, .29, .30 and .31
yann@2009
   419
    #       versions, here. Even snapshots with NPTL.
yann@1977
   420
    case "${CT_THREADS}:${CT_LIBC_UCLIBC_LNXTHRD}" in
yann@2009
   421
        none:)
yann@1977
   422
            cat <<-ENDSED
yann@1977
   423
				s/^UCLIBC_HAS_THREADS=y/# UCLIBC_HAS_THREADS is not set/
yann@1977
   424
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
yann@1977
   425
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
yann@2009
   426
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
yann@1977
   427
				ENDSED
yann@1977
   428
            ;;
yann@2007
   429
        linuxthreads:old)
yann@1977
   430
            cat <<-ENDSED
yann@1977
   431
				s/^# UCLIBC_HAS_THREADS is not set/UCLIBC_HAS_THREADS=y/
yann@2007
   432
				s/^# LINUXTHREADS_OLD is not set/LINUXTHREADS_OLD=y/
yann@1977
   433
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
yann@2009
   434
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
yann@1977
   435
				ENDSED
yann@1977
   436
            ;;
yann@2007
   437
        linuxthreads:new)
yann@1977
   438
            cat <<-ENDSED
yann@1977
   439
				s/^# UCLIBC_HAS_THREADS is not set/UCLIBC_HAS_THREADS=y/
yann@1977
   440
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
yann@2007
   441
				s/^# LINUXTHREADS_NEW is not set/LINUXTHREADS_NEW=y/
yann@2009
   442
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
yann@1977
   443
				ENDSED
yann@1977
   444
            ;;
yann@2009
   445
        nptl:)
yann@2009
   446
            cat <<-ENDSED
yann@2009
   447
				s/^HAS_NO_THREADS=y/# HAS_NO_THREADS is not set/
yann@2009
   448
				s/^UCLIBC_HAS_THREADS=y/# UCLIBC_HAS_THREADS is not set/
yann@2009
   449
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
yann@2009
   450
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
yann@2009
   451
				s/^# UCLIBC_HAS_THREADS_NATIVE is not set/UCLIBC_HAS_THREADS_NATIVE=y/
yann@2009
   452
				ENDSED
yann@2009
   453
            ;;
yann@2009
   454
        *)
yann@2009
   455
            CT_Abort "Incorrect thread settings: CT_THREADS='${CT_THREAD}' CT_LIBC_UCLIBC_LNXTHRD='${CT_LIBC_UCLIBC_LNXTHRD}'"
yann@2009
   456
            ;;
yann@1977
   457
    esac
yann@1977
   458
yann@850
   459
    # Always build the libpthread_db
yann@1674
   460
    cat <<-ENDSED
yann@1674
   461
		s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1674
   462
		ENDSED
yann@850
   463
yann@850
   464
    # Force on debug options if asked for
yann@850
   465
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
yann@850
   466
      0)
yann@1674
   467
        cat <<-ENDSED
yann@1674
   468
			s/^DODEBUG=y/# DODEBUG is not set/
yann@1674
   469
			s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1674
   470
			s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1674
   471
			s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1674
   472
			s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@1674
   473
			s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1674
   474
			ENDSED
yann@850
   475
        ;;
yann@850
   476
      1)
yann@1674
   477
        cat <<-ENDSED
yann@1674
   478
			s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1674
   479
			s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1674
   480
			s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1674
   481
			s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1674
   482
			s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@1674
   483
			s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1674
   484
			ENDSED
yann@850
   485
        ;;
yann@850
   486
      2)
yann@1674
   487
        cat <<-ENDSED
yann@1674
   488
			s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1674
   489
			s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
yann@1674
   490
			s/^# DOASSERTS is not set.*/DOASSERTS=y/
yann@1674
   491
			s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
yann@1674
   492
			s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
yann@1674
   493
			s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
yann@1674
   494
			ENDSED
yann@850
   495
        ;;
yann@850
   496
    esac
yann@1674
   497
yann@1674
   498
    # And now, this is the end
yann@1674
   499
    ) >>"${munge_file}"
yann@1674
   500
yann@850
   501
    sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
yann@850
   502
}