libada: Remove racy duplicate gnatlib installation
authorMaciej W. Rozycki <macro@wdc.com>
Tue, 1 Oct 2019 18:38:58 +0000 (18:38 +0000)
committerMaciej W. Rozycki <macro@gcc.gnu.org>
Tue, 1 Oct 2019 18:38:58 +0000 (18:38 +0000)
For some reason, presumably historical, the `install-gnatlib' target for
the default multilib is invoked twice, once via the `ada.install-common'
target in `gcc/ada/gcc-interface/Make-lang.in' invoked from gcc/ and
again via the `install-libada' target in libada/.

Apart from doing the same twice this is actually harmful in sufficiently
parallelized `make' invocation, as the removal of old files performed
within the `install-gnatlib' recipe in the former case actually races
with the installation of new files done in the latter case, causing the
recipe to fail and abort, however non-fatally, having not completed the
installation of all the built files needed for the newly-built compiler
to work correctly.

This can be observed with a native `x86_64-linux-gnu' bootstrap:

make[4]: Entering directory '.../gcc/ada'
rm -rf .../lib/gcc/x86_64-linux-gnu/10.0.0/adalib
rm: cannot remove '.../lib/gcc/x86_64-linux-gnu/10.0.0/adalib': Directory not empty
make[4]: *** [gcc-interface/Makefile:512: install-gnatlib] Error 1
make[4]: Leaving directory '.../gcc/ada'
make[3]: *** [.../gcc/ada/gcc-interface/Make-lang.in:853: install-gnatlib] Error 2
make[2]: [.../gcc/ada/gcc-interface/Make-lang.in:829: ada.install-common] Error 2 (ignored)

which then causes missing files to be reported when an attempt is made
to use the newly-installed non-functional compiler to build a
`riscv-linux-gnu' cross-compiler:

(cd ada/bldtools/sinfo; gnatmake -q xsinfo ; ./xsinfo sinfo.h )
error: "ada.ali" not found, "ada.ads" must be compiled
error: "s-memory.ali" not found, "s-memory.adb" must be compiled
gnatmake: *** bind failed.
/bin/sh: ./xsinfo: No such file or directory
make[2]: *** [.../gcc/ada/Make-generated.in:45: ada/sinfo.h] Error 127
make[2]: Leaving directory '.../gcc'
make[1]: *** [Makefile:4369: all-gcc] Error 2
make[1]: Leaving directory '...'
make: *** [Makefile:965: all] Error 2

Depending on timing `.../lib/gcc/x86_64-linux-gnu/10.0.0/adainclude' may
cause an installation failure instead and the resulting compiler may be
non-functional in a different way.

Only invoke `install-gnatlib' from within gcc/ then if a legacy build
process is being used with libada disabled and gnatlib built manually
with `make -C gcc gnatlib'.

gcc/
* Makefile.in (gnat_install_lib): New variable.
* configure.ac: Substitute it.
* configure: Regenerate.

gcc/ada/
* gcc-interface/Make-lang.in (ada.install-common): Split into...
(gnat-install-tools, gnat-install-lib): ... these.

From-SVN: r276422

gcc/ChangeLog
gcc/Makefile.in
gcc/ada/ChangeLog
gcc/ada/gcc-interface/Make-lang.in
gcc/configure
gcc/configure.ac

index be785258579adfca6e9b9155ba1aace5a9d11239..0f96dde03c4cbcf4664fcd5fbd5d88d1cc5d7302 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-01  Maciej W. Rozycki  <macro@wdc.com>
+
+       * Makefile.in (gnat_install_lib): New variable.
+       * configure.ac: Substitute it.
+       * configure: Regenerate.
+
 2019-10-01  Jan Hubicka  <hubicka@ucw.cz>
 
        PR lto/91222
index d796c149ca09b949d6c3349263685a03cac265ea..ca03cfdd2dc150ec563b10d87fa5453d0706e949 100644 (file)
@@ -1706,6 +1706,10 @@ $(FULL_DRIVER_NAME): ./xgcc
 # language hooks, generated by configure
 @language_hooks@
 
+# Wire in install-gnatlib invocation with `make install' for a configuration
+# with top-level libada disabled.
+gnat_install_lib = @gnat_install_lib@
+
 # per-language makefile fragments
 ifneq ($(LANG_MAKEFRAGS),)
 include $(LANG_MAKEFRAGS)
