[PATCH] glibc: Refactor startfiles/headers into do_libc
Bryan Hundven
bryanhundven@gmail.com
Mon Jun 20 08:18:00 GMT 2011
On Mon, Jun 20, 2011 at 12:44 AM, Bryan Hundven <bryanhundven@gmail.com> wrote:
> # HG changeset patch
> # User Bryan Hundven <bryanhundven@gmail.com>
> # Date 1308555696 25200
> # Node ID b25856d9153785d0f711206383480f0190aec363
> # Parent 2377be750e83defa6d764bcb8cf6dbaf098a19f6
> glibc: Refactor startfiles/headers into do_libc
>
> The 'do_libc_start_files()' function was configuring libc differently then
> 'do_libc()'. This might be fine for arm(eb) or powerpc(64), but not for
> mips(64).
>
> Move the building of the libc start files and headers into do_libc, much like
> how gcc handles stage1, stage2, and final toolchains.
Signed-off-by: Bryan Hundven <bryanhundven@gmail.com>
>
> diff -r 2377be750e83 -r b25856d91537 scripts/build/libc/glibc-eglibc.sh-common
> --- a/scripts/build/libc/glibc-eglibc.sh-common Mon Jun 13 22:54:29 2011 +0400
> +++ b/scripts/build/libc/glibc-eglibc.sh-common Mon Jun 20 00:41:36 2011 -0700
> @@ -51,128 +51,30 @@
>
> # Build and install headers and start files
> do_libc_start_files() {
> - local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
> -
> - CT_DoStep INFO "Installing C library headers & start files"
> -
> - mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles"
> - cd "${CT_BUILD_DIR}/build-libc-startfiles"
> -
> - CT_DoLog EXTRA "Configuring C library"
> -
> - case "${CT_LIBC}" in
> - eglibc)
> - if [ "${CT_EGLIBC_CUSTOM_CONFIG}" = "y" ]; then
> - CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/eglibc.config" option-groups.config
> - fi
> - ;;
> - esac
> -
> - cross_cc=$(CT_Which "${CT_TARGET}-gcc")
> - cross_cxx=$(CT_Which "${CT_TARGET}-g++")
> - cross_ar=$(CT_Which "${CT_TARGET}-ar")
> - cross_ranlib=$(CT_Which "${CT_TARGET}-ranlib")
> -
> - CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
> - CT_DoLog DEBUG "Using g++ for target: '${cross_cxx}'"
> - CT_DoLog DEBUG "Using ar for target: '${cross_ar}'"
> - CT_DoLog DEBUG "Using ranlib for target: '${cross_ranlib}'"
> -
> - touch config.cache
> - if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
> - echo "libc_cv_forced_unwind=yes" >>config.cache
> - echo "libc_cv_c_cleanup=yes" >>config.cache
> - fi
> -
> - # Pre-seed the configparms file with values from the config option
> - printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
> -
> - CT_DoExecLog CFG \
> - BUILD_CC="${CT_BUILD}-gcc" \
> - CC=${cross_cc} \
> - CXX=${cross_cxx} \
> - AR=${cross_ar} \
> - RANLIB=${cross_ranlib} \
> - "${src_dir}/configure" \
> - --prefix=/usr \
> - --with-headers="${CT_HEADERS_DIR}" \
> - --build="${CT_BUILD}" \
> - --host="${CT_TARGET}" \
> - --cache-file="$(pwd)/config.cache" \
> - --disable-profile \
> - --without-gd \
> - --without-cvs \
> - --enable-add-ons
> -
> - CT_DoLog EXTRA "Installing C library headers"
> -
> - # use the 'install-headers' makefile target to install the
> - # headers
> - CT_DoExecLog ALL make ${JOBSFLAGS} \
> - install_root=${CT_SYSROOT_DIR} \
> - install-bootstrap-headers=yes \
> - install-headers
> -
> - # For glibc, a few headers need to be manually installed
> - if [ "${CT_LIBC}" = "glibc" ]; then
> - # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
> - # so do them by hand. We can tolerate an empty stubs.h for the moment.
> - # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
> - mkdir -p "${CT_HEADERS_DIR}/gnu"
> - CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
> - CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h" \
> - "${CT_HEADERS_DIR}/features.h"
> -
> - # Building the bootstrap gcc requires either setting inhibit_libc, or
> - # having a copy of stdio_lim.h... see
> - # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
> - CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
> -
> - # Following error building gcc-4.0.0's gcj:
> - # error: bits/syscall.h: No such file or directory
> - # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
> - # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
> - case "${CT_ARCH}" in
> - arm) ;;
> - *) CT_DoExecLog ALL cp -v "misc/syscall-list.h" \
> - "${CT_HEADERS_DIR}/bits/syscall.h"
> - ;;
> - esac
> - fi
> -
> - if [ "${CT_THREADS}" = "nptl" ]; then
> - CT_DoLog EXTRA "Installing C library start files"
> -
> - # there are a few object files needed to link shared libraries,
> - # which we build and install by hand
> - CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
> - CT_DoExecLog ALL make ${JOBSFLAGS} csu/subdir_lib
> - CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
> - "${CT_SYSROOT_DIR}/usr/lib"
> -
> - # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
> - # However, since we will never actually execute its code,
> - # it doesn't matter what it contains. So, treating '/dev/null'
> - # as a C source file, we produce a dummy 'libc.so' in one step
> - CT_DoExecLog ALL "${cross_cc}" -nostdlib \
> - -nostartfiles \
> - -shared \
> - -x c /dev/null \
> - -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
> - fi # threads == nptl
> -
> - CT_EndStep
> + # Start files and Headers should be configured the same way as the
> + # final libc, but built and installed differently.
> + do_libc startfile_mode=yes
> }
>
> # This function builds and install the full C library
> do_libc() {
> local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
> + local startfile_mode=no
> local extra_cc_args
> local -a extra_config
> local -a extra_make_args
> local glibc_cflags
>
> - CT_DoStep INFO "Installing C library"
> + while [ $# -ne 0 ]; do
> + eval "${1}"
> + shift
> + done
> +
> + if [ "${startfile_mode}" = "yes" ]; then
> + CT_DoStep INFO "Installing C library headers & start files"
> + else
> + CT_DoStep INFO "Installing C library"
> + fi
>
> mkdir -p "${CT_BUILD_DIR}/build-libc"
> cd "${CT_BUILD_DIR}/build-libc"
> @@ -316,16 +218,75 @@
> ;;
> esac
>
> - CT_DoLog EXTRA "Building C library"
> - CT_DoExecLog ALL make ${JOBSFLAGS} \
> - "${extra_make_args[@]}" \
> - all
> + if [ "${startfile_mode}" = "yes" ]; then
> + CT_DoLog EXTRA "Installing C library headers"
>
> - CT_DoLog EXTRA "Installing C library"
> - CT_DoExecLog ALL make ${JOBSFLAGS} \
> - "${extra_make_args[@]}" \
> - install_root="${CT_SYSROOT_DIR}" \
> - install
> + # use the 'install-headers' makefile target to install the
> + # headers
> + CT_DoExecLog ALL make ${JOBSFLAGS} \
> + install_root=${CT_SYSROOT_DIR} \
> + install-bootstrap-headers=yes \
> + install-headers
> +
> + # For glibc, a few headers need to be manually installed
> + if [ "${CT_LIBC}" = "glibc" ]; then
> + # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
> + # so do them by hand. We can tolerate an empty stubs.h for the moment.
> + # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
> + mkdir -p "${CT_HEADERS_DIR}/gnu"
> + CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
> + CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h" \
> + "${CT_HEADERS_DIR}/features.h"
> +
> + # Building the bootstrap gcc requires either setting inhibit_libc, or
> + # having a copy of stdio_lim.h... see
> + # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
> + CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
> +
> + # Following error building gcc-4.0.0's gcj:
> + # error: bits/syscall.h: No such file or directory
> + # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
> + # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
> + case "${CT_ARCH}" in
> + arm) ;;
> + *) CT_DoExecLog ALL cp -v "misc/syscall-list.h" \
> + "${CT_HEADERS_DIR}/bits/syscall.h"
> + ;;
> + esac
> + fi
> +
> + if [ "${CT_THREADS}" = "nptl" ]; then
> + CT_DoLog EXTRA "Installing C library start files"
> +
> + # there are a few object files needed to link shared libraries,
> + # which we build and install by hand
> + CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
> + CT_DoExecLog ALL make ${JOBSFLAGS} csu/subdir_lib
> + CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
> + "${CT_SYSROOT_DIR}/usr/lib"
> +
> + # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
> + # However, since we will never actually execute its code,
> + # it doesn't matter what it contains. So, treating '/dev/null'
> + # as a C source file, we produce a dummy 'libc.so' in one step
> + CT_DoExecLog ALL "${cross_cc}" -nostdlib \
> + -nostartfiles \
> + -shared \
> + -x c /dev/null \
> + -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
> + fi # threads == nptl
> + else # startfile_mode = no
> + CT_DoLog EXTRA "Building C library"
> + CT_DoExecLog ALL make ${JOBSFLAGS} \
> + "${extra_make_args[@]}" \
> + all
> +
> + CT_DoLog EXTRA "Installing C library"
> + CT_DoExecLog ALL make ${JOBSFLAGS} \
> + "${extra_make_args[@]}" \
> + install_root="${CT_SYSROOT_DIR}" \
> + install
> + fi
>
> CT_EndStep
> }
> @@ -384,3 +345,5 @@
> ;;
> esac
> }
> +
> +# vim: ts=4 sw=4 et ai syn=sh
>
More information about the crossgcc
mailing list