[Ada] Review dependency tracking for Ada sources without -gnatd.n support

Message ID a13d5a94-60fb-c93a-b60a-7db77bac7d94@adacore.com
State New
Headers show
Series
  • [Ada] Review dependency tracking for Ada sources without -gnatd.n support
Related show

Commit Message

Pierre-Marie de Rodat Sept. 13, 2017, 1:16 p.m.
This patch will fix build glitches for parallelized Ada builds, which 
started to appear after the Makefile changes that came with the recent 
libgnat/libgnarl reorganization. Specifically, it fixes the detection of 
dependencies between Ada units for builds based on Ada compilers that 
don’t support the -gnatd.n flag.

Tested on x86_64-pc-linux-gnu, committed on trunk.

2017-09-13  Nicolas Roche  <roche@adacore.com>

         * Make-lang.in: In the fallback mechanim, parse the associated
         .ali file and try to guess the locations of dependencies.

Patch

Index: gcc/ada/gcc-interface/Make-lang.in
===================================================================
--- gcc/ada/gcc-interface/Make-lang.in	(revision 252081)
+++ gcc/ada/gcc-interface/Make-lang.in	(working copy)
@@ -106,14 +106,20 @@ 
 
 # Function that dumps the dependencies of an Ada object. Dependency only work
 # fully if the compiler support -gnatd.n. Otherwise a fallback mechanism is
-# used. The fallback mechanism add dependency on all ada sources in the same
-# directory as the original source.
+# used. The fallback mechanism parse the ali files to get the list of
+# dependencies and try to guess their location. If the location cannot be found
+# then the dependency is ignored.
 ifeq ($(findstring -gnatd.n,$(ALL_ADAFLAGS)),)
 ADA_DEPS=\
    mkdir -p $(dir $@)/$(DEPDIR); \
    (o="$@: $<"; \
-    for d in $(dir $<)/*.ad[sb]; do \
-       o="$$o $$d"; \
+    a="`echo $@ | sed -e 's/.o$$/.ali/'`"; \
+    for d in `cat $$a | sed -ne 's;^D \([a-z0-9_\.-]*\).*;\1;gp'`; do \
+       for l in ada $(srcdir)/ada ada/libgnat $(srcdir)/ada/libgnat; do \
+          if test -f $$l/$$d; then \
+             o="$$o $$l/$$d"; \
+          fi; \
+       done; \
     done; \
     echo "$$o"; echo) \
     >$(dir $@)/$(DEPDIR)/$(patsubst %.o,%.Po,$(notdir $@))
@@ -121,11 +127,9 @@ 
 else
 ADA_DEPS=\
    mkdir -p $(dir $@)/$(DEPDIR); \
-   (o="$@: $<"; \
-    for d in `cat $@.gnatd.n`; do \
-       o="$$o $$d"; \
-    done; \
-    echo "$$o"; echo) \
+   (echo "$@: $< " | tr -d '\015' | tr -d '\n'; \
+    cat $@.gnatd.n | tr -d '\015' | tr '\n' ' '; \
+    echo; echo) \
    >$(dir $@)/$(DEPDIR)/$(patsubst %.o,%.Po,$(notdir $@))
 ADA_OUTPUT_OPTION = $(OUTPUT_OPTION) > $@.gnatd.n
 endif
@@ -861,9 +865,11 @@ 
 
 ada.mostlyclean:
 	-$(RM) ada/*$(objext) ada/*.ali ada/b_gnat*.ads ada/b_gnat*.adb
+	-$(RM) ada/*$(objext).gnatd.n
 	-$(RM) ada/*$(coverageexts)
 	-$(RM) ada/sdefault.adb ada/stamp-sdefault ada/stamp-snames
 	-$(RMDIR) ada/tools
+	-$(RMDIR) ada/libgnat
 	-$(RM) gnatbind$(exeext) gnat1$(exeext)
 ada.clean:
 ada.distclean: