scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Dec 31 16:23:27 2011 +0100 (2011-12-31)
changeset 2814 3dc2727ebffc
parent 2805 5625304f5bf3
child 2819 48cefdec12eb
permissions -rw-r--r--
cc/gcc: add option to use system zlib

In some cases, it might be desirable to use the system zlib

Eg. because latest gcc seem to be totally borked when it comes
to multilib, and tries to build a multilib host zlib, when it
is *absolutely* *not* needed: we want mulitlib on the target,
not on the host! Sigh... :-(

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