scripts/build/libc/uClibc.sh
author Michael Hope <michael.hope@linaro.org>
Wed Oct 19 15:27:32 2011 +1300 (2011-10-19)
changeset 2739 f320e22f2cba
parent 2578 35afb309f957
child 2761 19760eb7a090
permissions -rw-r--r--
arch: add softfp support

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

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

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

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