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

Reply via email to