scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Apr 06 22:30:57 2011 +0200 (2011-04-06)
changeset 2381 0ca0f85a4b2a
parent 2314 9e1a17fdf363
child 2466 b7df125a1c78
permissions -rw-r--r--
complibs: disable building shared libs

Managing the shared version of the companion libraries
has become cumbersome.

Also, it will one day be possible to use the companion
libraries from the host distribution, and then we will
be able to easily use either shared or static libs.

As a side note, while working on the canadian-rework
series, it has become quite more complex to properly
handle shared companion libraries, as they need to be
built both for the build and gost systems. That's not
easy to handle. At all.

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 is passed after extra_config
   155 
   156     extra_config+=("$(do_libc_min_kernel_config)")
   157 
   158     case "${CT_THREADS}" in
   159         nptl)           extra_config+=("--with-__thread" "--with-tls");;
   160         linuxthreads)   extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
   161         none)           extra_config+=("--without-__thread" "--without-nptl")
   162                         case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
   163                             *-tls*) ;;
   164                             *) extra_config+=("--without-tls");;
   165                         esac
   166                         ;;
   167     esac
   168 
   169     case "${CT_SHARED_LIBS}" in
   170         y) extra_config+=("--enable-shared");;
   171         *) extra_config+=("--disable-shared");;
   172     esac
   173 
   174     case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
   175         y,) extra_config+=("--with-fp");;
   176         ,y) extra_config+=("--without-fp");;
   177     esac
   178 
   179     if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
   180         extra_config+=("--disable-versioning")
   181     fi
   182 
   183     if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
   184         extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
   185     fi
   186 
   187     case "$(do_libc_add_ons_list ,)" in
   188         "") ;;
   189         *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
   190     esac
   191 
   192     extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
   193 
   194     touch config.cache
   195     if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
   196         echo "libc_cv_forced_unwind=yes" >>config.cache
   197         echo "libc_cv_c_cleanup=yes" >>config.cache
   198     fi
   199 
   200     # Pre-seed the configparms file with values from the config option
   201     printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
   202 
   203     cross_cc=$(CT_Which "${CT_TARGET}-gcc")    
   204 
   205     CT_DoLog DEBUG "Using gcc for target:     '${cross_cc}'"
   206     CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
   207     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
   208     CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
   209 
   210     glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE}"
   211     case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
   212         y)  ;;
   213         *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
   214     esac
   215 
   216     # ./configure is mislead by our tools override wrapper for bash
   217     # so just tell it where the real bash is _on_the_target_!
   218     # Notes:
   219     # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
   220     # - ${BASH_SHELL}            is only used to set BASH
   221     # - ${BASH}                  is only used to set the shebang
   222     #                            in two scripts to run on the target
   223     # So we can safely bypass bash detection at compile time.
   224     # Should this change in a future eglibc release, we'd better
   225     # directly mangle the generated scripts _after_ they get built,
   226     # or even after they get installed... eglibc is such a sucker...
   227     echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
   228 
   229     # Configure with --prefix the way we want it on the target...
   230     # There are a whole lot of settings here.  You'll probably want
   231     # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
   232     # Compare these options with the ones used when installing the glibc headers above - they're different.
   233     # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
   234     # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
   235     # Set BUILD_CC, or we won't be able to build datafiles
   236 
   237     CT_DoExecLog CFG                                                \
   238     BUILD_CC="${CT_BUILD}-gcc"                                      \
   239     CFLAGS="${glibc_cflags}"                                        \
   240     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
   241     AR=${CT_TARGET}-ar                                              \
   242     RANLIB=${CT_TARGET}-ranlib                                      \
   243     "${src_dir}/configure"                                          \
   244         --prefix=/usr                                               \
   245         --build=${CT_BUILD}                                         \
   246         --host=${CT_TARGET}                                         \
   247         --cache-file="$(pwd)/config.cache"                          \
   248         --without-cvs                                               \
   249         --disable-profile                                           \
   250         --without-gd                                                \
   251         --with-headers="${CT_HEADERS_DIR}"                          \
   252         "${extra_config[@]}"                                        \
   253         ${CT_LIBC_GLIBC_EXTRA_CONFIG}
   254     
   255     # build hacks
   256     case "${CT_ARCH},${CT_ARCH_CPU}" in
   257         powerpc,8??)
   258             # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
   259             CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
   260             extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
   261             ;;
   262     esac
   263 
   264     CT_DoLog EXTRA "Building C library"
   265     CT_DoExecLog ALL make ${JOBSFLAGS}                      \
   266                           "${extra_make_args[@]}"           \
   267                           all
   268 
   269     CT_DoLog EXTRA "Installing C library"
   270     CT_DoExecLog ALL make ${JOBSFLAGS}                      \
   271                           "${extra_make_args[@]}"           \
   272                           install_root="${CT_SYSROOT_DIR}"  \
   273                           install
   274 
   275     CT_EndStep
   276 }
   277 
   278 # This function finishes the C library install
   279 # This is a no-op
   280 do_libc_finish() {
   281     :
   282 }
   283 
   284 # Build up the addons list, separated with $1
   285 do_libc_add_ons_list() {
   286     local sep="$1"
   287     local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
   288                           |sed -r -e "s/[[:space:],]/${sep}/g;" \
   289                         )"
   290     case "${CT_THREADS}" in
   291         none)   ;;
   292         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   293     esac
   294     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   295     # Remove duplicate, leading and trailing separators
   296     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   297 }
   298 
   299 # Compute up the minimum supported Linux kernel version
   300 do_libc_min_kernel_config() {
   301     local min_kernel_config
   302 
   303     case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
   304         *--enable-kernel*) ;;
   305         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   306                 # We can't rely on the kernel version from the configuration,
   307                 # because it might not be available if the user uses pre-installed
   308                 # headers. On the other hand, both method will have the kernel
   309                 # version installed in "usr/include/linux/version.h" in the sysroot.
   310                 # Parse that instead of having two code-paths.
   311                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   312                 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
   313                     CT_Abort "Linux version is unavailable in installed headers files"
   314                 fi
   315                 version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
   316                                  |cut -d ' ' -f 3                                   \
   317                                )"
   318                 version=$(((version_code>>16)&0xFF))
   319                 patchlevel=$(((version_code>>8)&0xFF))
   320                 sublevel=$((version_code&0xFF))
   321                 min_kernel_config="${version}.${patchlevel}.${sublevel}"
   322             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   323                 # Trim the fourth part of the linux version, keeping only the first three numbers
   324                 min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
   325                                       |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
   326                                     )"
   327             fi
   328             echo "--enable-kernel=${min_kernel_config}"
   329             ;;
   330     esac
   331 }