scripts/build/libc/glibc-eglibc.sh-common
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Sep 21 22:42:35 2011 +0200 (2011-09-21)
changeset 2677 7df89370f805
parent 2585 45ef0b0660a5
child 2699 28a97cb454e2
permissions -rw-r--r--
kernel/linux: add alternate download locations

Since kernel.org is dead, and there is no announced or known estimated
time or return to normality, it is impossible to download any kernel at
this time.

Add a known-working mirror.

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