scripts/build/libc/glibc-eglibc.sh-common
author Michael Hope <michael.hope@linaro.org>
Wed Nov 16 10:06:21 2011 +1300 (2011-11-16)
changeset 2765 6c5658b8b588
parent 2739 f320e22f2cba
child 2805 5625304f5bf3
permissions -rw-r--r--
scripts: add support for building manuals

Add support for building the HTML and PDF manuals for the major
components. Implement for binutils, GCC, GDB, and GLIBC.

Always build all manuals and install a subset. Be explicit about the
subset to reduce the clutter and to avoid getting copies of common
manuals like bfd from all of the sourceware based components. Downside of
being explicit is that you need to update it when a new component
comes along.

Build the manuals as part of the last GCC build, namely 'cc' for glibc
based ones and cc_core_pass_2 for baremetal.

An example of the output is at:
http://people.linaro.org/~michaelh/incoming/crosstool-NG/

Signed-off-by: Michael Hope <michael.hope@linaro.org>
[yann.morin.1998@anciens.enib.fr: depends on ! remove docs; gold manual install]
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             CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}"
    33         fi
    34 
    35         CT_DoExecLog FILE 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}" in
   136         hard)   extra_config+=("--with-fp");;
   137         soft)   extra_config+=("--without-fp");;
   138         softfp) extra_config+=("--with-fp");;
   139     esac
   140 
   141     if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
   142         extra_config+=("--disable-versioning")
   143     fi
   144 
   145     if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
   146         extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
   147     fi
   148 
   149     case "$(do_libc_add_ons_list ,)" in
   150         "") extra_config+=("--enable-add-ons=no");;
   151         *)  extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
   152     esac
   153 
   154     if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   155         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   156         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   157     fi
   158 
   159     extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
   160 
   161     touch config.cache
   162     if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
   163         echo "libc_cv_forced_unwind=yes" >>config.cache
   164         echo "libc_cv_c_cleanup=yes" >>config.cache
   165     fi
   166 
   167     # Pre-seed the configparms file with values from the config option
   168     printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
   169 
   170     cross_cc=$(CT_Which "${CT_TARGET}-gcc")
   171 
   172     CT_DoLog DEBUG "Using gcc for target:     '${cross_cc}'"
   173     CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
   174     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
   175     CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
   176 
   177     glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE}"
   178     case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
   179         y)  ;;
   180         *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
   181     esac
   182 
   183     # ./configure is mislead by our tools override wrapper for bash
   184     # so just tell it where the real bash is _on_the_target_!
   185     # Notes:
   186     # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
   187     # - ${BASH_SHELL}            is only used to set BASH
   188     # - ${BASH}                  is only used to set the shebang
   189     #                            in two scripts to run on the target
   190     # So we can safely bypass bash detection at compile time.
   191     # Should this change in a future eglibc release, we'd better
   192     # directly mangle the generated scripts _after_ they get built,
   193     # or even after they get installed... eglibc is such a sucker...
   194     echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
   195 
   196     # Configure with --prefix the way we want it on the target...
   197     # There are a whole lot of settings here.  You'll probably want
   198     # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
   199     # Compare these options with the ones used when installing the glibc headers above - they're different.
   200     # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
   201     # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
   202     # Set BUILD_CC, or we won't be able to build datafiles
   203     # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
   204     # when the shell is not bash... Sigh... :-(
   205 
   206     CT_DoExecLog CFG                                                \
   207     BUILD_CC="${CT_BUILD}-gcc"                                      \
   208     CFLAGS="${glibc_cflags}"                                        \
   209     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
   210     AR=${CT_TARGET}-ar                                              \
   211     RANLIB=${CT_TARGET}-ranlib                                      \
   212     "${CONFIG_SHELL}"                                               \
   213     "${src_dir}/configure"                                          \
   214         --prefix=/usr                                               \
   215         --build=${CT_BUILD}                                         \
   216         --host=${CT_TARGET}                                         \
   217         --cache-file="$(pwd)/config.cache"                          \
   218         --without-cvs                                               \
   219         --disable-profile                                           \
   220         --without-gd                                                \
   221         --with-headers="${CT_HEADERS_DIR}"                          \
   222         "${extra_config[@]}"                                        \
   223         "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
   224 
   225     # build hacks
   226     case "${CT_ARCH},${CT_ARCH_CPU}" in
   227         powerpc,8??)
   228             # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
   229             CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
   230             extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
   231             ;;
   232     esac
   233 
   234     if [ "${libc_mode}" = "startfiles" ]; then
   235         CT_DoLog EXTRA "Installing C library headers"
   236 
   237         # use the 'install-headers' makefile target to install the
   238         # headers
   239         CT_DoExecLog ALL make ${JOBSFLAGS}              \
   240                          install_root=${CT_SYSROOT_DIR} \
   241                          install-bootstrap-headers=yes  \
   242                          "${extra_make_args[@]}"        \
   243                          install-headers
   244 
   245         # For glibc, a few headers need to be manually installed
   246         if [ "${CT_LIBC}" = "glibc" ]; then
   247             # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
   248             # so do them by hand.  We can tolerate an empty stubs.h for the moment.
   249             # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
   250             mkdir -p "${CT_HEADERS_DIR}/gnu"
   251             CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
   252             CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h"  \
   253                                    "${CT_HEADERS_DIR}/features.h"
   254 
   255             # Building the bootstrap gcc requires either setting inhibit_libc, or
   256             # having a copy of stdio_lim.h... see
   257             # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
   258             CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
   259 
   260             # Following error building gcc-4.0.0's gcj:
   261             #  error: bits/syscall.h: No such file or directory
   262             # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
   263             # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
   264             case "${CT_ARCH}" in
   265                 arm)    ;;
   266                 *)  CT_DoExecLog ALL cp -v "misc/syscall-list.h"            \
   267                                            "${CT_HEADERS_DIR}/bits/syscall.h"
   268                     ;;
   269             esac
   270         fi
   271 
   272         if [ "${CT_THREADS}" = "nptl" ]; then
   273             CT_DoLog EXTRA "Installing C library start files"
   274 
   275             # there are a few object files needed to link shared libraries,
   276             # which we build and install by hand
   277             CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
   278             CT_DoExecLog ALL make ${JOBSFLAGS}  \
   279                         "${extra_make_args[@]}" \
   280                         csu/subdir_lib
   281             CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
   282                                 "${CT_SYSROOT_DIR}/usr/lib"
   283 
   284             # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
   285             # However, since we will never actually execute its code,
   286             # it doesn't matter what it contains.  So, treating '/dev/null'
   287             # as a C source file, we produce a dummy 'libc.so' in one step
   288             CT_DoExecLog ALL "${cross_cc}" -nostdlib        \
   289                                            -nostartfiles    \
   290                                            -shared          \
   291                                            -x c /dev/null   \
   292                                            -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
   293         fi # threads == nptl
   294     else # libc_mode = final
   295         CT_DoLog EXTRA "Building C library"
   296         CT_DoExecLog ALL make ${JOBSFLAGS}                      \
   297                               "${extra_make_args[@]}"           \
   298                               all
   299 
   300         CT_DoLog EXTRA "Installing C library"
   301         CT_DoExecLog ALL make ${JOBSFLAGS}                      \
   302                               "${extra_make_args[@]}"           \
   303                               install_root="${CT_SYSROOT_DIR}"  \
   304                               install
   305 
   306         if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   307             CT_DoLog EXTRA "Building and installing the C library manual"
   308             # Omit JOBSFLAGS as GLIBC has problems building the
   309             # manuals in parallel
   310             CT_DoExecLog ALL make pdf html
   311             # EGLIBC doesn't have a install-{pdf.html} and leaves the manuals
   312             # in the source directory
   313             CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc
   314             CT_DoExecLog ALL cp -av ${src_dir}/manual/*.pdf ${src_dir}/manual/libc \
   315                 ${CT_PREFIX_DIR}/share/doc
   316         fi
   317 
   318         if [ "${CT_LIBC_LOCALES}" = "y" ]; then
   319             do_libc_locales
   320         fi
   321     fi
   322 
   323     CT_EndStep
   324 }
   325 
   326 # This function finishes the C library install
   327 # This is a no-op
   328 do_libc_finish() {
   329     :
   330 }
   331 
   332 # Build up the addons list, separated with $1
   333 do_libc_add_ons_list() {
   334     local sep="$1"
   335     local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}"         \
   336                           |sed -r -e "s/[[:space:],]/${sep}/g;" \
   337                         )"
   338     case "${CT_THREADS}" in
   339         none)   ;;
   340         *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
   341     esac
   342     [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
   343     # Remove duplicate, leading and trailing separators
   344     echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
   345 }
   346 
   347 # Compute up the minimum supported Linux kernel version
   348 do_libc_min_kernel_config() {
   349     local min_kernel_config
   350 
   351     case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
   352         *--enable-kernel*) ;;
   353         *)  if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
   354                 # We can't rely on the kernel version from the configuration,
   355                 # because it might not be available if the user uses pre-installed
   356                 # headers. On the other hand, both method will have the kernel
   357                 # version installed in "usr/include/linux/version.h" in the sysroot.
   358                 # Parse that instead of having two code-paths.
   359                 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
   360                 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
   361                     CT_Abort "Linux version is unavailable in installed headers files"
   362                 fi
   363                 version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}"  \
   364                                  |cut -d ' ' -f 3                                   \
   365                                )"
   366                 version=$(((version_code>>16)&0xFF))
   367                 patchlevel=$(((version_code>>8)&0xFF))
   368                 sublevel=$((version_code&0xFF))
   369                 min_kernel_config="${version}.${patchlevel}.${sublevel}"
   370             elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
   371                 # Trim the fourth part of the linux version, keeping only the first three numbers
   372                 min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}"            \
   373                                       |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
   374                                     )"
   375             fi
   376             echo "--enable-kernel=${min_kernel_config}"
   377             ;;
   378     esac
   379 }