scripts/build/libc/uClibc.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Mon Feb 13 21:47:25 2012 +0100 (2012-02-13)
changeset 2883 cea814c9932a
parent 2761 19760eb7a090
child 2951 e9a326ae9369
permissions -rw-r--r--
libc/glibc: do not consume parameters when parsing them

Currently, there are two constructs used to parse arguments in
glibc backends, one that consumes args as they are parsed, and
one that does not.

Always use the construct that does not eat args as they are parsed.

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@2777
   323
    case "${CT_ARCH_ENDIAN}" in
yann@2777
   324
        big)
yann@2777
   325
            cat <<-ENDSED
yann@1674
   326
				s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1674
   327
				s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
yann@1674
   328
				s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1674
   329
				s/.*(ARCH_WANTS_BIG_ENDIAN).*/\\1=y/
yann@1674
   330
				ENDSED
yann@850
   331
        ;;
yann@2777
   332
        little)
yann@2777
   333
            cat <<-ENDSED
yann@1674
   334
				s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
yann@1674
   335
				s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
yann@1674
   336
				s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/\\1=y/
yann@1674
   337
				s/.*(ARCH_WANTS_BIG_ENDIAN).*/# \\1 is not set/
yann@1674
   338
				ENDSED
yann@850
   339
        ;;
yann@850
   340
    esac
yann@850
   341
yann@2410
   342
    # Accomodate for old and new uClibc versions, where the
yann@2410
   343
    # MMU settings has different config knobs
yann@2410
   344
    if [ "${CT_ARCH_USE_MMU}" = "y" ]; then
yann@2410
   345
        cat <<-ENDSED
yann@2410
   346
			s/.*(ARCH_HAS_MMU).*/\\1=y\nARCH_USE_MMU=y/
yann@2410
   347
			ENDSED
yann@2410
   348
    else
yann@2410
   349
        cat <<-ENDSED
yann@2410
   350
			s/.*(ARCH_HAS_MMU).*/# \\1 is not set/
yann@2410
   351
			/.*(ARCH_USE_MMU).*/d
yann@2410
   352
			ENDSED
yann@2410
   353
    fi
yann@2410
   354
yann@850
   355
    # Accomodate for old and new uClibc version, where the
yann@850
   356
    # way to select between hard/soft float has changed
yann@2761
   357
    case "${CT_ARCH_FLOAT}" in
yann@2761
   358
        hard|softfp)
yann@2761
   359
            cat <<-ENDSED
yann@1674
   360
				s/^[^_]*(HAS_FPU).*/\\1=y/
yann@1674
   361
				s/.*(UCLIBC_HAS_FPU).*/\\1=y/
yann@1674
   362
				ENDSED
yann@850
   363
            ;;
yann@2761
   364
        soft)
yann@2761
   365
            cat <<-ENDSED
yann@1674
   366
				s/^[^_]*(HAS_FPU).*/\\# \\1 is not set/
yann@1674
   367
				s/.*(UCLIBC_HAS_FPU).*/# \\1 is not set/
yann@1674
   368
				ENDSED
yann@850
   369
            ;;
yann@850
   370
    esac
yann@850
   371
yann@2600
   372
    # We always want ctor/dtor
yann@2600
   373
    cat <<-ENDSED
yann@2600
   374
		s/^# (UCLIBC_CTOR_DTOR) is not set/\\1=y/
yann@2600
   375
		ENDSED
yann@2600
   376
yann@850
   377
    # Change paths to work with crosstool-NG
yann@850
   378
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
yann@850
   379
    #  " we just want the kernel headers, not the whole kernel source ...
yann@850
   380
    #  " so people may need to update their paths slightly
yann@850
   381
    quoted_kernel_source=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\/,g;')
yann@850
   382
    quoted_headers_dir=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/,\\/,g;')
yann@850
   383
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
yann@850
   384
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
yann@850
   385
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
yann@1674
   386
    # newer versions use KERNEL_HEADERS (which is right).
yann@1674
   387
    cat <<-ENDSED
yann@1674
   388
		s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
