scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed May 18 23:00:46 2011 +0200 (2011-05-18)
changeset 2467 200836977ce6
parent 2466 b7df125a1c78
child 2483 fa3a18f9abcf
permissions -rw-r--r--
config: rename variables that are arrays

Make it explicit that a variable is an array bu the name of the variable.
It will be used later when .config gets munged to allow both multiple
arguments and arguments with spaces at the same time to be passed from the
configuration down to the build scripts.

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