scripts/build/libc_uClibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue May 01 16:49:15 2007 +0000 (2007-05-01)
changeset 56 07a6a48962b7
child 63 89b41dbffe8d
permissions -rw-r--r--
Merge patches sent by Robert P. J. Day <rpjday@mindspring.com>.
Warning: the buildroot folks purposedly removed the skip-comment patch but didn't really said why. Keeping it for the sake of having it in svn just in case (removing it will be easier thant not having it at all).
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@1
     5
yann@1
     6
# Check that uClibc has been previously configured
yann@1
     7
do_libc_check_config() {
yann@1
     8
    CT_DoStep INFO "Checking C library configuration"
yann@1
     9
yann@1
    10
    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
    11
yann@1
    12
    cp "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_BUILD_DIR}/uClibc.config"
yann@1
    13
yann@1
    14
    if egrep '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then
yann@1
    15
        CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad."
yann@1
    16
        CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade."
yann@1
    17
    fi
yann@1
    18
yann@1
    19
    CT_DoLog EXTRA "Munging uClibc configuration"
yann@1
    20
    mungeuClibcConfig "${CT_BUILD_DIR}/uClibc.config"
yann@1
    21
yann@1
    22
    CT_EndStep
yann@1
    23
}
yann@1
    24
yann@1
    25
# This functions installs uClibc's headers
yann@1
    26
