scripts/build/libc_uClibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
parent 378 c5691d002539
child 486 92f6149c4275
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
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@63
    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@212
    78
    make CROSS= PREFIX="${CT_SYSROOT_DIR}/" headers 2>&1 |CT_DoLog ALL
yann@1
    79
yann@1
    80
    CT_DoLog EXTRA "Installing headers"
yann@78
    81
    make 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@78
   123
         all                            2>&1 |CT_DoLog ALL
yann@1
   124
yann@1
   125
    # YEM-FIXME: we want to install libraries in $SYSROOT/lib, but we don't want
yann@1
   126
    # to install headers in $SYSROOT/include, thus making only install_runtime.
yann@1
   127
    # Plus, the headers were previously installed earlier with install_dev, so
yann@1
   128
    # all should be well. Unfortunately, the install_dev target does not install
yann@1
   129
    # crti.o and consorts... :-( So reverting to target 'install'.
yann@1
   130
    # Note: PARALLELMFLAGS is not usefull for installation.
yann@1
   131
    # We do _not_ want to strip anything for now, in case we specifically
yann@1
   132
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
yann@1
   133
    CT_DoLog EXTRA "Installing C library"
yann@1
   134
    make CROSS=${CT_TARGET}-            \
yann@1
   135
         PREFIX="${CT_SYSROOT_DIR}/"    \
yann@1
   136
         STRIPTOOL=true                 \
yann@78
   137
         install                        2>&1 |CT_DoLog ALL
yann@1
   138
yann@1
   139
    CT_EndStep
yann@1
   140
}
yann@1
   141
yann@1
   142
# This function is used to install those components needing the final C compiler
yann@1
   143
do_libc_finish() {
yann@78
   144
    :
yann@1
   145
}
yann@1
   146
yann@1
   147
# Initialises the .config file to sensible values
yann@297
   148
# $1: original file
yann@297
   149
# $2: munged file
yann@1
   150
mungeuClibcConfig() {
yann@297
   151
    src_config_file="$1"
yann@297
   152
    dst_config_file="$2"
yann@1
   153
    munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed"
yann@1
   154
yann@297
   155
    echo -n >"${munge_file}"
yann@297
   156
yann@108
   157
    # Hack our target in the config file.
yann@108
   158
    # Also remove stripping: its the responsibility of the
yann@108
   159
    # firmware builder to strip or not.
yann@297
   160
    cat >>"${munge_file}" <<-ENDSED
yann@1
   161
s/^(TARGET_.*)=y$/# \\1 is not set/
yann@1
   162
s/^# TARGET_${CT_KERNEL_ARCH} is not set/TARGET_${CT_KERNEL_ARCH}=y/
yann@1
   163
s/^TARGET_ARCH=".*"/TARGET_ARCH="${CT_KERNEL_ARCH}"/
yann@108
   164
s/.*(DOSTRIP).*/# \\1 is not set/
yann@1
   165
ENDSED
yann@1
   166
yann@397
   167
    # Ah. We may one day need architecture-specific handler here...
yann@397
   168
    # Hack the ARM {E,O}ABI into the config file
yann@397
   169
    if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
yann@397
   170
        cat >>"${munge_file}" <<-ENDSED
yann@397
   171
s/.*(CONFIG_ARM_OABI).*/# \\1 is not set/
yann@397
   172
s/.*(CONFIG_ARM_EABI).*/\\1=y/
yann@397
   173
ENDSED
yann@397
   174
    else
yann@397
   175
        cat >>"${munge_file}" <<-ENDSED
yann@397
   176
s/.*(CONFIG_ARM_OABI).*/\\1=y/
yann@397
   177
s/.*(CONFIG_ARM_EABI).*/# \\1 is not set/
yann@397
   178
ENDSED
yann@397
   179
    fi
yann@397
   180
yann@108
   181
    # Accomodate for old and new uClibc versions, where the
yann@108
   182
    # way to select between big/little endian has changed
yann@1
   183
    case "${CT_ARCH_BE},${CT_ARCH_LE}" in
yann@297
   184
        y,) cat >>"${munge_file}" <<-ENDSED
yann@108
   185
s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1
   186
s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
yann@108
   187
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/# \\1 is not set/
yann@108
   188
s/.*(ARCH_WANTS_BIG_ENDIAN).*/\\1=y/
yann@1
   189
ENDSED
yann@1
   190
        ;;
yann@297
   191
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@108
   192
s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
yann@1
   193
s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
yann@108
   194
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/\\1=y/
yann@108
   195
s/.*(ARCH_WANTS_BIG_ENDIAN).*/# \\1 is not set/
yann@1
   196
ENDSED
yann@1
   197
        ;;
yann@1
   198
    esac
yann@1
   199
yann@108
   200
    # Accomodate for old and new uClibc version, where the
yann@108
   201
    # way to select between hard/soft float has changed
