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