scripts/build/libc/glibc-eglibc.sh-common
author Michael Hope <michael.hope@linaro.org>
Wed Oct 19 15:27:32 2011 +1300 (2011-10-19)
changeset 2739 f320e22f2cba
parent 2737 b5179235b925
child 2765 6c5658b8b588
permissions -rw-r--r--
arch: add softfp support

Some architectures support a mixed hard/soft floating point, where
the compiler emits hardware floating point instructions, but passes
the operands in core (aka integer) registers.

For example, ARM supports this mode (to come in the next changeset).

Add support for softfp cross compilers to the GCC and GLIBC
configuration. Needed for Ubuntu and other distros that are softfp.

Signed-off-by: Michael Hope <michael.hope@linaro.org>
[yann.morin.1998@anciens.enib.fr: split the original patch]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     1 # This file contains the functions common to glibc and eglibc
     2 
     3 # Extract the C library tarball(s)
     4 do_libc_extract() {
     5     local addon
     6 
     7     # Extract the main tarball
     8     CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}"
     9     CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
    10     CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}"
    11 
    12     # Extract the add-opns
    13     for addon in $(do_libc_add_ons_list " "); do
    14         # If the addon was bundled with the main archive, we do not
    15         # need to extract it. Worse, if we were to try to extract
    16         # it, we'd get an error.
    17         if [ -d "${addon}" ]; then
    18             CT_DoLog DEBUG "Add-on already present, spkipping extraction"
    19             continue
    20         fi
    21 
    22         CT_Extract nochdir "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    23 
    24         CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \
    25             -d "${addon}" -a -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    26 
    27         # Some addons have the 'long' name, while others have the
    28         # 'short' name, but patches are non-uniformly built with
    29         # either the 'long' or 'short' name, whatever the addons name
    30         # but we prefer the 'short' name and avoid duplicates.
    31         if [ -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ]; then
    32             CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}"
    33         fi
    34 
    35         CT_DoExecLog FILE ln -s "${addon}" "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    36 
    37         CT_Patch nochdir "${CT_LIBC}" "${addon}-${CT_LIBC_VERSION}"
    38 
    39         # Remove the long name since it can confuse configure scripts to run
    40         # the same source twice.
    41         rm "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
    42     done
    43 
    44     # The configure files may be older than the configure.in files
    45     # if using a snapshot (or even some tarballs). Fake them being
    46     # up to date.
    47     find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
    48 
    49     CT_Popd
    50 
    51     if [ "${CT_LIBC_LOCALES}" = "y" ]; then
    52         do_libc_locales_extract
    53     fi
    54 }
    55 
    56 # Build and install headers and start files
    57 do_libc_start_files() {
    58     # Start files and Headers should be configured the same way as the
    59     # final libc, but built and installed differently.
    60     do_libc_backend libc_mode=startfiles
    61 }
    62 
    63 # This function builds and install the full C library
    64 do_libc() {
    65     do_libc_backend libc_mode=final
    66 }
    67 
    68 do_libc_backend() {
    69     local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
    70     local libc_mode=final
    71     local extra_cc_args
    72     local -a extra_config
    73     local -a extra_make_args
    74     local glibc_cflags
    75 
    76     while [ $# -ne 0 ]; do
    77         eval "${1// /\\ }"
    78         shift
    79     done
    80 
    81     if [ "${libc_mode}" = "startfiles" ]; then
    82         CT_DoStep INFO "Installing C library headers & start files"
    83         mkdir -p "${CT_BUILD_DIR}/build-libc-start-files"
    84         cd "${CT_BUILD_DIR}/build-libc-start-files"
    85     else # libc_mode = final
    86         CT_DoStep INFO "Installing C library"
    87         mkdir -p "${CT_BUILD_DIR}/build-libc"
    88         cd "${CT_BUILD_DIR}/build-libc"
    89     fi
    90 
    91     CT_DoLog EXTRA "Configuring C library"
    92 
    93     case "${CT_LIBC}" in
    94         eglibc)
    95             if [ "${CT_EGLIBC_CUSTOM_CONFIG}" = "y" ]; then
    96                 CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/eglibc.config" option-groups.config
    97             fi
    98             if [ "${CT_EGLIBC_OPT_SIZE}" = "y" ]; then
    99                 OPTIMIZE=-Os
   100             else
   101                 OPTIMIZE=-O2
   102             fi
   103             ;;
   104         glibc)
   105             # glibc can't be built without -O2 (reference needed!)
   106             OPTIMIZE=-O2
   107             # Also, if those two are missing, iconv build breaks
   108             extra_config+=( --disable-debug --disable-sanity-checks )
   109             ;;
   110     esac
   111 
   112     # Add some default glibc config options if not given by user.
   113     # We don't need to be conditional on wether the user did set different
   114     # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
   115     # extra_config
   116 
   117     extra_config+=("$(do_libc_min_kernel_config)")
   118 
   119     case "${CT_THREADS}" in
   120         nptl)           extra_config+=("--with-__thread" "--with-tls");;
   121         linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
   122         none)           extra_config+=("--without-__thread" "--without-nptl")
   123                         case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   124                             *-tls*) ;;
   125                             *) extra_config+=("--without-tls");;
   126                         esac
   127                         ;;
   128     esac
   129 
   130     case "${CT_SHARED_LIBS}" in
   131         y) extra_config+=("--enable-shared");;
   132         *) extra_config+=("--disable-shared");;
   133     esac
   134 
   135     case "${CT_ARCH_FLOAT}" in
   136         hard)   extra_config+=("--with-fp");;
   137         soft)   extra_config+=("--without-fp");;
   138         softfp) extra_config+=("--with-fp");;
   139     esac
   140 
   141     if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
   142         extra_config+=("--disable-versioning")
   143     fi
   144 
   145     if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
   146         extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
   147     fi
   148 
   149     case "$(do_libc_add_ons_list ,)" in
   150         "") extra_config+=("--enable-add-ons=no");;
   151         *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
   152     esac
   153 
   154     if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   155         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   156         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   157     fi
   158 
   159     extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
   160 
   161     touch config.cache
   162     if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
   163         echo "libc_cv_forced_unwind=yes" >>config.cache
   164         echo "libc_cv_c_cleanup=yes" >>config.cache
   165     fi
   166 
   167     # Pre-seed the configparms file with values from the config option
   168     printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
   169 
   170     cross_cc=$(CT_Which "${CT_TARGET}-gcc")
   171 
   172     CT_DoLog DEBUG "Using gcc for target:     '${cross_cc}'"
   173     CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
   174     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
   175     CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
   176 
   177     glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE}"
   178     case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
   179         y)  ;;
   180         *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
   181     esac
   182 
   183     # ./configure is mislead by our tools override wrapper for bash
   184     # so just tell it where the real bash is _on_the_target_!
   185     # Notes:
   186     # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
   187     # - ${BASH_SHELL}            is only used to set BASH
   188     # - ${BASH}                  is only used to set the shebang
   189     #                            in two scripts to run on the target
   190     # So we can safely bypass bash detection at compile time.
   191     # Should this change in a future eglibc release, we'd better
   192     # directly mangle the generated scripts _after_ they get built,
   193     # or even after they get installed... eglibc is such a sucker...
   194     echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
   195 
   196     # Configure with --prefix the way we want it on the target...
   197     # There are a whole lot of settings here.  You'll probably want
   198     # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
   199     # Compare these options with the ones used when installing the glibc headers above - they're different.
   200     # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
   201     # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
   202     # Set BUILD_CC, or we won't be able to build datafiles
   203     # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
   204     # when the shell is not bash... Sigh... :-(
   205 
   206     CT_DoExecLog CFG                                                \
   207     BUILD_CC="${CT_BUILD}-gcc"                                      \
   208     CFLAGS="${glibc_cflags}"                                        \
   209     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
   210     AR=${CT_TARGET}-ar                                              \
   211     RANLIB=${CT_TARGET}-ranlib                                      \
   212     "${CONFIG_SHELL}"                                               \
   213     "${src_dir}/configure"                                          \
   214         --prefix=/usr                                               \
   215         --build=${CT_BUILD}                                         \
   216         --host=${CT_TARGET}                                         \
   217         --cache-file="$(pwd)/config.cache"                          \
   218         --without-cvs                                               \
   219         --disable-profile                                           \
   220         --without-gd                                                \
   221         --with-headers="${CT_HEADERS_DIR}"                          \
   222         "${extra_config[@]}"                                        \
   223         "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
   224 
   225     # build hacks
   226     case "${CT_ARCH},${CT_ARCH_CPU}" in
   227         powerpc,8??)
   228             # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
   229             CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
   230             extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
   231             ;;
   232     esac
   233 
   234     if [ "${libc_mode}" = "startfiles" ]; then
   235         CT_DoLog EXTRA "Installing C library headers"
   236 
   237         # use the 'install-headers' makefile target to install the
   238         # headers
   239         CT_DoExecLog ALL make ${JOBSFLAGS}              \
   240                          install_root=${CT_SYSROOT_DIR} \
   241                          install-bootstrap-headers=yes  \
   242                          "${extra_make_args[@]}"        \
   243                          install-headers
   244 
   245         # For glibc, a few headers need to be manually installed
   246         if [ "${CT_LIBC}" = "glibc" ]; then
   247             # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
   248             # so do them by hand.  We can tolerate an empty stubs.h for the moment.
   249             # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
   250             mkdir -p "${CT_HEADERS_DIR}/gnu"
   251             CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
   252             CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
   253                                    "${CT_HEADERS_DIR}/features.h"
   254 
   255             # Building the bootstrap gcc requires either setting inhibit_libc, or
   256             # having a copy of stdio_lim.h... see
   257             # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
   258             CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
   259 
   260             # Following error building gcc-4.0.0's gcj:
   261             #  error: bits/syscall.h: No such file or directory
   262             # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
   263             # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
   264             case "${CT_ARCH}" in
   265                 arm)    ;;
   266                 *)  CT_DoExecLog ALL cp -v "misc/syscall-list.h"            \
   267                                            "${CT_HEADERS_DIR}/bits/syscall.h"
   268                     ;;
   269             esac
   270         fi
   271 
   272         if [ "${CT_THREADS}" = "nptl" ]; then
   273             CT_DoLog EXTRA "Installing C library start files"
   274 
   275             # there are a few object files needed to link shared libraries,
   276             # which we build and install by hand
   277             CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
   278             CT_DoExecLog ALL make ${JOBSFLAGS}  \
   279                         "${extra_make_args[@]}" \
   280                         csu/subdir_lib
   281             CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
   282                                 "${CT_SYSROOT_DIR}/usr/lib"
   283 
   284             # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
   285             # However, since we will never actually execute its code,
   286             # it doesn't matter what it contains.  So, treating '/dev/null'
   287             # as a C source file, we produce a dummy 'libc.so' in one step
   288             CT_DoExecLog ALL "${cross_cc}" -nostdlib        \
   289                                            -nostartfiles    \
   290                                            -shared          \
   291                                            -x c /dev/null   \
   292                                            -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
   293         fi # threads == nptl
   294     else # libc_mode = final
   295         CT_DoLog EXTRA "Building C library"
   296         CT_DoExecLog ALL make ${JOBSFLAGS}                      \
   297                               "${extra_make_args[@]}"           \
   298                               all
   299 
   300         CT_DoLog EXTRA "Installing C library"
   301         CT_DoExecLog ALL make ${JOBSFLAGS}                      \
   302                               "${extra_make_args[@]}"           \
   303                               install_root="${CT_SYSROOT_DIR}"  \
   304                               install
   305 
   306         if [ "${CT_LIBC_LOCALES}" = "y" ]; then
   307             do_libc_locales
   308         fi
   309     fi
   310 
   311     CT_EndStep
   312 }
   313 
   314 # This function finishes the C library install
   315 # This is a no-op
   316 do_libc_finish() {
   317     :
   318 }
   319 
   320 # Build up the addons list, separated with $1
   321 do_libc_add_ons_list() {
   322     local sep="$1"
   323     local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
   324                           |sed -r -e "s/[[:space:],]/${sep}/g;" \
   325                         )"
   326     case "${CT_THREADS}" in
   327         none)   ;;
   328         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   329     esac
   330     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   331     # Remove duplicate, leading and trailing separators
   332     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   333 }
   334 
   335 # Compute up the minimum supported Linux kernel version
   336 do_libc_min_kernel_config() {
   337     local min_kernel_config
   338 
   339     case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   340         *--enable-kernel*) ;;
   341         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   342                 # We can't rely on the kernel version from the configuration,
   343                 # because it might not be available if the user uses pre-installed
   344                 # headers. On the other hand, both method will have the kernel
   345                 # version installed in "usr/include/linux/version.h" in the sysroot.
   346                 # Parse that instead of having two code-paths.
   347                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   348                 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
   349                     CT_Abort "Linux version is unavailable in installed headers files"
   350                 fi
   351                 version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
   352                                  |cut -d ' ' -f 3                                   \
   353                                )"
   354                 version=$(((version_code>>16)&0xFF))
   355                 patchlevel=$(((version_code>>8)&0xFF))
   356                 sublevel=$((version_code&0xFF))
   357                 min_kernel_config="${version}.${patchlevel}.${sublevel}"
   358             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   359                 # Trim the fourth part of the linux version, keeping only the first three numbers
   360                 min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
   361                                       |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
   362                                     )"
   363             fi
   364             echo "--enable-kernel=${min_kernel_config}"
   365             ;;
   366     esac
   367 }