[OE-core] [PATCH 2/4] gcc: Drop gcc-cross-initial and use gcc-cross instead

Khem Raj raj.khem at gmail.com
Thu Dec 20 00:55:26 UTC 2018


Hi Richard

This is a very good change all in all. I have few comments I added.

On Wed, Dec 19, 2018 at 4:16 PM Richard Purdie
<richard.purdie at linuxfoundation.org> wrote:
>
> We need a libgcc to build glibc. Tranditionally we therefore build
> a non-threaded and non-shared compiler (gcc-cross-initial), then use
> that to build libgcc-initial which is used to build glibc which we can
> then build gcc-cross and libgcc against.
>
> Firstly, we can drop the glibc dependency from gcc-cross, *if* we make
> two changes:
>
> a) specify the minimum glibc version to support in a configure option
> b) create a dummy limits.h file so that later when glibc creates one,
>    the headers structure has support for it. We can do this with a simple
>    empty file
>
> Once gcc-cross is libc independent, we can use it to build both
> libgcc-initial and then later libgcc.
>
> libgcc-initial is tricky as we need to imitate the non-threaded and
> non-shared case. We can do that by hacking the threading mode back to
> "single" even if gcc reports "posix" and disable libc presence for the
> libgcc-intial build. We have to create the dummy limits.h to avoid
> compiler errors from a missing header.
>
> glibc will fail to link with libgcc-initial due to a missing "exception
> handler" capable libgcc (libgcc_eh.a). Since we know glibc doesn't need
> any exception handler, we can safely symlink to libgcc.a.
>
> With those changes, gcc-cross can be used in all places and we only need
> one build of gcc for each architecture.
>
> For some reason ifunc was being disabled on mips prior to these changes
> but afterwards became enabled but caused assertion failures. This is
> therefore disabled until we can debug that.
>
> The glibc version is a minimum and only used on ppc in the gcc code, it
> doesn't need to be rigerously kept exactly up to date.
>
> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> ---
>  meta/recipes-core/glibc/glibc.inc             |  5 +-
>  .../gcc/gcc-configure-common.inc              |  3 ++
>  .../gcc/gcc-cross-canadian.inc                |  2 +-
>  meta/recipes-devtools/gcc/gcc-cross.inc       |  8 ++-
>  meta/recipes-devtools/gcc/libgcc-initial.inc  | 52 ++++++++++++++++---
>  meta/recipes-devtools/gcc/libgcc.inc          |  2 +-
>  6 files changed, 61 insertions(+), 11 deletions(-)
>
> diff --git a/meta/recipes-core/glibc/glibc.inc b/meta/recipes-core/glibc/glibc.inc
> index 43e71337eef..de692fbfd75 100644
> --- a/meta/recipes-core/glibc/glibc.inc
> +++ b/meta/recipes-core/glibc/glibc.inc
> @@ -15,7 +15,7 @@ python () {
>          bb.fatal("%s can't be built with %s, try -O1 instead" % (d.getVar('PN'), opt_effective))
>  }
>
> -DEPENDS = "virtual/${TARGET_PREFIX}gcc-initial libgcc-initial linux-libc-headers"
> +DEPENDS = "virtual/${TARGET_PREFIX}gcc libgcc-initial linux-libc-headers"
>
>  PROVIDES = "virtual/libc virtual/${TARGET_PREFIX}libc-for-gcc"
>  PROVIDES += "virtual/libintl virtual/libiconv"
> @@ -33,6 +33,9 @@ CACHED_CONFIGUREVARS += " \
>    libc_cv_ssp=no \
>  "
>
> +# ifunc doesn't appear to work on mips, casuses libbfd assertion failures
> +CACHED_CONFIGUREVARS_append_mipsarch = " libc_cv_ld_gnu_indirect_function=no"

perhaps we should use --disable-gnu-indirect-function to make it more readable.