yann@1674
   389
		s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
yann@1674
   390
		s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
yann@1674
   391
		s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
yann@1674
   392
		s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
yann@1674
   393
		s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
yann@1674
   394
		ENDSED
yann@850
   395
yann@850
   396
    if [ "${CT_USE_PIPES}" = "y" ]; then
yann@850
   397
        if grep UCLIBC_EXTRA_CFLAGS extra/Configs/Config.in >/dev/null 2>&1; then
yann@850
   398
            # Good, there is special provision for such things as -pipe!
yann@1674
   399
            cat <<-ENDSED
yann@1674
   400
				s/^(UCLIBC_EXTRA_CFLAGS=".*)"$/\\1 -pipe"/
yann@1674
   401
				ENDSED
yann@850
   402
        else
yann@850
   403
            # Hack our -pipe into WARNINGS, which will be internally incorporated to
yann@850
   404
            # CFLAGS. This a dirty hack, but yet needed
yann@1674
   405
            cat <<-ENDSED
yann@1674
   406
				s/^(WARNINGS=".*)"$/\\1 -pipe"/
yann@1674
   407
				ENDSED
yann@850
   408
        fi
yann@850
   409
    fi
yann@850
   410
yann@1028
   411
    # Locales support
yann@850
   412
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
yann@850
   413
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
yann@850
   414
    # assume the user has already made all the appropriate generation
yann@850
   415
    # arrangements.  Note that having the uClibc Makefile download the
yann@850
   416
    # pregenerated locales is not compatible with crosstool; besides,
yann@850
   417
    # crosstool downloads them as part of getandpatch.sh.
yann@2036
   418
    case "${CT_LIBC_UCLIBC_LOCALES}:${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" in
yann@2036
   419
        :*)
yann@2036
   420
            ;;
yann@2036
   421
        y:)
yann@2036
   422
            cat <<-ENDSED
yann@2036
   423
				s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\
yann@2036
   424
				# UCLIBC_PREGENERATED_LOCALE_DATA is not set\\
yann@2036
   425
				# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\
yann@2036
   426
				# UCLIBC_HAS_XLOCALE is not set/
yann@2036
   427
				ENDSED
yann@2036
   428
            ;;
yann@2036
   429
        y:y)
yann@2036
   430
            cat <<-ENDSED
yann@2036
   431
				s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\
yann@2036
   432
				UCLIBC_PREGENERATED_LOCALE_DATA=y\\
yann@2036
   433
				# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\
yann@2036
   434
				# UCLIBC_HAS_XLOCALE is not set/
yann@2036
   435
				ENDSED
yann@2036
   436
            ;;
yann@2036
   437
    esac
yann@1028
   438
fpasch@1639
   439
    # WCHAR support
fpasch@1639
   440
    if [ "${CT_LIBC_UCLIBC_WCHAR}" = "y" ] ; then
yann@1674
   441
        cat <<-ENDSED
yann@1674
   442
			s/^.*UCLIBC_HAS_WCHAR.*/UCLIBC_HAS_WCHAR=y/
yann@1674
   443
			ENDSED
fpasch@1639
   444
    else
yann@1674
   445
        cat <<-ENDSED
yann@1674
   446
			s/^.*UCLIBC_HAS_WCHAR.*/UCLIBC_HAS_WCHAR=n/
yann@1674
   447
			ENDSED
fpasch@1639
   448
    fi
fpasch@1639
   449
yann@1028
   450
    # Force on options needed for C++ if we'll be making a C++ compiler.
yann@1028
   451
    # I'm not sure locales are a requirement for doing C++... Are they?
yann@850
   452
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
yann@1674
   453
        cat <<-ENDSED
yann@1674
   454
			s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
yann@1674
   455
			s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
yann@1674
   456
			ENDSED
yann@850
   457
    fi
yann@850
   458
yann@1977
   459
    # Push the threading model
yann@1977
   460
    # Note: we take into account all of the .28, .29, .30 and .31
yann@2009
   461
    #       versions, here. Even snapshots with NPTL.
