diff options
author | Stefano Lattarini <stefano.lattarini@gmail.com> | 2012-06-12 14:48:12 +0200 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2012-07-02 15:02:59 +0200 |
commit | 3da1457d426f1be7b9f792fce1461a7b8227d7e7 (patch) | |
tree | 390a6401061fe9385ee81c18c692fb01c3459776 /t/recurs-user-deeply-nested.sh | |
parent | 097930059adbd5061a5f78e2b91e339f91a32a18 (diff) | |
download | automake-3da1457d426f1be7b9f792fce1461a7b8227d7e7.tar.gz |
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>
Diffstat (limited to 't/recurs-user-deeply-nested.sh')
-rwxr-xr-x | t/recurs-user-deeply-nested.sh | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/t/recurs-user-deeply-nested.sh b/t/recurs-user-deeply-nested.sh new file mode 100755 index 000000000..c9e5c1f5c --- /dev/null +++ b/t/recurs-user-deeply-nested.sh @@ -0,0 +1,97 @@ +#! /bin/sh +# Copyright (C) 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 <http://www.gnu.org/licenses/>. + +# Check that recursion on user-defined targets can be made to work +# with "deeply" nested uses of $(SUBDIRS). + +. ./defs || exit 1 + +cat >> configure.ac <<'END' +AC_CONFIG_FILES([ + sub1/Makefile + sub1/sub2/Makefile + sub1/sub2/sub3/Makefile + sub1/sub2/sub3/sub4/Makefile +]) +AM_EXTRA_RECURSIVE_TARGETS([foo]) +AC_OUTPUT +END + +dirs='sub1 sub1/sub2 sub1/sub2/sub3 sub1/sub2/sub3/sub4' + +mkdir $dirs + +cat > Makefile.am <<'END' +SUBDIRS = sub1 + +foo-local: + cp sub1/foo foo +MOSTLYCLEANFILES = foo + +.PHONY: test +test: + echo 'It works!' > exp + diff exp foo + diff exp sub1/foo + test ! -f sub1/sub2/foo + test ! -f sub1/sub2/sub3/foo + diff exp sub1/sub2/sub3/sub4/foo + rm -f exp + +all-local: foo +check-local: test +END + +cat > sub1/Makefile.am <<'END' +SUBDIRS = sub2 +foo-local: + test ! -f sub2/sub3/foo + cp sub2/sub3/sub4/foo foo +MOSTLYCLEANFILES = foo +END + +# Here we deliberately lack an explicit definition the 'foo-local' +# target; that shouldn't stop 'foo' recursion into subdirectory +# 'sub3/sub4'. +echo SUBDIRS = sub3 > sub1/sub2/Makefile.am +echo SUBDIRS = sub4 > sub1/sub2/sub3/Makefile.am + +cat > sub1/sub2/sub3/sub4/Makefile.am <<'END' +foo-local: + echo 'It works!' > foo +MOSTLYCLEANFILES = foo +END + +$ACLOCAL +$AUTOCONF +$AUTOMAKE + +for d in $dirs; do + $FGREP foo-am $d/Makefile.in || exit 1 + case $d in + */sub4);; + *) $FGREP foo-recursive $d/Makefile.in || exit 1;; + esac +done + +./configure + +$MAKE foo +$MAKE test + +$MAKE distcheck + +: |