Hash :
08849db8
Author :
Date :
2015-01-03T01:33:45
deps: fix corner-case "make distclean" bug
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>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
Summary
-------
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>.
Details
-------
The fact that Automake-generated Makefiles place compiled object files in
the current directory by default, also when the corresponding source file
is in a subdirectory, is basically an historical accident, due to the fact
that the 'subdir-objects' option had only been introduced in April 1999,
starting with commit 'user-dep-gen-branchpoint-56-g88b5959', and never
made the default (likely to avoid backwards-compatibility issues).
Since I believe the behaviour enabled by the 'subdir-objects' is the most
useful one, and in fact the *only* natural one, I'd like to make it the
only one available, simplifying the Automake implementation and APIs a
little in the process.
Alas, since this also means changing the default behaviour of Automake
('subdir-objects' is not enabled by default, sadly), this means the
transition path will be less smooth than I'd like.
DONE for automake 1.13.2
------------------------
The bug spotted by Nick Bowler:
<http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13378#35>
<http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13378#44>
and exposed in test case 't/ccnoco4.sh' has been fixed (see commit
v1.13.1-56-g34001a9). The bug was due to the fact that Automake-generated
C compilation rules mistakenly passed the "-c -o" options combination
unconditionally (even to losing compiler) when the 'subdir-objects' was
used but sources were only present in the top-level directory.
DONE for automake 1.14
----------------------
We give a warning in the category 'unsupported' if the 'subdir-objects'
option is not specified. This should give the users enough forewarning
about the planned change, and give them time to update their packages
to the new semantic.
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 automake 1.16 (*before* 2.0 can be released)
------------------------------------------------
Submit the pending patch series that fixes http://debbugs.gnu.org/13928
For automake 2.0
----------------
Make the behaviour once activated by the 'subdir-object' option mandatory.
With that change, we'll drop support for the "old" behaviour of having
object files derived from sources in a subdirectory being placed in the
current directory rather than in that same subdirectory.
Still keep the 'subdir-objects' option supported (as a simple no-op
now), to save useless churn in our user's build systems.