summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Lattarini <stefano.lattarini@gmail.com>2015-01-03 01:33:45 +0100
committerStefano Lattarini <stefano.lattarini@gmail.com>2015-01-04 18:31:50 +0100
commit0b371a43bf49516fef214b2d2a299c9f5edbb39f (patch)
tree5dade0a11951ea4f148326e561d030fcd9539dc6
parent860d21b8854eb61dd79f37f1be564af7efa916c6 (diff)
downloadautomake-experimental/deps-pr13928.tar.gz
deps: fix corner-case "make distclean" bugexperimental/deps-pr13928
Assume we have package satisfying the following conditions: (1) automatic dependency tracking is enabled; (2) the 'subdir-objects' Automake option is enabled; (3) the package uses a recursive make setup. Also assume that: (a) a subdir Makefile declares a foo_SOURCES variable containing a source file in the parent directory; (b) that parent Makefile declare a compiled program itself. Then BSD and Solaris make used to fail when running "make distclean", because the 'distclean' target of the subdir Makefile removed the whole '.deps' directory before the parent Makefile was done with the included '.Po' makefile fragments in that directory. This issue was revealed by failures in the 'subobj-vpath-pr13928.sh' test when those make implementations were used. We fix the issue by ensuring the 'distclean' target of any Makefile only removed the '.Po' makefile fragments included by it, rather than the whole '.deps' directory where such files resides. This change should be the last step in fixing automake bug#13928 for good. * bin/automake.in (handle_languages), lib/am/depend.am: Adjust to implement the new 'distclean' logic. * t/pr224.sh: Adjust to avoid a spurious failure. * PLANS/subdir-objects.txt: Update. Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
-rw-r--r--PLANS/subdir-objects.txt10
-rw-r--r--bin/automake.in20
-rw-r--r--lib/am/depend.am7
-rw-r--r--t/pr224.sh4
4 files changed, 19 insertions, 22 deletions
diff --git a/PLANS/subdir-objects.txt b/PLANS/subdir-objects.txt
index 3cf610124..c849e338e 100644
--- a/PLANS/subdir-objects.txt
+++ b/PLANS/subdir-objects.txt
@@ -5,9 +5,6 @@ We want to make the behaviour currently enabled by the 'subdir-objects'
the default one, and in fact the *only* one, in Automake 2.0.
See automake bug#13378: <http://debbugs.gnu.org/13378>.
-Sadly, **THIS IS IMPOSSIBLE** until automake bug#13928 is resolved:
-http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13928
-
Details
-------
@@ -53,11 +50,10 @@ We also make sure to avoid the warning when it would be irrelevant, i.e.,
if all source files sit in "current" directory (thanks to Peter Johansson
for suggesting this).
-For some automake 1.x (*before* 2.0 can be released)
-----------------------------------------------------
+For automake 1.16 (*before* 2.0 can be released)
+------------------------------------------------
-Find a proper way to fix the blocking automake bug#13928:
-http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13928
+Submit the pending patch series that fixes http://debbugs.gnu.org/13928
For automake 2.0
----------------
diff --git a/bin/automake.in b/bin/automake.in
index d8ecca514..21cccbe9e 100644
--- a/bin/automake.in
+++ b/bin/automake.in
@@ -1242,14 +1242,16 @@ sub handle_languages ()
INTERNAL);
define_variable ('am__maybe_remake_depfiles', 'depfiles', INTERNAL);
define_variable ('am__depfiles_remade', "@dep_files", INTERNAL);
- # Generate each 'include' directive individually. Several make
- # implementations (IRIX 6, Solaris 10, FreeBSD 8) will fail to
- # properly include several files resulting from a variable
- # expansion. Just Generating many separate includes seems thus
- # safest.
$output_rules .= "\n";
+ my @dist_rms;
foreach my $depfile (@dep_files)
{
+ push @dist_rms, "\t-rm -f $depfile";
+ # Generate each 'include' directive individually. Several
+ # make implementations (IRIX 6, Solaris 10, FreeBSD 8) will
+ # fail to properly include several files resulting from a
+ # variable expansion. Just Generating many separate includes
+ # seems thus safest.
$output_rules .= subst ('AMDEP_TRUE') .
subst ('am__include') .
" " .
@@ -1262,11 +1264,9 @@ sub handle_languages ()
require_conf_file ("$am_file.am", FOREIGN, 'depcomp');
- # Compute the set of directories to remove in distclean-depend.
- my @dep_dirs = uniq (map { dirname ($_) } @dep_files);
- $output_rules .= file_contents ('depend',
- new Automake::Location,
- DEPDIRS => "@dep_dirs");
+ $output_rules .= file_contents (
+ 'depend', new Automake::Location,
+ 'DISTRMS' => join ("\n", @dist_rms));
}
}
else
diff --git a/lib/am/depend.am b/lib/am/depend.am
index 0b226b6ba..3813996ec 100644
--- a/lib/am/depend.am
+++ b/lib/am/depend.am
@@ -27,8 +27,9 @@ am--depfiles: $(am__depfiles_remade)
## erase them in -am or -recursive rules; that would prevent any other
## rules from being recursive (for instance multilib clean rules are
## recursive).
+if %?DISTRMS%
distclean:
- -rm -rf %DEPDIRS%
-
+ %DISTRMS%
maintainer-clean:
- -rm -rf %DEPDIRS%
+ %DISTRMS%
+endif
diff --git a/t/pr224.sh b/t/pr224.sh
index fcea14865..1961786b1 100644
--- a/t/pr224.sh
+++ b/t/pr224.sh
@@ -56,8 +56,8 @@ cd build
../configure
$MAKE
-test -d foo/.deps
+test -f foo/.deps/main.Po
$MAKE distclean
-test -d foo/.deps && exit 1
+test ! -e foo/.deps/main.Po
: