recursion: support user-defined recursive targets
authorStefano Lattarini <stefano.lattarini@gmail.com>
Tue, 12 Jun 2012 12:48:12 +0000 (14:48 +0200)
committerStefano Lattarini <stefano.lattarini@gmail.com>
Mon, 2 Jul 2012 13:02:59 +0000 (15:02 +0200)
commit3da1457d426f1be7b9f792fce1461a7b8227d7e7
tree390a6401061fe9385ee81c18c692fb01c3459776
parent097930059adbd5061a5f78e2b91e339f91a32a18
recursion: support user-defined recursive targets

The user can now define his own recursive targets that recurse
in the directories specified in $(SUBDIRS).  That can be done by
specifying the name of such targets in invocations of the new
'AM_EXTRA_RECURSIVE_TARGETS' m4 macro.

The API goes like this:

    $ cat configure.ac
    AC_INIT([pkg-name], [1.0]
    AM_INIT_AUTOMAKE
    AM_EXTRA_RECURSIVE_TARGETS([foo])
    AC_CONFIG_FILES([Makefile sub/Makefile])
    AC_OUTPUT

    $ cat Makefile.am
    SUBDIRS = sub
    foo-local:
        @echo This will be run by "make foo".

    $ cat sub/Makefile.am
    foo-local:
        @echo This too will be run by a "make foo" issued either in
        @echo the 'sub/' directory or in the top-level directory.

Like for the "default" recursive targets (e.g., 'all' and 'check'),
the user-defined recursive targets descend in the $(SUBDIRS) in a
depth-first fashion, and process '.' last (unless that is explicitly
specified in $(SUBDIRS)).

* NEWS, doc/automake.texi: Document the new feature.
* automake.in (@extra_recursive_targets): New global variable.
(scan_autoconf_traces): Trace macro '_AM_EXTRA_RECURSIVE_TARGETS'.
(handle_user_recursion): New subroutine; among other things, it defines
the new internal '$(am__extra_recursive_targets)' make variable, and
the '*-am', '*-local' and '*-recursive' targets associated with the
user-specified user recursive targets.
(generate_makefile): Call the new subroutine.
* lib/am/subdirs.am (am__recursive_targets): New internal make variable,
listing all of '$(RECURSIVE_TARGETS)', '$(RECURSIVE_CLEAN_TARGETS)' and
'$(am__extra_recursive_targets)' together.
(AM_RECURSIVE_TARGETS): Adjust the definition of this variable ...
(.PHONY, .MAKE): ... and the list of dependencies of these special targets
to take advantage of the new '$(am__recursive_targets)' variable.
($(am__recursive_targets)): New targets, superseding ...
($(RECURSIVE_TARGETS), $(RECURSIVE_CLEAN_TARGETS)): ... these, and
inheriting their rules.  This way, the rules to handle recursion for
built-in recursive targets (e.g., 'all', 'dvi', 'clean') and for user
defined recursive targets are the same.
* m4/extra-recurs.m4: New file, contain definition of new macro
'AM_EXTRA_RECURSIVE_TARGETS' and '_AM_EXTRA_RECURSIVE_TARGETS'.
These macros are basically dummy, only used for tracing by automake.
* m4/Makefile.am (dist_automake_ac_DATA): Update.
* t/recurs-user.sh: New test.
* t/recurs-user2.sh: Likewise.
* t/recurs-user-deeply-nested.sh: Likewise.
* t/recurs-user-indir.sh: Likewise.
* t/recurs-user-keep-going.sh: Likewise.
* t/recurs-user-many.sh: Likewise.
* t/recurs-user-no-subdirs.sh: Likewise.
* t/recurs-user-no-top-level.sh: Likewise.
* t/recurs-user-override.sh: Likewise.
* t/recurs-user-phony.sh: Likewise.
* t/recurs-user-wrap.sh: Likewise.
* t/remake-recurs-user.sh: Likewise.
* t/list-of-tests.mk: Update.

Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
19 files changed:
Makefile.am
NEWS
automake.in
doc/automake.texi
lib/am/subdirs.am
m4/extra-recurs.m4 [new file with mode: 0644]
t/list-of-tests.mk
t/recurs-user-deeply-nested.sh [new file with mode: 0755]
t/recurs-user-indir.sh [new file with mode: 0755]
t/recurs-user-keep-going.sh [new file with mode: 0755]
t/recurs-user-many.sh [new file with mode: 0755]
t/recurs-user-no-subdirs.sh [new file with mode: 0755]
t/recurs-user-no-top-level.sh [new file with mode: 0755]
t/recurs-user-override.sh [new file with mode: 0755]
t/recurs-user-phony.sh [new file with mode: 0755]
t/recurs-user-wrap.sh [new file with mode: 0755]
t/recurs-user.sh [new file with mode: 0755]
t/recurs-user2.sh [new file with mode: 0755]
t/remake-recurs-user.sh [new file with mode: 0755]