scripts/build/libc_uClibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed May 21 22:00:52 2008 +0000 (2008-05-21)
changeset 527 4ac12179ef23
parent 500 a8b11d75e253
child 578 8e39bc2e91b6
permissions -rw-r--r--
Introduce target-specific LDFLAGS, the same way we have CFLAGS for the target.
It seems to be helping gcc somewhat into telling the correct endianness to ld that sticks with little endian even when the target is big (eg armeb-unknown-linux-uclibcgnueabi).
There's still work to do, especially finish the gcc part that is not in this commit.

/trunk/scripts/functions | 9 7 2 0 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
yann@1
     1
# This file declares functions to install the uClibc C library
yann@1
     2
# Copyright 2007 Yann E. MORIN
yann@1
     3
# Licensed under the GPL v2. See COPYING in the root of this package
yann@1
     4
yann@161
     5
do_print_filename() {
yann@161
     6
    [ "${CT_LIBC}" = "uClibc" ] || return 0
yann@164
     7
    echo "uClibc-${CT_LIBC_VERSION}"
yann@161
     8
    [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ] && echo "uClibc-locale-030818" || true
yann@161
     9
}
yann@161
    10
yann@63
    11
# Download uClibc
yann@63
    12
do_libc_get() {
yann@486
    13
    libc_src="http://www.uclibc.org/downloads
yann@63
    14
              http://www.uclibc.org/downloads/snapshots
yann@63
    15
              http://www.uclibc.org/downloads/old-releases"
yann@63
    16
    # For uClibc, we have almost every thing: releases, and snapshots
yann@63
    17
    # for the last month or so. We'll have to deal with svn revisions
yann@63
    18
    # later...
yann@63
    19
    CT_GetFile "${CT_LIBC_FILE}" ${libc_src}
yann@63
    20
    # uClibc locales
yann@161
    21
    [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ] && CT_GetFile "uClibc-locale-030818" ${libc_src} || true
yann@64
    22
yann@64
    23
    return 0
yann@63
    24
}
yann@63
    25
yann@63
    26
# Extract uClibc
yann@63
    27
do_libc_extract() {
yann@63
    28
    CT_ExtractAndPatch "${CT_LIBC_FILE}"
yann@63
    29
    # uClibc locales
yann@161
    30
    [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ] && CT_ExtractAndPatch "uClibc-locale-030818" || true
yann@64
    31
yann@64
    32
    return 0
yann@63
    33
}
yann@1
    34
yann@1
    35
# Check that uClibc has been previously configured
yann@1
    36
do_libc_check_config() {
yann@1
    37
    CT_DoStep INFO "Checking C library configuration"
yann@1
    38
yann@1
    39
    CT_TestOrAbort "You did not provide a uClibc config file!" -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" -a -f "${CT_LIBC_UCLIBC_CONFIG_FILE}"
yann@1
    40
yann@1
    41
    if egrep '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then
yann@1
    42
        CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad."
yann@1
    43
        CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade."
yann@1
    44
    fi
yann@1
    45
yann@1
    46
    CT_DoLog EXTRA "Munging uClibc configuration"
yann@297
    47
    mungeuClibcConfig "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_BUILD_DIR}/uClibc.config"
yann@1
    48
yann@1
    49
    CT_EndStep
yann@1
    50
}
yann@1
    51
yann@1
    52
# This functions installs uClibc's headers
yann@1
    53
do_libc_headers() {
yann@1
    54
    # Only need to install bootstrap uClibc headers for gcc-3.0 and above?  Or maybe just gcc-3.3 and above?
yann@1
    55
    # See also http://gcc.gnu.org/PR8180, which complains about the need for this step.
yann@331
    56
    grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_FILE}/ChangeLog" 2>/dev/null || return 0
yann@1
    57
yann@1
    58
    CT_DoStep INFO "Installing C library headers"
yann@1
    59
yann@1
    60
    mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
yann@1
    61
    cd "${CT_BUILD_DIR}/build-libc-headers"
yann@1
    62
yann@1
    63
    # Simply copy files until uClibc has the ablity to build out-of-tree
yann@1
    64
    CT_DoLog EXTRA "Copying sources to build dir"
