From 57a8d0747edb61289edbb2ea2eeeabb1fa5d3f77 Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Fri, 10 Aug 2012 00:43:17 +0200 Subject: [PATCH] [ng] tags: rewrite to be included verbatim * lib/am/tags.am: Moved ... * lib/am/tags.mk: ... here, rewrite to be included verbatim, reformatted, and enhanced to take over the role of ... * automake.in (handle_tags): ... this function as well, which has thus been removed. (generate_makefile): Call the removed function no more. Include 'tags.mk' verbatim in the generated Makefile. * Makefile.am (dist_am_DATA): Adjust. * t/tags.sh: This weak grepping test is broken by the other changes done here; so remove it, adding ... * t/tags-id.sh: ... this in its place, which is more semantic, i.e., operated by actually running the 'ID' target. * t/tags2.sh: Remove as obsolete. * t/location.sh: Adjust to avoid spurious errors. * t/targetclash.sh: Likewise. Signed-off-by: Stefano Lattarini --- Makefile.am | 2 +- automake.in | 32 +--------- lib/am/{tags.am => tags.mk} | 122 +++++++++++++++++++----------------- t/location.sh | 8 +-- t/{tags.sh => tags-id.sh} | 19 +++++- t/tags2.sh | 42 ------------- t/targetclash.sh | 4 +- 7 files changed, 89 insertions(+), 140 deletions(-) rename lib/am/{tags.am => tags.mk} (62%) rename t/{tags.sh => tags-id.sh} (78%) delete mode 100755 t/tags2.sh diff --git a/Makefile.am b/Makefile.am index f85663cd6..d2f014f94 100644 --- a/Makefile.am +++ b/Makefile.am @@ -193,6 +193,7 @@ dist_am_DATA = \ lib/am/check-typos.mk \ lib/am/clean.mk \ lib/am/header-vars.mk \ + lib/am/tags.mk \ lib/am/compile.am \ lib/am/configure.am \ lib/am/data.am \ @@ -217,7 +218,6 @@ dist_am_DATA = \ lib/am/remake-hdr.am \ lib/am/scripts.am \ lib/am/subdirs.am \ - lib/am/tags.am \ lib/am/texi-vers.am \ lib/am/texi-spec.am \ lib/am/texinfos.am \ diff --git a/automake.in b/automake.in index 5acd4340a..c50e0ada4 100644 --- a/automake.in +++ b/automake.in @@ -3147,36 +3147,6 @@ sub handle_data 'pkgdata', 'lisp', 'noinst', 'check'); } -# Handle TAGS. -sub handle_tags -{ - define_variable ('am.tags.files', INTERNAL, - qw/$(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) - $(am.config-hdr.local.in)/); - - if (rvar('am.tags.files')->value_as_list_recursive - || var ('ETAGS_ARGS') || var ('SUBDIRS')) - { - $output_rules .= &file_contents ('tags', new Automake::Location); - set_seen 'TAGS_DEPENDENCIES'; - } - 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. Ditto ctags and - # cscope. - $output_rules .= - "tags TAGS:\n\n" . - "ctags CTAGS:\n\n" . - "cscope cscopelist:\n\n"; - } -} - - # user_phony_rule ($NAME) # ----------------------- # Return false if rule $NAME does not exist. Otherwise, @@ -6788,9 +6758,9 @@ sub generate_makefile ($$) handle_man_pages; handle_data; handle_headers; + verbatim ('tags'); handle_subdirs; handle_user_recursion; - handle_tags; handle_minor_options; # Must come after invocation of handle_programs, handle_libraries and diff --git a/lib/am/tags.am b/lib/am/tags.mk similarity index 62% rename from lib/am/tags.am rename to lib/am/tags.mk index bd7e2c7ff..aebd8b699 100644 --- a/lib/am/tags.am +++ b/lib/am/tags.mk @@ -14,6 +14,22 @@ ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . +# 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. Ditto for ctags and cscope. +.PHONY: tags TAGS ctags CTAGS cscope cscopelist + +am.tags.files = \ + $(call am.memoize,am.tags.files,$(strip \ + $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) $(am.config-hdr.local.in))) + +# Let's see if we have to actually deal with tags creation. +ifneq ($(or $(am.tags.files),$(ETAGS_ARGS),$(SUBDIRS)),) + +# ---------------------------------- # +# Tags-related internal variables. # +# ---------------------------------- # + # Use $(sort) rather than $(am.util.uniq) here, because the former is # faster on long lists, and we don't care about the order of the list # anyway. @@ -37,75 +53,70 @@ am.tags.subfiles = \ $(call am.memoize,am.tags.subfiles,$(strip \ $(foreach d,$(filter-out .,$(SUBDIRS)),$(wildcard $d/TAGS)))) -## ---- ## -## ID. ## -## ---- ## + +# ---------------------------------- # +# ID database (from GNU id-utils). # +# ---------------------------------- # ID: $(am.tags.files) mkid -fID $(am.tags.files.unique) +am.clean.dist.f += ID -## ------ ## -## TAGS. ## -## ------ ## +# -------------------------------- # +# GNU Etags and Exuberant ctags. # +# -------------------------------- # +CTAGS = ctags ETAGS = etags -.PHONY: TAGS tags -if %?SUBDIRS% -AM_RECURSIVE_TARGETS += TAGS -RECURSIVE_TARGETS += tags-recursive + +ifdef SUBDIRS +AM_RECURSIVE_TARGETS += TAGS CTAGS +RECURSIVE_TARGETS += tags-recursive ctags-recursive +ctags: ctags-recursive tags: tags-recursive -else !%?SUBDIRS% +else tags: tags-am -endif !%?SUBDIRS% +ctags: ctags-am +endif + TAGS: tags +CTAGS: ctags +.PHONY: TAGS tags CTAGS ctags tags-am: $(TAGS_DEPENDENCIES) $(am.tags.files) -## Make sure we have something to run etags on. - test -z '$(ETAGS_ARGS)$(am.tags.subfiles)$(am.tags.files.unique)' || { \ - $(ETAGS) \ - $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $(foreach f,$(am.tags.subfiles),'$(am.tags.include-option)=$(CURDIR)/$f') \ - $(am.tags.files.unique); \ - } - +ifneq ($(or $(ETAGS_ARGS),$(am.tags.subfiles),$(am.tags.files.unique)),) + $(ETAGS) \ + $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $(foreach f,$(am.tags.subfiles),'$(am.tags.include-option)=$(CURDIR)/$f') \ + $(am.tags.files.unique) +endif -## --------------- ## -## vi-style tags. ## -## --------------- ## - -CTAGS = ctags -.PHONY: CTAGS ctags -if %?SUBDIRS% -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.tags.files) -## Make sure we have something to run ctags on. - test -z "$(CTAGS_ARGS)$(am.tags.files.unique)" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $(am.tags.files.unique) +ifneq ($(or $(CTAGS_ARGS),$(am.tags.files.unique)),) + $(CTAGS) \ + $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $(am.tags.files.unique) +endif +am.clean.dist.f += TAGS tags -## --------------- ## -## "Global tags". ## -## --------------- ## + +# -------------------- # +# GNU "Global tags". # +# -------------------- # .PHONY: GTAGS GTAGS: cd $(top_srcdir) && gtags -i $(GTAGS_ARGS) '$(abs_top_builddir)' +am.clean.dist.f += GTAGS GRTAGS GSYMS -## ------- ## -## cscope ## -## ------- ## +# --------- # +# Cscope. # +# --------- # -if %?TOPDIR_P% +ifdef am.conf.is-topdir CSCOPE = cscope .PHONY: cscope clean-cscope AM_RECURSIVE_TARGETS += cscope @@ -115,14 +126,15 @@ cscope: cscope.files clean-cscope: rm -f cscope.files cscope.files: clean-cscope cscopelist -endif %?TOPDIR_P% +am.clean.dist.f += cscope.out cscope.in.out cscope.po.out cscope.files +endif -if %?SUBDIRS% +ifdef SUBDIRS RECURSIVE_TARGETS += cscopelist-recursive cscopelist: cscopelist-recursive -else !%?SUBDIRS% +else cscopelist: cscopelist-am -endif !%?SUBDIRS% +endif cscopelist-am: $(am.tags.files) list='$(am.tags.files)'; \ @@ -138,12 +150,4 @@ cscopelist-am: $(am.tags.files) fi; \ done >> $(top_builddir)/cscope.files - -## ---------- ## -## Cleaning. ## -## ---------- ## - -am.clean.dist.f += TAGS ID GTAGS GRTAGS GSYMS GPATH tags -if %?TOPDIR_P% -am.clean.dist.f += cscope.out cscope.in.out cscope.po.out cscope.files -endif %?TOPDIR_P% +endif # Dealing with tags. diff --git a/t/location.sh b/t/location.sh index dab1e330f..424904be4 100755 --- a/t/location.sh +++ b/t/location.sh @@ -32,7 +32,7 @@ if COND2 lib_LIBRARIES = libfoo.a endif if COND1 - bin_PROGRAMS += ctags + bin_PROGRAMS += distdir endif VAR = 1 \ 2 \ @@ -77,9 +77,9 @@ sed 's/^> //' > expected << 'END' > Makefile.am:1: while processing program 'libfoo.a' > library.am: ... 'libfoo.a' previously defined here > Makefile.am:3: while processing library 'libfoo.a' -> tags.am: warning: redefinition of 'ctags' ... -> program.am: ... 'ctags$(EXEEXT)' previously defined here -> Makefile.am:6: while processing program 'ctags' +> distdir.am: warning: redefinition of 'distdir' ... +> program.am: ... 'distdir$(EXEEXT)' previously defined here +> Makefile.am:6: while processing program 'distdir' END cat expected diff --git a/t/tags.sh b/t/tags-id.sh similarity index 78% rename from t/tags.sh rename to t/tags-id.sh index 8f38e6be8..9032125fc 100755 --- a/t/tags.sh +++ b/t/tags-id.sh @@ -17,13 +17,30 @@ # Test for bug reported by Harlan Stenn: the tags target doesn't work # when there are only headers in a directory. +required=mkid . ./defs || exit 1 +echo AC_OUTPUT >> configure.ac + cat > Makefile.am << 'END' noinst_HEADERS = iguana.h +test-id: ID + test -f $(srcdir)/iguana.h + test -f ID +check-local: test-id +END + +cat > iguana.h << 'END' +#define FOO "bar" +int zap (int x, char y); END $ACLOCAL +$AUTOCONF $AUTOMAKE -grep '^ID:' Makefile.in +./configure +$MAKE test-id +$MAKE distcheck + +: diff --git a/t/tags2.sh b/t/tags2.sh deleted file mode 100755 index 521d2ef2b..000000000 --- a/t/tags2.sh +++ /dev/null @@ -1,42 +0,0 @@ -#! /bin/sh -# Copyright (C) 2010-2012 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# TAGS_DEPENDENCIES only make sense if other tag-worthy things (such as -# sources) exist. - -. ./defs || exit 1 - -cat >> configure.ac << 'END' -AC_PROG_CC -AC_OUTPUT -END - -cat >Makefile.am << 'END' -TAGS_DEPENDENCIES = foo -END - -$ACLOCAL -AUTOMAKE_fails -grep 'define.*TAGS_DEPENDENCIES.*without' stderr - -cat >>Makefile.am << 'END' -bin_PROGRAMS = bar -END - -AUTOMAKE_run -grep 'define.*TAGS_DEPENDENCIES.*without' stderr && exit 1 - -: diff --git a/t/targetclash.sh b/t/targetclash.sh index 031cbc151..9c71007e7 100755 --- a/t/targetclash.sh +++ b/t/targetclash.sh @@ -23,11 +23,11 @@ AC_PROG_CC END cat > Makefile.am << 'END' -bin_PROGRAMS = ctags +bin_PROGRAMS = distdir END $ACLOCAL AUTOMAKE_fails -a -grep 'redefinition.*ctags' stderr +grep 'redefinition.*distdir' stderr : -- 2.47.2