index 8e5a19bc9e84f9025090db5e5b2a350af9cb7ef8..ecc2e25b8504f9abf12b4e7f3830a9b2cb5dd3d9 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-01  Maciej W. Rozycki  <macro@wdc.com>
+
+       * gcc-interface/Make-lang.in (ada.install-common): Split into...
+       (gnat-install-tools, gnat-install-lib): ... these.
+
 2019-09-26  Alexandre Oliva <oliva@adacore.com>
 
        * gcc-interface/decl.c (components_to_record): Set
index 276c41c2edf2cd5fa5dad1307ac71173fbfd6bb4..acbe2b877cae6011caf83ee420a57a202eb1ae58 100644 (file)
@@ -822,7 +822,9 @@ doc/gnat-style.pdf: ada/gnat-style.texi $(gcc_docdir)/include/fdl.texi
 # gnatlink, gnatls, gnatmake, gnatname, gnatprep, gnatxref, gnatfind,
 # gnatclean).
 # gnatdll is only used on Windows.
-ada.install-common:
+ada.install-common: $(gnat_install_lib) gnat-install-tools
+
+gnat-install-tools:
        $(MKDIR) $(DESTDIR)$(bindir)
        -if [ -f gnat1$(exeext) ] ; \
        then \
@@ -843,6 +845,7 @@ ada.install-common:
 #
 # Finally, install the library
 #
+gnat-install-lib: | gnat-install-tools
        -if [ -f gnat1$(exeext) ] ; \
        then \
          $(MAKE) $(COMMON_FLAGS_TO_PASS) $(ADA_FLAGS_TO_PASS) install-gnatlib; \
index f90472d30f39ed514b8936fc663231505287c8e9..893a9e6fafc9d53861c826035d53a70082cf4e7c 100755 (executable)
@@ -814,6 +814,7 @@ SET_MAKE
 accel_dir_suffix
 real_target_noncanonical
 enable_as_accelerator
+gnat_install_lib
 REPORT_BUGS_TEXI
 REPORT_BUGS_TO
 PKGVERSION
@@ -7826,6 +7827,16 @@ else
 fi
 
 
+# If top-level libada has been disabled, then wire in install-gnatlib
+# invocation with `make install', so that one can build and install
+# the library manually with `make -C gcc all gnatlib gnattools install'.
+if test x"$enable_libada" = xno; then
+  gnat_install_lib=gnat-install-lib
+else
+  gnat_install_lib=
+fi
+
+
 if test x"$enable_as_accelerator_for" != x; then
 
 $as_echo "#define ACCEL_COMPILER 1" >>confdefs.h
@@ -18819,7 +18830,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18822 "configure"
+#line 18833 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -18925,7 +18936,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18928 "configure"
+#line 18939 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
index 5c60d0f8dfdbee5b33d1736c93f174d01dcb2b02..eff849f1f3836a7c00c6ead7731da8b5ba8488a3 100644 (file)
@@ -982,6 +982,16 @@ AC_ARG_ENABLE(languages,
 esac],
 [enable_languages=c])
 
+# If top-level libada has been disabled, then wire in install-gnatlib
+# invocation with `make install', so that one can build and install
+# the library manually with `make -C gcc all gnatlib gnattools install'.
+if test x"$enable_libada" = xno; then
+  gnat_install_lib=gnat-install-lib
+else
+  gnat_install_lib=
+fi
+AC_SUBST(gnat_install_lib)
+
 if test x"$enable_as_accelerator_for" != x; then
   AC_DEFINE(ACCEL_COMPILER, 1,
     [Define if this compiler should be built as the offload target compiler.])