scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Aug 19 00:52:05 2011 +0200 (2011-08-19)
branch1.12
changeset 2633 22e779b0a4ed
parent 2542 5efe494cf718
child 2585 45ef0b0660a5
child 2711 c5c8fd92fde9
permissions -rw-r--r--
scripts: simplify and fix the toolchain config script

The script that is installed, and which sole purpose is to dump
the .config that was used to build the toolchain, is pure insanity.

Let's make it much, much more simpler...

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