In the Libtool tree, invoking 'make distclean' after 'make clean' or before 'make check' has ever run, fails because there are no Makefiles in the old test subdirectories (and automake's distclean rule looks at DIST_SUBDIRS not SUBDIRS). This patch fixes this long-standing error by creating stub Makefiles, and IMHO using minimal insider information about Automake-generated rules: basically only the name of the 'distclean-recursive' rule, to which we must add a prerequisite. Just adding to distclean-local doesn't work, that gets invoked too late.
OK to apply? Even with this patch, 'make clean' may be very slow in the case where the test subdirectories need reconfiguring. That is an orthogonal and IMVHO minor issue, which I don't know how fix easily though. Thanks, Ralf Tidy and fix clean and distclean rules for old testsuite. * Makefile.am (clean-local-legacy): Use $(CONF_SUBDIRS) instead of hard-coding the list of test directories. Use $(AM_MAKEFLAGS). (fake-distclean-legacy): New phony rule, to create fake Makefile files if needed so that the automake-generated distclean-recursive rule can work properly. (distclean_recursive): New helper variable. (distclean-recursive): Depend on fake-distclean-legacy. diff --git a/Makefile.am b/Makefile.am index d689e09..2c4a3db 100644 --- a/Makefile.am +++ b/Makefile.am @@ -712,12 +712,26 @@ $(srcdir)/tests/defs.in: $(auxdir)/general.m4sh tests/defs.m4sh Makefile.am # We need to remove any files that the above tests created. clean-local-legacy: - -cd tests; \ - for dir in cdemo demo depdemo f77demo fcdemo mdemo mdemo2 pdemo tagdemo; \ - do \ - test -f $$dir/Makefile && ( cd $$dir && $(MAKE) distclean; ); \ + -for dir in $(CONF_SUBDIRS); do \ + if test -f $$dir/Makefile; then \ + (cd $$dir && $(MAKE) $(AM_MAKEFLAGS) distclean); \ + else :; fi; \ done rm -rf _inst +# For distclean, we may have to fake Makefiles in the test directories +# so that descending in DIST_SUBDIRS works. +# Hide the additional dependency from automake so it still outputs the rule. +distclean_recursive = distclean-recursive +$(distclean_recursive): fake-distclean-legacy +.PHONY: fake-distclean-legacy +fake-distclean-legacy: + -for dir in $(CONF_SUBDIRS); do \ + if test ! -f $$dir/Makefile; then \ + $(mkinstalldirs) $$dir; \ + echo 'distclean: ; rm -f Makefile' > $$dir/Makefile; \ + else :; fi; \ + done + $(TESTS): tests/defs DISTCLEANFILES += tests/defs