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

Submitted by Richard Purdie on Dec. 20, 2018, 12:15 a.m. | Patch ID: 157344

Details

Message ID 20181220001545.12618-2-richard.purdie@linuxfoundation.org
State New
Headers show

Commit Message

Richard Purdie Dec. 20, 2018, 12:15 a.m.
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@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(-)

Patch hide | download patch | download mbox

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"
+
 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
 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
+}
+
 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

Comments

Khem Raj Dec. 20, 2018, 12:55 a.m.
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@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@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@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
Richard Purdie Dec. 20, 2018, 10:41 a.m.
On Wed, 2018-12-19 at 16:55 -0800, Khem Raj wrote:
> On Wed, Dec 19, 2018 at 4:16 PM Richard Purdie
> <richard.purdie@linuxfoundation.org> wrote:
> > +# 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.

I did it this way to exactly emulate how it was "failing" prior to the
changes.

> > +
> >  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.

I took a closer look at this. The only platforms that touch it are
rs6000 and the spe port. For linux.h, that only changes one thing in
gcc/config/rs6000/rs6000.c for glibc 2.19 or higher:

/* Support for TARGET_ATOMIC_ASSIGN_EXPAND_FENV without FPRs depends
   on glibc 2.19 or greater.  */
#define RS6000_GLIBC_ATOMIC_FENV 1

For the linux64.h part:

/* Split stack is only supported for 64 bit, and requires glibc >=
2.18.  */
#  define TARGET_CAN_SPLIT_STACK
#   define TARGET_CAN_SPLIT_STACK_64BIT 1
#   define TARGET_CAN_SPLIT_STACK_64BIT 0

Are those going to cause problems on 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

The file isn't packaged and we're not in pseudo context so it shouldn't
matter here as we're just poking something into our own recipe
sysroot...

Cheers,

Richard