scripts/build/libc_uClibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 13 10:32:38 2008 +0000 (2008-07-13)
changeset 645 8e58024f8e37
parent 580 26f13900b099
child 661 74e8be702b1d
permissions -rw-r--r--
Ioannis E. VENETIS <venetis@mail.capsl.udel.edu> pointed out that GMP and MPFR were not used by gcc.
Turned out that none could use GMP and MPFR as the config option changed its name, but the change was not propagated to all users.

/trunk/scripts/build/binutils.sh | 2 1 1 0 +-
/trunk/scripts/build/debug/300-gdb.sh | 2 1 1 0 +-
/trunk/scripts/build/cc_gcc.sh | 6 3 3 0 +++---
3 files changed, 5 insertions(+), 5 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@642
   157
    # Start with a fresh file
yann@642
   158
    rm -f "${munge_file}"
yann@642
   159
    touch "${munge_file}"
yann@297
   160
yann@108
   161
    # Hack our target in the config file.
yann@108
   162
    # Also remove stripping: its the responsibility of the
yann@108
   163
    # firmware builder to strip or not.
yann@297
   164
    cat >>"${munge_file}" <<-ENDSED
yann@1
   165
s/^(TARGET_.*)=y$/# \\1 is not set/
yann@1
   166
s/^# TARGET_${CT_KERNEL_ARCH} is not set/TARGET_${CT_KERNEL_ARCH}=y/
yann@1
   167
s/^TARGET_ARCH=".*"/TARGET_ARCH="${CT_KERNEL_ARCH}"/
yann@108
   168
s/.*(DOSTRIP).*/# \\1 is not set/
yann@1
   169
ENDSED
yann@1
   170
yann@397
   171
    # Ah. We may one day need architecture-specific handler here...
yann@397
   172
    # Hack the ARM {E,O}ABI into the config file
yann@397
   173
    if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
yann@397
   174
        cat >>"${munge_file}" <<-ENDSED
yann@397
   175
s/.*(CONFIG_ARM_OABI).*/# \\1 is not set/
yann@397
   176
s/.*(CONFIG_ARM_EABI).*/\\1=y/
yann@397
   177
ENDSED
yann@397
   178
    else
yann@397
   179
        cat >>"${munge_file}" <<-ENDSED
yann@397
   180
s/.*(CONFIG_ARM_OABI).*/\\1=y/
yann@397
   181
s/.*(CONFIG_ARM_EABI).*/# \\1 is not set/
yann@397
   182
ENDSED
yann@397
   183
    fi
yann@397
   184
yann@108
   185
    # Accomodate for old and new uClibc versions, where the
yann@108
   186
    # way to select between big/little endian has changed
yann@1
   187
    case "${CT_ARCH_BE},${CT_ARCH_LE}" in
yann@297
   188
        y,) cat >>"${munge_file}" <<-ENDSED
yann@108
   189
s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1
   190
s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
yann@108
   191
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/# \\1 is not set/
yann@108
   192
s/.*(ARCH_WANTS_BIG_ENDIAN).*/\\1=y/
yann@1
   193
ENDSED
yann@1
   194
        ;;
yann@297
   195
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@108
   196
s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
yann@1
   197
s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
yann@108
   198
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/\\1=y/
yann@108
   199
s/.*(ARCH_WANTS_BIG_ENDIAN).*/# \\1 is not set/
yann@1
   200
ENDSED
yann@1
   201
        ;;
yann@1
   202
    esac
yann@1
   203
yann@108
   204
    # Accomodate for old and new uClibc version, where the
yann@108
   205
    # way to select between hard/soft float has changed
yann@1
   206
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@297
   207
        y,) cat >>"${munge_file}" <<-ENDSED
yann@497
   208
s/^[^_]*(HAS_FPU).*/\\1=y/
yann@108
   209
s/.*(UCLIBC_HAS_FPU).*/\\1=y/
yann@1
   210
ENDSED
yann@1
   211
            ;;
yann@297
   212
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@497
   213
s/^[^_]*(HAS_FPU).*/\\# \\1 is not set/
yann@108
   214
s/.*(UCLIBC_HAS_FPU).*/# \\1 is not set/
yann@1
   215