yann@1
    65
    { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf -
yann@1
    66
yann@1
    67
    # Retrieve the config file
yann@297
    68
    cp "${CT_BUILD_DIR}/uClibc.config" .config
yann@1
    69
yann@1
    70
    # uClibc uses the CROSS environment variable as a prefix to the
yann@1
    71
    # compiler tools to use.  Setting it to the empty string forces
yann@1
    72
    # use of the native build host tools, which we need at this
yann@1
    73
    # stage, as we don't have target tools yet.
yann@1
    74
    CT_DoLog EXTRA "Applying configuration"
yann@78
    75
    CT_DoYes "" |make CROSS= PREFIX="${CT_SYSROOT_DIR}/" oldconfig 2>&1 |CT_DoLog ALL
yann@1
    76
yann@1
    77
    CT_DoLog EXTRA "Building headers"
yann@500
    78
    make ${CT_LIBC_UCLIBC_VERBOSITY} CROSS= PREFIX="${CT_SYSROOT_DIR}/" headers 2>&1 |CT_DoLog ALL
yann@1
    79
yann@1
    80
    CT_DoLog EXTRA "Installing headers"
yann@500
    81
    make ${CT_LIBC_UCLIBC_VERBOSITY} CROSS= PREFIX="${CT_SYSROOT_DIR}/" install_dev 2>&1 |CT_DoLog ALL
yann@1
    82
yann@1
    83
    CT_EndStep
yann@1
    84
}
yann@1
    85
yann@136
    86
# Build and install start files
yann@136
    87
do_libc_start_files() {
yann@136
    88
    :
yann@136
    89
}
yann@136
    90
yann@1
    91
# This function build and install the full uClibc
yann@1
    92