do_libc_headers() {
yann@1
    27
    # Only need to install bootstrap uClibc headers for gcc-3.0 and above?  Or maybe just gcc-3.3 and above?
yann@1
    28
    # See also http://gcc.gnu.org/PR8180, which complains about the need for this step.
yann@1
    29
    grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/ChangeLog" || return 0
yann@1
    30
yann@1
    31
    CT_DoStep INFO "Installing C library headers"
yann@1
    32
yann@1
    33
    mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
yann@1
    34
    cd "${CT_BUILD_DIR}/build-libc-headers"
yann@1
    35
yann@1
    36
    # Simply copy files until uClibc has the ablity to build out-of-tree
yann@1
    37
    CT_DoLog EXTRA "Copying sources to build dir"
yann@1
    38
    { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf -
yann@1
    39
yann@1
    40
    # Retrieve the config file
yann@1
    41
    cp "${CT_BUILD_DIR}/uClibc.config" .config
yann@1
    42
yann@1
    43
    # uClibc uses the CROSS environment variable as a prefix to the
yann@1
    44
    # compiler tools to use.  Setting it to the empty string forces
yann@1
    45
    # use of the native build host tools, which we need at this
yann@1
    46
    # stage, as we don't have target tools yet.
yann@1
    47
    CT_DoLog EXTRA "Applying configuration"
yann@1
    48
    CT_DoYes "" |make CROSS= PREFIX="${CT_SYSROOT_DIR}/" oldconfig 2>&1 |CT_DoLog DEBUG
yann@1
    49
yann@1
    50
    CT_DoLog EXTRA "Building headers"
yann@1
    51
    make ${PARALLELMFLAGS} CROSS= PREFIX="${CT_SYSROOT_DIR}/" headers 2>&1 |CT_DoLog DEBUG
yann@1
    52
yann@1
    53
    CT_DoLog EXTRA "Installing headers"
yann@1
    54
    make CROSS= PREFIX="${CT_SYSROOT_DIR}/" install_dev 2>&1 |CT_DoLog DEBUG
yann@1
    55
yann@1
    56
    CT_EndStep
yann@1
    57
}
yann@1
    58
yann@1
    59
# This function build and install the full uClibc
yann@1
    60
do_libc() {
yann@1
    61
    CT_DoStep INFO "Installing C library"
yann@1
    62
yann@1
    63
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@1
    64
    cd "${CT_BUILD_DIR}/build-libc"
yann@1
    65
yann@1
    66
    # Simply copy files until uClibc has the ablity to build out-of-tree
yann@1
    67
    CT_DoLog EXTRA "Copying sources to build dir"
yann@1
    68
    { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf -
yann@1
    69
yann@1
    70
    # Retrieve the config file
yann@1
    71
    cp "${CT_BUILD_DIR}/uClibc.config" .config
yann@1
    72
yann@1
    73
    # uClibc uses the CROSS environment variable as a prefix to the compiler
yann@1
    74
    # tools to use.  The newly built tools should be in our path, so we need
yann@1
    75
    # only give the correct name for them.
yann@1
    76
    # Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
yann@1
    77
    # depending  on the configuration of the library. That is, they are tailored
yann@1
    78
    # to best fit the target. So it is useless and seems to be a bad thing to
yann@1
    79
    # use LIBC_EXTRA_CFLAGS here.
yann@1
    80
    CT_DoLog EXTRA "Applying configuration"
yann@1
    81
    CT_DoYes "" |make ${PARALLELMFLAGS}             \
yann@1
    82
                      CROSS=${CT_TARGET}-           \
yann@1
    83
                      PREFIX="${CT_SYSROOT_DIR}/"   \
yann@1
    84
                      oldconfig                     2>&1 |CT_DoLog DEBUG
yann@1
    85
yann@1
    86
    # We do _not_ want to strip anything for now, in case we specifically
yann@1
    87
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
yann@1
    88
    CT_DoLog EXTRA "Building C library"
yann@1
    89
    make ${PARALLELMFLAGS}              \
yann@1
    90
         CROSS=${CT_TARGET}-            \
yann@1
    91
         PREFIX="${CT_SYSROOT_DIR}/"    \
yann@1
    92
         STRIPTOOL=true                 \
yann@1
    93
         all                            2>&1 |CT_DoLog DEBUG
yann@1
    94
yann@1
    95
    # YEM-FIXME: we want to install libraries in $SYSROOT/lib, but we don't want
yann@1
    96
    # to install headers in $SYSROOT/include, thus making only install_runtime.
yann@1
    97
    # Plus, the headers were previously installed earlier with install_dev, so
yann@1
    98
    # all should be well. Unfortunately, the install_dev target does not install
yann@1
    99
    # crti.o and consorts... :-( So reverting to target 'install'.
yann@1
   100
    # Note: PARALLELMFLAGS is not usefull for installation.
yann@1
   101
    # We do _not_ want to strip anything for now, in case we specifically
yann@1
   102
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
yann@1
   103
    CT_DoLog EXTRA "Installing C library"
yann@1
   104
    make CROSS=${CT_TARGET}-            \
yann@1
   105
         PREFIX="${CT_SYSROOT_DIR}/"    \
yann@1
   106
         STRIPTOOL=true                 \
yann@1
   107
         install                        2>&1 |CT_DoLog DEBUG
yann@1
   108
yann@1
   109
    CT_EndStep
yann@1
   110
}
yann@1
   111
yann@1
   112
# This function is used to install those components needing the final C compiler
yann@1
   113
do_libc_finish() {
yann@1
   114
    CT_DoStep INFO "Finishing C library"
yann@1
   115
    # uClibc has nothing to finish
yann@1
   116
    CT_DoLog EXTRA "uClibc has nothing to finish"
yann@1
   117
    CT_EndStep
yann@1
   118
}
yann@1
   119
yann@1
   120
# Initialises the .config file to sensible values
yann@1
   121
mungeuClibcConfig() {
yann@1
   122
    config_file="$1"
yann@1
   123
    munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed"
yann@1
   124
yann@1
   125
    cat > "${munge_file}" <<-ENDSED
yann@1
   126
s/^(TARGET_.*)=y$/# \\1 is not set/
yann@1
   127
s/^# TARGET_${CT_KERNEL_ARCH} is not set/TARGET_${CT_KERNEL_ARCH}=y/
yann@1
   128
s/^TARGET_ARCH=".*"/TARGET_ARCH="${CT_KERNEL_ARCH}"/
yann@1
   129
ENDSED
yann@1
   130
yann@1
   131
    case "${CT_ARCH_BE},${CT_ARCH_LE}" in
yann@1
   132
        y,) cat >> "${munge_file}" <<-ENDSED
yann@1
   133
s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
yann@1
   134
s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
yann@1
   135
ENDSED
yann@1
   136
        ;;
yann@1
   137
        ,y) cat >> "${munge_file}" <<-ENDSED
yann@1
   138
s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
yann@1
   139
s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
yann@1
   140
ENDSED
yann@1
   141
        ;;
yann@1
   142
    esac
yann@1
   143
yann@1
   144
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@1
   145
        y,) cat >> "${munge_file}" <<-ENDSED
