On Mon, Nov 12, 2018 at 1:00 PM Alexandre Oliva <ol...@adacore.com> wrote: > > gnattools build machinery uses just-build xgcc and xg++ as $(CC) and > $(CXX) in native builds. However, if C and C++ languages are not > enabled, it won't find them. So, enable C and C++ if Ada is enabled. > Most of the time, this is probably no big deal: C is always enabled > anyway, and C++ is already enabled for bootstraps. > > We need not enable those for cross builds, however. At first I just > took the logic from gnattools/configure, but found it to be lacking: > it would use the just-built tools even in cross-back settings, whose > tools just built for the host would not run on the build machine. So > I've narrowed down the test to rely on autoconf-detected cross-ness > (build->host only), but also to ensure that host matches build, and > that target matches host. > > I've considered sourcing ada/config-lang.in from within > gnattools/configure, and testing lang_requires as set by it, so as to > avoid a duplication of tests that ought to remain in sync, but decided > it would be too fragile, as ada/config-lang.in does not expect srcdir > to refer to gnattools. > > > Please let me know if there are objections to this change in the next > few days, e.g., if enabling C and C++ for an Ada-only build is too > onerous. It is certainly possible to rework gnattools build machinery > so that it uses CC and CXX as detected by the top-level configure if we > can't find xgcc and xg++ in ../gcc.
I really wonder why we not _always_ do this for consistency given we already require a host Ada compiler. It really makes things more messy than required... > At least in cross builds, we > already require build-time Ada tools to have the same version as that > we're cross-building, so we might as well use preexisting gcc and g++ > under the same requirements. > > > for gcc/ada/gcc-interface/ChangeLog > > PR ada/81878 > * config-lang.in (lang_requires): Set to "c c++" when > gnattools wants it. > > for gnattools/ChangeLog > > PR ada/81878 > * configure.ac (default_gnattools_target): Do not mistake > just-built host tools as native in cross-back toolchains. > * configure: Rebuilt. > --- > gcc/ada/gcc-interface/config-lang.in | 9 +++++++++ > gnattools/configure | 32 ++++++++++++++++++++++---------- > gnattools/configure.ac | 30 +++++++++++++++++++++--------- > 3 files changed, 52 insertions(+), 19 deletions(-) > > diff --git a/gcc/ada/gcc-interface/config-lang.in > b/gcc/ada/gcc-interface/config-lang.in > index 5dc77df282ce..8eacf7bb870e 100644 > --- a/gcc/ada/gcc-interface/config-lang.in > +++ b/gcc/ada/gcc-interface/config-lang.in > @@ -34,6 +34,15 @@ gtfiles="\$(srcdir)/ada/gcc-interface/ada-tree.h > \$(srcdir)/ada/gcc-interface/gi > > outputs="ada/gcc-interface/Makefile ada/Makefile" > > +# gnattools native builds use both $(CC) and $(CXX), see PR81878. > +# This is not too onerous: C is always enabled anyway, and C++ is > +# always enabled for bootstrapping. Use here the same logic used in > +# gnattools/configure to decide whether to use -native or -cross tools > +# for the build. > +if test "x$cross_compiling/$build/$host" = "xno/$host/$target" ; then > + lang_requires="c c++" > +fi > + > target_libs="target-libada" > lang_dirs="gnattools" > > diff --git a/gnattools/configure b/gnattools/configure > index ccb512e39b6b..c2d755b723a9 100755 > --- a/gnattools/configure > +++ b/gnattools/configure > @@ -584,6 +584,7 @@ PACKAGE_URL= > ac_unique_file="Makefile.in" > ac_subst_vars='LTLIBOBJS > LIBOBJS > +default_gnattools_target > warn_cflags > OBJEXT > EXEEXT > @@ -595,7 +596,6 @@ CC > ADA_CFLAGS > EXTRA_GNATTOOLS > TOOLS_TARGET_PAIRS > -default_gnattools_target > LN_S > target_noncanonical > host_noncanonical > @@ -2050,15 +2050,6 @@ $as_echo "no, using $LN_S" >&6; } > fi > > > -# Determine what to build for 'gnattools' > -if test $build = $target ; then > - # Note that build=target is almost certainly the wrong test; FIXME > - default_gnattools_target="gnattools-native" > -else > - default_gnattools_target="gnattools-cross" > -fi > - > - > # Target-specific stuff (defaults) > TOOLS_TARGET_PAIRS= > > @@ -2134,6 +2125,8 @@ esac > # From user or toplevel makefile. > > > +# This is testing the CC passed from the toplevel Makefile, not the > +# one we will select below. > ac_ext=c > ac_cpp='$CPP $CPPFLAGS' > ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' > @@ -2929,6 +2922,25 @@ if test "x$GCC" = "xyes"; then > fi > > > +# Determine what to build for 'gnattools'. Test after the above, > +# because testing for CC sets the final value of cross_compiling, even > +# if we end up using a different CC. We want to build > +# gnattools-native when: (a) this is a native build, i.e., > +# cross_compiling=no, otherwise we know we cannot run binaries > +# produced by the toolchain used for the build, not even the binaries > +# created within ../gcc/; (b) build and host are the same, otherwise > +# this is to be regarded as a cross build environment even if it seems > +# that we can run host binaries; (c) host and target are the same, > +# otherwise the tools in ../gcc/ generate code for a different > +# platform. If you change this test, be sure to adjust > +# ../gcc/ada/gcc-interface/config-lang.in as well. > +if test "x$cross_compiling/$build/$host" = "xno/$host/$target" ; then > + default_gnattools_target="gnattools-native" > +else > + default_gnattools_target="gnattools-cross" > +fi > + > + > # Output: create a Makefile. > ac_config_files="$ac_config_files Makefile" > > diff --git a/gnattools/configure.ac b/gnattools/configure.ac > index 0a94224a5362..40d015ce8b0d 100644 > --- a/gnattools/configure.ac > +++ b/gnattools/configure.ac > @@ -51,15 +51,6 @@ ACX_NONCANONICAL_TARGET > # Need to pass this down for now :-P > AC_PROG_LN_S > > -# Determine what to build for 'gnattools' > -if test $build = $target ; then > - # Note that build=target is almost certainly the wrong test; FIXME > - default_gnattools_target="gnattools-native" > -else > - default_gnattools_target="gnattools-cross" > -fi > -AC_SUBST([default_gnattools_target]) > - > # Target-specific stuff (defaults) > TOOLS_TARGET_PAIRS= > AC_SUBST(TOOLS_TARGET_PAIRS) > @@ -135,6 +126,8 @@ esac > # From user or toplevel makefile. > AC_SUBST(ADA_CFLAGS) > > +# This is testing the CC passed from the toplevel Makefile, not the > +# one we will select below. > AC_PROG_CC > warn_cflags= > if test "x$GCC" = "xyes"; then > @@ -142,6 +135,25 @@ if test "x$GCC" = "xyes"; then > fi > AC_SUBST(warn_cflags) > > +# Determine what to build for 'gnattools'. Test after the above, > +# because testing for CC sets the final value of cross_compiling, even > +# if we end up using a different CC. We want to build > +# gnattools-native when: (a) this is a native build, i.e., > +# cross_compiling=no, otherwise we know we cannot run binaries > +# produced by the toolchain used for the build, not even the binaries > +# created within ../gcc/; (b) build and host are the same, otherwise > +# this is to be regarded as a cross build environment even if it seems > +# that we can run host binaries; (c) host and target are the same, > +# otherwise the tools in ../gcc/ generate code for a different > +# platform. If you change this test, be sure to adjust > +# ../gcc/ada/gcc-interface/config-lang.in as well. > +if test "x$cross_compiling/$build/$host" = "xno/$host/$target" ; then > + default_gnattools_target="gnattools-native" > +else > + default_gnattools_target="gnattools-cross" > +fi > +AC_SUBST([default_gnattools_target]) > + > # Output: create a Makefile. > AC_CONFIG_FILES([Makefile]) > > > > -- > Alexandre Oliva, freedom fighter https://FSFLA.org/blogs/lxo > Be the change, be Free! FSF Latin America board member > GNU Toolchain Engineer Free Software Evangelist > Hay que enGNUrecerse, pero sin perder la terGNUra jamás-GNUChe