ENDSED
yann@1
   216
            ;;
yann@1
   217
    esac
yann@1
   218
yann@397
   219
    # Change paths to work with crosstool-NG
yann@1
   220
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
yann@1
   221
    #  " we just want the kernel headers, not the whole kernel source ...
yann@1
   222
    #  " so people may need to update their paths slightly
yann@523
   223
    quoted_kernel_source=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\/,g;')
yann@523
   224
    quoted_headers_dir=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/,\\/,g;')
yann@1
   225
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
yann@1
   226
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
yann@1
   227
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
yann@1
   228
    # newer versions use KERNEL_HEADERS (which is right). See:
yann@297
   229
    cat >>"${munge_file}" <<-ENDSED
yann@1
   230
s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
yann@1
   231
s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
yann@1
   232
s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
yann@1
   233
s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
yann@1
   234
s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
yann@1
   235
s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
yann@1
   236
ENDSED
yann@1
   237
yann@1
   238
    if [ "${CT_USE_PIPES}" = "y" ]; then
yann@108
   239
        if grep UCLIBC_EXTRA_CFLAGS extra/Configs/Config.in >/dev/null 2>&1; then
yann@108
   240
            # Good, there is special provision for such things as -pipe!
yann@297
   241
            cat >>"${munge_file}" <<-ENDSED
yann@108
   242
s/^(UCLIBC_EXTRA_CFLAGS=".*)"$/\\1 -pipe"/
yann@108
   243
ENDSED
yann@108
   244
        else
yann@108
   245
            # Hack our -pipe into WARNINGS, which will be internally incorporated to
yann@108
   246
            # CFLAGS. This a dirty hack, but yet needed
yann@108
   247
            cat >> "${munge_file}" <<-ENDSED
yann@1
   248
s/^(WARNINGS=".*)"$/\\1 -pipe"/
yann@1
   249
ENDSED
yann@108
   250
        fi
yann@1
   251
    fi
yann@1
   252
yann@1
   253
    # Force on options needed for C++ if we'll be making a C++ compiler.
yann@1
   254
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
yann@1
   255
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
yann@1
   256
    # assume the user has already made all the appropriate generation
yann@1
   257
    # arrangements.  Note that having the uClibc Makefile download the
yann@1
   258
    # pregenerated locales is not compatible with crosstool; besides,
yann@1
   259
    # crosstool downloads them as part of getandpatch.sh.
yann@1
   260
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
yann@297
   261
        cat >>"${munge_file}" <<-ENDSED
yann@1
   262
s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
yann@1
   263
s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/
yann@1
   264
# Add these three lines when doing C++?
yann@580
   265
s/^# UCLIBC_HAS_WCHAR is not set/UCLIBC_HAS_WCHAR=y/
yann@1
   266
#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@580
   267
s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
yann@1
   268
ENDSED
yann@1
   269
    fi
yann@1
   270
yann@578
   271
    # Always build the libpthread_db
yann@578
   272
    cat >>"${munge_file}" <<-ENDSED
yann@578
   273
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@578
   274
ENDSED
yann@578
   275
yann@1
   276
    # Force on debug options if asked for
yann@1
   277
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
yann@1
   278
      0)
yann@1
   279
        cat >>"${munge_file}" <<-ENDSED
yann@1
   280
s/^DODEBUG=y/# DODEBUG is not set/
yann@1
   281
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   282
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   283
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   284
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@108
   285
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1
   286
ENDSED
yann@1
   287
        ;;
yann@1
   288
      1)
yann@1
   289
        cat >>"${munge_file}" <<-ENDSED
yann@1
   290
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   291
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   292
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   293
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   294
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@108
   295
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1
   296
ENDSED
yann@1
   297
        ;;
yann@1
   298
      2)
yann@1
   299
        cat >>"${munge_file}" <<-ENDSED
yann@1
   300
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   301
s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
yann@1
   302
s/^# DOASSERTS is not set.*/DOASSERTS=y/
yann@1
   303
s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
yann@1
   304
s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
yann@108
   305
s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
yann@1
   306
ENDSED
yann@1
   307
        ;;
yann@1
   308
    esac
yann@297
   309
    sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
yann@1
   310
}