yann@1
   146
s/.*(HAS_FPU).*/\\1=y/
yann@1
   147
ENDSED
yann@1
   148
            ;;
yann@1
   149
        ,y) cat >> "${munge_file}" <<-ENDSED
yann@1
   150
s/.*(HAS_FPU).*/\\# \\1 is not set/
yann@1
   151
ENDSED
yann@1
   152
            ;;
yann@1
   153
    esac
yann@1
   154
yann@1
   155
    # Change paths to work with crosstool
yann@1
   156
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
yann@1
   157
    #  " we just want the kernel headers, not the whole kernel source ...
yann@1
   158
    #  " so people may need to update their paths slightly
yann@1
   159
    quoted_kernel_source=`echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\\\/,g;'`
yann@1
   160
    quoted_headers_dir=`echo ${CT_HEADERS_DIR} | sed -r -e 's,/,\\\\/,g;'`
yann@1
   161
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
yann@1
   162
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
yann@1
   163
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
yann@1
   164
    # newer versions use KERNEL_HEADERS (which is right). See:
yann@1
   165
    cat >> "${munge_file}" <<-ENDSED
yann@1
   166
s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
yann@1
   167
s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
yann@1
   168
s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
yann@1
   169
s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
yann@1
   170
s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
yann@1
   171
s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
yann@1
   172
ENDSED
yann@1
   173
yann@1
   174
    # Hack our -pipe into WARNINGS, which will be internally incorporated to
yann@1
   175
    # CFLAGS. This a dirty hack, but yet needed
yann@1
   176
    if [ "${CT_USE_PIPES}" = "y" ]; then
yann@1
   177
        cat >> "${munge_file}" <<-ENDSED
yann@1
   178
s/^(WARNINGS=".*)"$/\\1 -pipe"/
yann@1
   179
ENDSED
yann@1
   180
    fi
yann@1
   181
yann@1
   182
    # Force on options needed for C++ if we'll be making a C++ compiler.
yann@1
   183
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
yann@1
   184
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
yann@1
   185
    # assume the user has already made all the appropriate generation
yann@1
   186
    # arrangements.  Note that having the uClibc Makefile download the
yann@1
   187
    # pregenerated locales is not compatible with crosstool; besides,
yann@1
   188
    # crosstool downloads them as part of getandpatch.sh.
yann@1
   189
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
yann@1
   190
        cat >> "${munge_file}" <<-ENDSED
yann@1
   191
s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
yann@1
   192
s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/
yann@1
   193
# Add these three lines when doing C++?
yann@1
   194
#s/^# UCLIBC_HAS_WCHAR is not set/UCLIBC_HAS_WCHAR=y/
yann@1
   195
#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
   196
#s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
yann@1
   197
ENDSED
yann@1
   198
    fi
yann@1
   199
yann@1
   200
    # Force on debug options if asked for
yann@1
   201
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
yann@1
   202
      0)
yann@1
   203
        cat >>"${munge_file}" <<-ENDSED
yann@1
   204
s/^PTHREADS_DEBUG_SUPPORT=y/# PTHREADS_DEBUG_SUPPORT is not set/
yann@1
   205
s/^DODEBUG=y/# DODEBUG is not set/
yann@1
   206
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   207
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   208
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   209
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@1
   210
ENDSED
yann@1
   211
        ;;
yann@1
   212
      1)
yann@1
   213
        cat >>"${munge_file}" <<-ENDSED
yann@1
   214
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1
   215
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   216
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@1
   217
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@1
   218
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@1
   219
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@1
   220
ENDSED
yann@1
   221
        ;;
yann@1
   222
      2)
yann@1
   223
        cat >>"${munge_file}" <<-ENDSED
yann@1
   224
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@1
   225
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@1
   226
s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
yann@1
   227
s/^# DOASSERTS is not set.*/DOASSERTS=y/
yann@1
   228
s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
yann@1
   229
s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
yann@1
   230
ENDSED
yann@1
   231
        ;;
yann@1
   232
    esac
yann@1
   233
    sed -r -i -f "${munge_file}" "${config_file}"
yann@1
   234
    rm -f "${munge_file}"
yann@1
   235
}