do_libc() {
yann@1
    93
    CT_DoStep INFO "Installing C library"
yann@1
    94
yann@1
    95
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@1
    96
    cd "${CT_BUILD_DIR}/build-libc"
yann@1
    97
yann@1
    98
    # Simply copy files until uClibc has the ablity to build out-of-tree
yann@1
    99
    CT_DoLog EXTRA "Copying sources to build dir"
yann@1
   100
    { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf -
yann@1
   101
yann@1
   102
    # Retrieve the config file
yann@297
   103
    cp "${CT_BUILD_DIR}/uClibc.config" .config
yann@1
   104
yann@1
   105
    # uClibc uses the CROSS environment variable as a prefix to the compiler
yann@1
   106
    # tools to use.  The newly built tools should be in our path, so we need
yann@1
   107
    # only give the correct name for them.
yann@1
   108
    # Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
yann@1
   109
    # depending  on the configuration of the library. That is, they are tailored
yann@1
   110
    # to best fit the target. So it is useless and seems to be a bad thing to
yann@1
   111
    # use LIBC_EXTRA_CFLAGS here.
yann@1
   112
    CT_DoLog EXTRA "Applying configuration"
yann@212
   113
    CT_DoYes "" |make CROSS=${CT_TARGET}-           \
yann@1
   114
                      PREFIX="${CT_SYSROOT_DIR}/"   \
yann@78
   115
                      oldconfig                     2>&1 |CT_DoLog ALL
yann@1
   116
yann@1
   117
    # We do _not_ want to strip anything for now, in case we specifically
yann@1
   118
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
yann@1
   119
    CT_DoLog EXTRA "Building C library"
yann@211
   120
    make CROSS=${CT_TARGET}-            \
yann@1
   121
         PREFIX="${CT_SYSROOT_DIR}/"    \
yann@1
   122
         STRIPTOOL=true                 \
yann@500
   123
         ${CT_LIBC_UCLIBC_VERBOSITY}    \
yann@78
   124
         all                            2>&1 |CT_DoLog ALL
yann@1
   125
yann@1
   126
    # YEM-FIXME: we want to install libraries in $SYSROOT/lib, but we don't want
yann@1
   127
    # to install headers in $SYSROOT/include, thus making only install_runtime.
yann@1
   128
    # Plus, the headers were previously installed earlier with install_dev, so
yann@1
   129
    # all should be well. Unfortunately, the install_dev target does not install
yann@1
   130
    # crti.o and consorts... :-( So reverting to target 'install'.
yann@1
   131
    # Note: PARALLELMFLAGS is not usefull for installation.
yann@1
   132
    # We do _not_ want to strip anything for now, in case we specifically
yann@1
   133
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
yann@1
   134
    CT_DoLog EXTRA "Installing C library"
yann@1
   135
    make CROSS=${CT_TARGET}-            \
yann@1
   136
         PREFIX="${CT_SYSROOT_DIR}/"    \
yann@1
   137
         STRIPTOOL=true                 \
yann@500
   138
         ${CT_LIBC_UCLIBC_VERBOSITY}    \
yann@78
   139
         install                        2>&1 |CT_DoLog ALL
yann@1
   140
yann@1
   141
    CT_EndStep
yann@1
   142
}
yann@1
   143
yann@1
   144
# This function is used to install those components needing the final C compiler
yann@1
   145
do_libc_finish() {
yann@78
   146
    :
yann@1
   147
}
yann@1
   148
yann@1
   149
# Initialises the .config file to sensible values
yann@297
   150
# $1: original file
yann@297
   151
# $2: munged file
yann@1
   152
mungeuClibcConfig() {
yann@297
   153
    src_config_file="$1"
yann@297
   154
    dst_config_file="$2"
yann@1
   155
    munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed"
yann@1
   156
yann@297
   157
    echo -n >"${munge_file}"
yann@297
   158
yann@108
   159
    # Hack our target in the config file.
yann@108
   160
    # Also remove stripping: its the responsibility of the
yann@108
   161
    # firmware builder to strip or not.
yann@297
   162
    cat >>"${munge_file}" <<-ENDSED
yann@1
   163
s/^(TARGET_.*)=y$/# \\1 is not set/
yann@1
   164
s/^# TARGET_${CT_KERNEL_ARCH} is not set/TARGET_${CT_KERNEL_ARCH}=y/
yann@1
   165
s/^TARGET_ARCH=".*"/TARGET_ARCH="${CT_KERNEL_ARCH}"/
yann@108
   166
s/.*(DOSTRIP).*/# \\1 is not set/
yann@1
   167
ENDSED
yann@1
   168
yann@397
   169
    # Ah. We may one day need architecture-specific handler here...
yann@397
   170
    # Hack the ARM {E,O}ABI into the config file
yann@397
   171
    if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
yann@397
   172
        cat >>"${munge_file}" <<-ENDSED
yann@397
   173
s/.*(CONFIG_ARM_OABI).*/# \\1 is not set/
yann@397
   174
s/.*(CONFIG_ARM_EABI).*/\\1=y/
yann@397
   175
ENDSED
yann@397
   176
    else
yann@397
   177
        cat >>"${munge_file}" <<-ENDSED
yann@397
   178
s/.*(CONFIG_ARM_OABI).*/\\1=y/
yann@397
   179
s/.*(CONFIG_ARM_EABI).*/# \\1 is not set/
yann@397
   180
ENDSED
yann@397
   181
    fi
yann@397
   182
yann@108
   183
    # Accomodate for old and new uClibc versions, where the
yann@108
   184
    # way to select between big/little endian has changed
yann@1
   185
    case "${CT_ARCH_BE},${CT_ARCH_LE}" in
yann@297
   186
        y,) cat >>"${munge_file}" <<-ENDSED
yann@108
   187
s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1
   188
s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
yann@108
   189
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/# \\1 is not set/
yann@108
   190
s/.*(ARCH_WANTS_BIG_ENDIAN).*/\\1=y/
yann@1
   191
ENDSED
yann@1
   192
        ;;
yann@297
   193
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@108
   194
s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
yann@1
   195
s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
yann@108
   196
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/\\1=y/
yann@108
   197
s/.*(ARCH_WANTS_BIG_ENDIAN).*/# \\1 is not set/
yann@1
   198
ENDSED
yann@1
   199
        ;;
yann@1
   200
    esac
yann@1
   201
yann@108
   202
    # Accomodate for old and new uClibc version, where the
yann@108
   203
    # way to select between hard/soft float has changed
yann@1
   204
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@297
   205
        y,) cat >>"${munge_file}" <<-ENDSED
yann@497
   206
s/^[^_]*(HAS_FPU).*/\\1=y/
yann@108
   207
s/.*(UCLIBC_HAS_FPU).*/\\1=y/
yann@1
   208
ENDSED
yann@1
   209
            ;;
yann@297
   210
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@497
   211
s/^[^_]*(HAS_FPU).*/\\# \\1 is not set/
yann@108
   212
s/.*(UCLIBC_HAS_FPU).*/# \\1 is not set/
yann@1
   213
