This change has a side effect: now any failure of the 'tags', 'ctags', 'cscope' and 'cscopelist' targets in a subdirectory will cause the recursive command issued from the top directory to fail. We believe that this behavioural change is not only justified by the simplification this patch entails, but actually offers better semantics: ignoring failures by default is never a good idea, and with make, the user can anyway order the completion of commands in the face of possible failures with the '-k' option.
* NEWS: Update. * automake.in (%required_targets): Add keys 'cscopelist-am', 'tags-am' and 'ctags-am'. (handle_tags): Greatly simplified, the major part of the handling of recursion for the 'tags', 'ctags' and 'cscopelist' now moved out to ... * lib/am/tags.am: ... this file, that has been adjusted and extended accordingly. * t/maken3.sh: Remove testing of the 'TAGS' target, that is now just an alias to 'tags'. Without this change, this test would spuriously fail. Signed-off-by: Stefano Lattarini <stefano.lattar...@gmail.com> --- I originally found this simplification while working on Automake-NG, but I think it is worth to also apply it to mainline Automake. Any objection? Otherwise I will apply in 48 hours or so. NEWS | 4 +++ automake.in | 83 ++++++++++++++------------------------------------------ lib/am/tags.am | 50 +++++++++++++++++++--------------- t/maken3.sh | 10 +++---- 4 files changed, 56 insertions(+), 91 deletions(-) diff --git a/NEWS b/NEWS index 6c39a7d..b12d565 100644 --- a/NEWS +++ b/NEWS @@ -91,6 +91,10 @@ New in 1.13: specifying the name of such targets in invocations of the new 'AM_EXTRA_RECURSIVE_TARGETS' m4 macro. + - Any failure in the recipe of the "tags", "ctags", "cscope" or + "cscopelist" targets in a subdirectory is now propagated to the + top-level make invocation. + * Improvements to aclocal and related rebuilds rules: - The Autoconf-provided macro AC_CONFIG_MACRO_DIR is now traced by diff --git a/automake.in b/automake.in index 15d545d..5a136e3 100644 --- a/automake.in +++ b/automake.in @@ -464,9 +464,11 @@ my %required_targets = 'install-ps-am' => 1, 'install-info-am' => 1, 'installcheck-am' => 1, - 'uninstall-am' => 1, - - 'install-man' => 1, + 'uninstall-am' => 1, + 'tags-am' => 1, + 'ctags-am' => 1, + 'cscopelist-am' => 1, + 'install-man' => 1, ); # Queue to push require_conf_file requirements to. @@ -3613,71 +3615,26 @@ sub handle_tags '$(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)' . "@config", INTERNAL); - my @tag_deps = (); - my @ctag_deps = (); - my @cscope_deps = (); - if (var ('SUBDIRS')) - { - $output_rules .= ("tags-recursive:\n" - . "\tlist='\$(SUBDIRS)'; for subdir in \$\$list; do \\\n" - # Never fail here if a subdir fails; it - # isn't important. - . "\t test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir" - . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n" - . "\tdone\n"); - push (@tag_deps, 'tags-recursive'); - &depend ('.PHONY', 'tags-recursive'); - &depend ('.MAKE', 'tags-recursive'); - - $output_rules .= ("ctags-recursive:\n" - . "\tlist='\$(SUBDIRS)'; for subdir in \$\$list; do \\\n" - # Never fail here if a subdir fails; it - # isn't important. - . "\t test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir" - . " && \$(MAKE) \$(AM_MAKEFLAGS) ctags); \\\n" - . "\tdone\n"); - push (@ctag_deps, 'ctags-recursive'); - &depend ('.PHONY', 'ctags-recursive'); - &depend ('.MAKE', 'ctags-recursive'); - - $output_rules .= ("cscopelist-recursive:\n" - . "\tlist='\$(SUBDIRS)'; for subdir in \$\$list; do \\\n" - # Never fail here if a subdir fails; it - # isn't important. - . "\t test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir" - . " && \$(MAKE) \$(AM_MAKEFLAGS) cscopelist); \\\n" - . "\tdone\n"); - push (@cscope_deps, 'cscopelist-recursive'); - &depend ('.PHONY', 'cscopelist-recursive'); - &depend ('.MAKE', 'cscopelist-recursive'); - } - if (rvar('am__tagged_files')->value_as_list_recursive - || var ('ETAGS_ARGS') || @tag_deps) - { - $output_rules .= &file_contents ('tags', - new Automake::Location, - TAGSDIRS => "@tag_deps", - CTAGSDIRS => "@ctag_deps", - CSCOPEDIRS => "@cscope_deps"); - + || var ('ETAGS_ARGS') || var ('SUBDIRS')) + { + $output_rules .= &file_contents ('tags', new Automake::Location); set_seen 'TAGS_DEPENDENCIES'; - } - elsif (reject_var ('TAGS_DEPENDENCIES', - "it doesn't make sense to define 'TAGS_DEPENDENCIES'" - . " without\nsources or 'ETAGS_ARGS'")) - { - } + } else - { + { + reject_var ('TAGS_DEPENDENCIES', + "it doesn't make sense to define 'TAGS_DEPENDENCIES'" + . " without\nsources or 'ETAGS_ARGS'"); # Every Makefile must define some sort of TAGS rule. # Otherwise, it would be possible for a top-level "make TAGS" - # to fail because some subdirectory failed. - $output_rules .= "tags: TAGS\nTAGS:\n\n"; - # Ditto ctags and cscope. - $output_rules .= "ctags: CTAGS\nCTAGS:\n\n"; - $output_rules .= "cscope cscopelist:\n\n"; - } + # to fail because some subdirectory failed. Ditto ctags and + # cscope. + $output_rules .= + "tags TAGS:\n\n" . + "ctags CTAGS:\n\n" . + "cscope cscopelist:\n\n"; + } } diff --git a/lib/am/tags.am b/lib/am/tags.am index eadb9c0..26a9f13 100644 --- a/lib/am/tags.am +++ b/lib/am/tags.am @@ -35,13 +35,17 @@ ID: $(am__tagged_files) ## ------ ## ETAGS = etags -.PHONY: tags +.PHONY: TAGS tags if %?SUBDIRS% -AM_RECURSIVE_TARGETS += tags TAGS -endif %?SUBDIRS% -tags: TAGS - -TAGS: %TAGSDIRS% $(TAGS_DEPENDENCIES) $(am__tagged_files) +AM_RECURSIVE_TARGETS += TAGS +RECURSIVE_TARGETS += tags-recursive +tags: tags-recursive +else !%?SUBDIRS% +tags: tags-am +endif !%?SUBDIRS% +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) ## We use the positional parameters to build the subdir list with ## absolute names, without the need to worry about white space in `pwd`. set x; \ @@ -96,14 +100,15 @@ TAGS: %TAGSDIRS% $(TAGS_DEPENDENCIES) $(am__tagged_files) CTAGS = ctags .PHONY: CTAGS ctags if %?SUBDIRS% -AM_RECURSIVE_TARGETS += ctags CTAGS -endif %?SUBDIRS% -ctags: CTAGS - -## We have a dummy name here because 'tags' has already been in use -## for a long time to mean Emacs-style tags. Oops. This means the -## dependencies here are useless. -CTAGS: %CTAGSDIRS% $(TAGS_DEPENDENCIES) $(am__tagged_files) +AM_RECURSIVE_TARGETS += CTAGS +RECURSIVE_TARGETS += ctags-recursive +ctags: ctags-recursive +else !%?SUBDIRS% +ctags: ctags-am +endif !%?SUBDIRS% + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) ## Make sure the list of sources is unique. list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ @@ -134,24 +139,25 @@ GTAGS: ## ------- ## if %?TOPDIR_P% - CSCOPE = cscope .PHONY: cscope clean-cscope AM_RECURSIVE_TARGETS += cscope - cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) - clean-cscope: -rm -f cscope.files - -cscope.files: clean-cscope %CSCOPEDIRS% cscopelist - +cscope.files: clean-cscope cscopelist endif %?TOPDIR_P% -.PHONY: cscopelist -cscopelist: %CSCOPEDIRS% $(am__tagged_files) +if %?SUBDIRS% +RECURSIVE_TARGETS += cscopelist-recursive +cscopelist: cscopelist-recursive +else !%?SUBDIRS% +cscopelist: cscopelist-am +endif !%?SUBDIRS% + +cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ diff --git a/t/maken3.sh b/t/maken3.sh index 6d580ec..5f5d87a 100755 --- a/t/maken3.sh +++ b/t/maken3.sh @@ -22,7 +22,7 @@ # special target, the output from make is sufficiently complete. # # This test exercises the GCS-mandated targets (except for dist) -# as well as tags, TAGS. +# as well as tags. # For gen-testsuite-part: ==> try-with-serial-tests <== . ./defs || exit 1 @@ -111,8 +111,6 @@ installcheck-local: @: > stamp-installcheck-sub tags: @: > stamp-tags-sub -TAGS: - @: > stamp-TAGS-sub mostlyclean-local: @: > stamp-mostlyclean-sub maintainer-clean-local: @@ -127,7 +125,7 @@ html: @: > sub2-$@-should-not-be-executed install-info install-html install-dvi install-pdf install-ps: @: > sub2-$@-should-not-be-executed -installcheck installdirs tags TAGS mostlyclean: +installcheck installdirs tags mostlyclean: @: > sub2-$@-should-not-be-executed ## These targets cannot be overridden like this: ## install-strip distclean maintainer-clean @@ -142,12 +140,12 @@ check_targets () all install install-strip uninstall clean distclean check \ info html dvi pdf ps \ install-info install-html install-dvi install-pdf install-ps \ - installcheck installdirs tags TAGS mostlyclean maintainer-clean + installcheck installdirs tags mostlyclean maintainer-clean do $MAKE -n $target >stdout || { cat stdout; exit 1; } cat stdout case $target in - install-* | installdirs | tags | TAGS ) ;; + install-* | installdirs | tags ) ;; *) if $have_dotmake; then grep "stamp-$target$" stdout || exit 1 -- 1.7.10.4