yann@1
   202
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@297
   203
        y,) cat >>"${munge_file}" <<-ENDSED
yann@378
   204
s/[^_]*(HAS_FPU).*/\\1=y/
yann@108
   205
s/.*(UCLIBC_HAS_FPU).*/\\1=y/
yann@1
   206
ENDSED
yann@1
   207
            ;;
yann@297
   208
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@378
   209
s/[^_]*(HAS_FPU).*/\\# \\1 is not set/
yann@108
   210
s/.*(UCLIBC_HAS_FPU).*/# \\1 is not set/
yann@1
   211
ENDSED
yann@1
   212
            ;;
yann@1
   213
    esac
yann@1
   214
yann@397
   215
    # Change paths to work with crosstool-NG
yann@1
   216
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
yann@1
   217
    #  " we just want the kernel headers, not the whole kernel source ...
yann@1
   218
    #  " so people may need to update their paths slightly
yann@1
   219
    quoted_kernel_source=`echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\\\/,g;'`
yann@1
   220
    quoted_headers_dir=`echo ${CT_HEADERS_DIR} | sed -r -e 's,/,\\\\/,g;'`
yann@1
   221
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
yann@1
   222
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
yann@1
   223
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
yann@1
   224
    # newer versions use KERNEL_HEADERS (which is right). See:
yann@297
   225
    cat >>"${munge_file}" <<-ENDSED
yann@1
   226
s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
yann@1
   227
s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
yann@1
   228
s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
yann@1
   229
s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
yann@1
   230
s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
yann@1
   231
s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
yann@1
   232
ENDSED
yann@1
   233
yann@1
   234
    if [ "${CT_USE_PIPES}" = "y" ]; then
yann@108
   235
        if grep UCLIBC_EXTRA_CFLAGS extra/Configs/Config.in >/dev/null 2>&1; then
yann@108
   236
            # Good, there is special provision for such things as -pipe!
yann@297
   237
            cat >>"${munge_file}" <<-ENDSED
yann@108
   238
s/^(UCLIBC_EXTRA_CFLAGS=".*)"$/\\1 -pipe"/
yann@108
   239
ENDSED
yann@108
   240
        else
yann@108
   241
            # Hack our -pipe into WARNINGS, which will be internally incorporated to
yann@108
   242
            # CFLAGS. This a dirty hack, but yet needed
yann@108
   243
            cat >> "${munge_file}" <<-ENDSED
yann@1
   244
s/^(WARNINGS=".*)"$/\\1 -pipe"/
yann@1
   245
ENDSED
yann@108
   246
        fi
yann@1
   247
    fi
yann@1
   248
yann@1
   249
    # Force on options needed for C++ if we'll be making a C++ compiler.
yann@1
   250
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
yann@1
   251
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
yann@1
   252
    # assume the user has already made all the appropriate generation
yann@1
   253
    # arrangements.  Note that having the uClibc Makefile download the
yann@1
   254
    # pregenerated locales is not compatible with crosstool; besides,
yann@1
   255
    # crosstool downloads them as part of getandpatch.sh.
yann@1
   256
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
yann@297
   257
        cat >>"${munge_file}" <<-ENDSED
yann@1
   258
s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
yann@1
   259
s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/
yann@1
   260
# Add these three lines when doing C++?
yann@1
   261
#s/^# UCLIBC_HAS_WCHAR is not set/UCLIBC_HAS_WCHAR=y/
yann@1
   262
#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
   263
#s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
yann@1
   264
ENDSED
yann@1
   265
    fi
yann@1
   266
yann@1
   267
    # Force on debug options if asked for
yann@1
   268
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
yann@1
   269
      0)
yann@1
   270
        cat >>"${munge_file}" <<-ENDSED
yann@1
   271
s/^PTHREADS_DEBUG_SUPPORT=y/# PTHREADS_DEBUG_SUPPORT is not set/
yann@1
   272
s/^DODEBUG=y/# DODEBUG is not set/
yann@1
   273
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   274
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   275
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   276
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@108
   277
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1
   278
ENDSED
yann@1
   279
        ;;
yann@1
   280
      1)
yann@1
   281
        cat >>"${munge_file}" <<-ENDSED
yann@1
   282
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1
   283
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   284
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   285
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   286
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   287
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@108
   288
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@1
   289
ENDSED
yann@1
   290
        ;;
yann@1
   291
      2)
yann@1
   292
        cat >>"${munge_file}" <<-ENDSED
yann@1
   293
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1
   294
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   295
s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
yann@1
   296
s/^# DOASSERTS is not set.*/DOASSERTS=y/
yann@1
   297
s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
yann@1
   298
s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
yann@108
   299
s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
yann@1
   300
ENDSED
yann@1
   301
        ;;
yann@1
   302
    esac
yann@297
   303
    sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
yann@1
   304
}