> +
>  GLIBC_EXTRA_OECONF ?= ""
>  GLIBC_EXTRA_OECONF_class-nativesdk = ""
>  INHIBIT_DEFAULT_DEPS = "1"
> diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
> index e2ce234aa14..009ab111683 100644
> --- a/meta/recipes-devtools/gcc/gcc-configure-common.inc
> +++ b/meta/recipes-devtools/gcc/gcc-configure-common.inc
> @@ -24,6 +24,8 @@ GCCTHREADS ?= "posix"
>
>  GCCPIE ??= ""
>
> +# glibc version is a minimum and doesn't need to track glibc exactly
> +# only governs ppc specific features in much older glibc versions

I hope there are no effects of this pinning to glibc 2.28 on non-glibc
builds especially musl.

>  EXTRA_OECONF = "\
>      ${@['--enable-clocale=generic', ''][d.getVar('USE_NLS') != 'no']} \
>      --with-gnu-ld \
> @@ -38,6 +40,7 @@ EXTRA_OECONF = "\
>      --enable-libstdcxx-pch \
>      --program-prefix=${TARGET_PREFIX} \
>      --without-local-prefix \
> +    --with-glibc-version=2.28 \
>      ${EXTRA_OECONF_BASE} \
>      ${EXTRA_OECONF_GCC_FLOAT} \
>      ${EXTRA_OECONF_PATHS} \
> diff --git a/meta/recipes-devtools/gcc/gcc-cross-canadian.inc b/meta/recipes-devtools/gcc/gcc-cross-canadian.inc
> index 2f32d3407fb..73f1e054463 100644
> --- a/meta/recipes-devtools/gcc/gcc-cross-canadian.inc
> +++ b/meta/recipes-devtools/gcc/gcc-cross-canadian.inc
> @@ -3,7 +3,7 @@ inherit cross-canadian
>  SUMMARY = "GNU cc and gcc C compilers (cross-canadian for ${TARGET_ARCH} target)"
>  PN = "gcc-cross-canadian-${TRANSLATED_TARGET_ARCH}"
>
> -DEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${HOST_PREFIX}gcc-crosssdk virtual/${HOST_PREFIX}binutils-crosssdk virtual/nativesdk-${HOST_PREFIX}libc-for-gcc nativesdk-gettext flex-native"
> +DEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${HOST_PREFIX}gcc-crosssdk virtual/${HOST_PREFIX}binutils-crosssdk virtual/nativesdk-${HOST_PREFIX}libc-for-gcc nativesdk-gettext flex-native virtual/libc"
>
>  GCCMULTILIB = "--enable-multilib"
>
> diff --git a/meta/recipes-devtools/gcc/gcc-cross.inc b/meta/recipes-devtools/gcc/gcc-cross.inc
> index 89b19684bef..63a196e2e99 100644
> --- a/meta/recipes-devtools/gcc/gcc-cross.inc
> +++ b/meta/recipes-devtools/gcc/gcc-cross.inc
> @@ -2,7 +2,7 @@ inherit cross
>
>  INHIBIT_DEFAULT_DEPS = "1"
>  EXTRADEPENDS = ""
> -DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc ${EXTRADEPENDS} ${NATIVEDEPS}"
> +DEPENDS = "virtual/${TARGET_PREFIX}binutils ${EXTRADEPENDS} ${NATIVEDEPS}"
>  PROVIDES = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++"
>  python () {
>      if d.getVar("TARGET_OS").startswith("linux"):
> @@ -44,6 +44,12 @@ EXTRA_OECONF_PATHS = "\
>
>  ARCH_FLAGS_FOR_TARGET += "-isystem${STAGING_DIR_TARGET}${target_includedir}"
>
> +
> +do_configure_prepend () {
> +       install -d ${RECIPE_SYSROOT}${target_includedir}
> +       touch ${RECIPE_SYSROOT}${target_includedir}/limits.h

I wonder if we should use install  0644 so we dont have permission
errors not sure what touch will do in that regard

> +}
> +
>  do_compile () {
>         export CC="${BUILD_CC}"
>         export AR_FOR_TARGET="${TARGET_SYS}-ar"
> diff --git a/meta/recipes-devtools/gcc/libgcc-initial.inc b/meta/recipes-devtools/gcc/libgcc-initial.inc
> index 950ad861e7e..06bf224f734 100644
> --- a/meta/recipes-devtools/gcc/libgcc-initial.inc
> +++ b/meta/recipes-devtools/gcc/libgcc-initial.inc
> @@ -1,20 +1,58 @@
> +#
> +# Notes on the way the OE cross toolchain now works
> +#
> +# We need a libgcc to build glibc. Tranditionally we therefore built
> +# a non-threaded and non-shared compiler (gcc-cross-initial), then use
> +# that to build libgcc-initial which is used to build glibc which we can
> +# then build gcc-cross and libgcc against.
> +#
> +# We were able to drop the glibc dependency from gcc-cross, with two tweaks:
> +
> +# a) specify the minimum glibc version to support in a configure option
> +# b) create a dummy limits.h file so that later when glibc creates one,
> +#    the headers structure has support for it. We can do this with a simple
> +#    empty file
> +#
> +# Once gcc-cross is libc independent, we can use it to build both
> +# libgcc-initial and then later libgcc.
> +#
> +# libgcc-initial is tricky as we need to imitate the non-threaded and
> +# non-shared case. We can do that by hacking the threading mode back to
> +# "single" even if gcc reports "posix" and disable libc presence for the
> +# libgcc-intial build. We have to create the dummy limits.h to avoid
> +# compiler errors from a missing header.
> +#
> +# glibc will fail to link with libgcc-initial due to a missing "exception
> +# handler" capable libgcc (libgcc_eh.a). Since we know glibc doesn't need
> +# any exception handler, we can safely symlink to libgcc.a.
> +#
> +
>  require libgcc-common.inc
>
> -DEPENDS = "virtual/${TARGET_PREFIX}gcc-initial"
> +DEPENDS = "virtual/${TARGET_PREFIX}gcc"
>
>  LICENSE = "GPL-3.0-with-GCC-exception"
>
> -STAGINGCC = "gcc-cross-initial-${TARGET_ARCH}"
> -STAGINGCC_class-nativesdk = "gcc-crosssdk-initial-${SDK_SYS}"
> -PATH_prepend = "${STAGING_BINDIR_TOOLCHAIN}.${STAGINGCC}:"
> -
>  PACKAGES = ""
>
>  EXTRA_OECONF += "--disable-shared"
>
> -COMPILERINITIAL = "-initial"
> -
>  inherit nopackages
>
>  # We really only want this built by things that need it, not any recrdeptask
>  deltask do_build
> +
> +do_configure_prepend () {
> +       install -d ${STAGING_INCDIR}
> +       touch ${STAGING_INCDIR}/limits.h
> +       sed -i -e 's#INHIBIT_LIBC_CFLAGS =.*#INHIBIT_LIBC_CFLAGS = -Dinhibit_libc#' ${B}/gcc/libgcc.mvars
> +       sed -i -e 's#inhibit_libc = false#inhibit_libc = true#' ${B}/gcc/Makefile
> +}
> +
> +do_configure_append () {
> +       sed -i -e 's#thread_header = .*#thread_header = gthr-single.h#' ${B}/${BPN}/Makefile
> +}
> +
> +do_install_append () {
> +       ln -s libgcc.a ${D}${libdir}/${TARGET_SYS}/${BINV}/libgcc_eh.a
> +}
> diff --git a/meta/recipes-devtools/gcc/libgcc.inc b/meta/recipes-devtools/gcc/libgcc.inc
> index 5f1dff609c0..e4e0c480076 100644
> --- a/meta/recipes-devtools/gcc/libgcc.inc
> +++ b/meta/recipes-devtools/gcc/libgcc.inc
> @@ -1,6 +1,6 @@
>  require libgcc-common.inc
>
> -DEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++"
> +DEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++ virtual/${MLPREFIX}libc"
>
>  do_install_append_class-target () {
>         if [ "${TCLIBC}" != "glibc" ]; then
> --
> 2.19.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core


More information about the Openembedded-core mailing list