yann@1977
   462
    case "${CT_THREADS}:${CT_LIBC_UCLIBC_LNXTHRD}" in
yann@2009
   463
        none:)
yann@1977
   464
            cat <<-ENDSED
yann@1977
   465
				s/^UCLIBC_HAS_THREADS=y/# UCLIBC_HAS_THREADS is not set/
yann@1977
   466
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
yann@1977
   467
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
yann@2009
   468
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
yann@1977
   469
				ENDSED
yann@1977
   470
            ;;
yann@2007
   471
        linuxthreads:old)
yann@1977
   472
            cat <<-ENDSED
yann@1977
   473
				s/^# UCLIBC_HAS_THREADS is not set/UCLIBC_HAS_THREADS=y/
yann@2007
   474
				s/^# LINUXTHREADS_OLD is not set/LINUXTHREADS_OLD=y/
yann@1977
   475
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
yann@2009
   476
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
yann@1977
   477
				ENDSED
yann@1977
   478
            ;;
yann@2007
   479
        linuxthreads:new)
yann@1977
   480
            cat <<-ENDSED
yann@1977
   481
				s/^# UCLIBC_HAS_THREADS is not set/UCLIBC_HAS_THREADS=y/
yann@1977
   482
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
yann@2007
   483
				s/^# LINUXTHREADS_NEW is not set/LINUXTHREADS_NEW=y/
yann@2009
   484
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
yann@1977
   485
				ENDSED
yann@1977
   486
            ;;
yann@2009
   487
        nptl:)
yann@2009
   488
            cat <<-ENDSED
yann@2009
   489
				s/^HAS_NO_THREADS=y/# HAS_NO_THREADS is not set/
yann@2009
   490
				s/^UCLIBC_HAS_THREADS=y/# UCLIBC_HAS_THREADS is not set/
yann@2009
   491
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
yann@2009
   492
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
yann@2009
   493
				s/^# UCLIBC_HAS_THREADS_NATIVE is not set/UCLIBC_HAS_THREADS_NATIVE=y/
yann@2009
   494
				ENDSED
yann@2009
   495
            ;;
yann@2009
   496
        *)
yann@2009
   497
            CT_Abort "Incorrect thread settings: CT_THREADS='${CT_THREAD}' CT_LIBC_UCLIBC_LNXTHRD='${CT_LIBC_UCLIBC_LNXTHRD}'"
yann@2009
   498
            ;;
yann@1977
   499
    esac
yann@1977
   500
yann@850
   501
    # Always build the libpthread_db
yann@1674
   502
    cat <<-ENDSED
yann@1674
   503
		s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1674
   504
		ENDSED
yann@850
   505
yann@850
   506
    # Force on debug options if asked for
yann@850
   507
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
yann@850
   508
      0)
yann@1674
   509
        cat <<-ENDSED
yann@1674
   510
			s/^DODEBUG=y/# DODEBUG is not set/
yann@1674
   511
			s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1674
   512
			s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1674
   513
			s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1674
   514
			s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@1674
   515
			s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1674
   516
			ENDSED
yann@850
   517
        ;;
yann@850
   518
      1)
yann@1674
   519
        cat <<-ENDSED
yann@1674
   520
			s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1674
   521
			s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1674
   522
			s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1674
   523
			s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1674
   524
			s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@1674
   525
			s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1674
   526
			ENDSED
yann@850
   527
        ;;
yann@850
   528
      2)
yann@1674
   529
        cat <<-ENDSED
yann@1674
   530
			s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1674
   531
			s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
yann@1674
   532
			s/^# DOASSERTS is not set.*/DOASSERTS=y/
yann@1674
   533
			s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
yann@1674
   534
			s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
yann@1674
   535
			s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
yann@1674
   536
			ENDSED
yann@850
   537
        ;;
yann@850
   538
    esac
yann@1674
   539
yann@1674
   540
    # And now, this is the end
yann@1674
   541
    ) >>"${munge_file}"
yann@1674
   542
yann@850
   543
    sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
yann@850
   544
}