scripts/build/libc/glibc-eglibc.sh-common
author "Benoît THÉBAUDEAU" <benoit.thebaudeau@advansee.com>
Tue May 31 20:12:35 2011 +0200 (2011-05-31)
changeset 2487 481cd34691f0
parent 2467 200836977ce6
child 2489 b7c9f410704f
permissions -rw-r--r--
gcc: promote PKGVERSION and BUGURL options to toolchain level

This patch promotes the PKGVERSION and BUGURL options to toolchain level so that
all toolchain components supporting them can benefit from them.

These options are passed to configure through --with-pkgversion and
--with-bugurl.

They are supported by binutils 2.18+, gcc 4.3+, eglibc 2.9+ and gdb 7.0+.

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