ENDSED
yann@1
   214
            ;;
yann@1
   215
    esac
yann@1
   216
yann@397
   217
    # Change paths to work with crosstool-NG
yann@1
   218
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
yann@1
   219
    #  " we just want the kernel headers, not the whole kernel source ...
yann@1
   220
    #  " so people may need to update their paths slightly
yann@523
   221
    quoted_kernel_source=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\/,g;')
yann@523
   222
    quoted_headers_dir=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/,\\/,g;')
yann@1
   223
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
yann@1
   224
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
yann@1
   225
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
yann@1
   226
    # newer versions use KERNEL_HEADERS (which is right). See:
yann@297
   227
    cat >>"${munge_file}" <<-ENDSED
yann@1
   228
s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
yann@1
   229
s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
yann@1
   230
s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
yann@1
   231
s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
yann@1
   232
s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
yann@1
   233
s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
yann@1
   234
ENDSED
yann@1
   235
yann@1
   236
    if [ "${CT_USE_PIPES}" = "y" ]; then
yann@108
   237
        if grep UCLIBC_EXTRA_CFLAGS extra/Configs/Config.in >/dev/null 2>&1; then
yann@108
   238
            # Good, there is special provision for such things as -pipe!
yann@297
   239
            cat >>"${munge_file}" <<-ENDSED
yann@108
   240
s/^(UCLIBC_EXTRA_CFLAGS=".*)"$/\\1 -pipe"/
yann@108
   241
ENDSED
yann@108
   242
        else
yann@108
   243
            # Hack our -pipe into WARNINGS, which will be internally incorporated to
yann@108
   244
            # CFLAGS. This a dirty hack, but yet needed
yann@108
   245
            cat >> "${munge_file}" <<-ENDSED
yann@1
   246
s/^(WARNINGS=".*)"$/\\1 -pipe"/
yann@1
   247
ENDSED
yann@108
   248
        fi
yann@1
   249
    fi
yann@1
   250
yann@1
   251
    # Force on options needed for C++ if we'll be making a C++ compiler.
yann@1
   252
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
yann@1
   253
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
yann@1
   254
    # assume the user has already made all the appropriate generation
yann@1
   255
    # arrangements.  Note that having the uClibc Makefile download the
yann@1
   256
    # pregenerated locales is not compatible with crosstool; besides,
yann@1
   257
    # crosstool downloads them as part of getandpatch.sh.
yann@1
   258
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
yann@297
   259
        cat >>"${munge_file}" <<-ENDSED
yann@1
   260
s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
yann@1
   261
s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/
yann@1
   262
# Add these three lines when doing C++?
yann@1
   263
#s/^# UCLIBC_HAS_WCHAR is not set/UCLIBC_HAS_WCHAR=y/
yann@1
   264
#s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\nUCLIBC_PREGENERATED_LOCALE_DATA=y\\n\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\n\\# UCLIBC_HAS_XLOCALE is not set/
yann@1
   265
#s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
yann@1
   266
ENDSED
yann@1
   267
    fi
yann@1
   268
yann@1
   269
    # Force on debug options if asked for
yann@1
   270
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
yann@1
   271
      0)
yann@1
   272
        cat >>"${munge_file}" <<-ENDSED
yann@1
   273
s/^PTHREADS_DEBUG_SUPPORT=y/# PTHREADS_DEBUG_SUPPORT is not set/
yann@1
   274
s/^DODEBUG=y/# DODEBUG is not set/
yann@1
   275
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   276
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   277
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   278
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@108
   279
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1
   280
ENDSED
yann@1
   281
        ;;
yann@1
   282
      1)
yann@1
   283
        cat >>"${munge_file}" <<-ENDSED
yann@1
   284
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1
   285
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   286
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   287
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   288
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   289
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@108
   290
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1
   291
ENDSED
yann@1
   292
        ;;
yann@1
   293
      2)
yann@1
   294
        cat >>"${munge_file}" <<-ENDSED
yann@1
   295
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1
   296
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   297
s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
yann@1
   298
s/^# DOASSERTS is not set.*/DOASSERTS=y/
yann@1
   299
s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
yann@1
   300
s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
yann@108
   301
s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
yann@1
   302
ENDSED
yann@1
   303
        ;;
yann@1
   304
    esac
yann@297
   305
    sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
yann@1
   306
}