scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Jan 22 23:20:18 2011 +0100 (2011-01-22)
changeset 2305 2ed26c646568
parent 2279 a559d9890c02
child 2312 8b9938edd3d8
permissions -rw-r--r--
scripts: create the makeinfo wrapper before we set PATH

If we set PATH to the tools wrappers before we create the
makeinfo wrapper, then we may well wrap an existing wrapper
from a previous run.

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