scripts/build/libc/uClibc.sh
author Daniel Price <daniel.price@gmail.com>
Tue Nov 20 16:59:17 2012 -0800 (2012-11-20)
changeset 3126 333d3e40cbd1
parent 3099 79169596cfc9
child 3162 e51eb0a614c7
permissions -rw-r--r--
scripts: refine static linking check to better guide the user

The current mechanism to check if static linking is possible, and the mesage
displayed on failure, can be puzzling to the unsuspecting user.

Also, the current implementation is not using the existing infrastructure,
and is thus difficult to enhance with new tests.

So, switch to using the standard CT_DoExecLog infra, and use four tests to
check for the host compiler:
- check we can run it
- check it can build a trivial program
- check it can statically link that program
- check if it statically link with libstdc++

That should cover most of the problems. Hopefully.

(At the same time, fix a typo in a comment)

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