[Ada] Review dependency tracking for Ada sources without -gnatd.n support
Pierre-Marie de Rodat
derodat@adacore.com
Wed Sep 13 13:19:00 GMT 2017
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.
--
Pierre-Marie de Rodat
-------------- next part --------------
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:
More information about the Gcc-patches
mailing list