automake-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Automake-commit] [SCM] GNU Automake branch, maint, updated. v1.12.1-16-


From: Stefano Lattarini
Subject: [Automake-commit] [SCM] GNU Automake branch, maint, updated. v1.12.1-16-g620362c
Date: Mon, 11 Jun 2012 16:49:17 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Automake".

http://git.sv.gnu.org/gitweb/?p=automake.git;a=commitdiff;h=620362cdebb4bbc855fd58e3d0a525110257a7bf

The branch, maint has been updated
       via  620362cdebb4bbc855fd58e3d0a525110257a7bf (commit)
       via  ec6a135799b9aa5da33130abeabad6fc8cd324b1 (commit)
       via  af5d52b7862e2e49ae38b8060b6aa778f709d537 (commit)
       via  06dfdbe38e78c5eedb03f688f0264ec0097a4e21 (commit)
       via  98b96fccc5df7166a0efc02881a13fbb84e29af6 (commit)
       via  0e489645fa27397850eeebf29838b368e3400d31 (commit)
      from  066c8cadf20ada22b922a1f0a8ba49c2f0d20f0b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 620362cdebb4bbc855fd58e3d0a525110257a7bf
Merge: ec6a135 06dfdbe
Author: Stefano Lattarini <address@hidden>
Date:   Mon Jun 11 17:35:35 2012 +0200

    Merge branches 'subdirs-simplify' and 'subdir-objects-pr10697' into maint
    
    * subdirs-simplify:
      subdirs: unify rules for "cleaning" and "normal" recursive targets
      tests: add a "demo" test on C support
    
    * subdir-objects-pr10697:
      subdir-objects: improve "make mostlyclean" efficiency and flexibility
      tests: look for '.lo' rather than '.o' object when using Libtool with C++
      cosmetics: few typofixes in older ChangeLogs, suggested by "codespell.py"
    
    Signed-off-by: Stefano Lattarini <address@hidden>

commit ec6a135799b9aa5da33130abeabad6fc8cd324b1
Author: Stefano Lattarini <address@hidden>
Date:   Sun Jun 10 23:08:07 2012 +0200

    subdirs: unify rules for "cleaning" and "normal" recursive targets
    
    Before this change, the recursive invocation of cleaning targets in
    the $(SUBDIRS) where done in inverse order, i.e., starting from the
    last $(SUBDIRS) entry and proceeding towards the first.  According
    to the code comments, this was done ...
    
        ... in an attempt to alleviate a problem that can happen when
        dependencies are enabled.  In this case, the .P file in one
        directory can depend on some automatically generated header
        in an earlier directory.  Since the dependencies are required
        before any target is examined, make bombs.
    
    But this comment does not apply anymore to the current implementation
    of automatic dependency tracking: the '.Po' and '.Plo' files does not
    depend on any C header or source file, ever!
    
    So it seems that the distinction between "normal" and "cleaning"
    recursive targets is a stale leftover of an older implementation of
    the automatic dependency tracking.  In fact, the Automake History
    manual seems to confirm this suspect; the section "First Take on
    Dependency Tracking" reads:
    
        Because each .P file was a dependency of Makefile, this meant
        that dependency tracking was done eagerly by make.  For instance,
        "make clean" would cause all the dependency files to be updated,
        and then immediately removed.  This eagerness also caused problems
        with some configurations; if a certain source file could not be
        compiled on a given architecture for some reason, dependency
        tracking would fail, aborting the entire build.
    
    and the following section "Dependencies As Side Effects" reads:
    
        In this approach, the .P files were included using the -include
        command, which let us create these files lazily.  This avoided
        the "make clean" problem.
    
    So the distinction between "normal" and "cleaning" recursive targets
    has likely been obsolete since by then already.  We can thus remove
    such distinction, thus reducing some complications and duplication in
    our rules.  Doing so, the whole testsuite still passes (both with GCC
    and Sun C 5.9), even the test 'c-demo.sh', which, among the other
    things, exercise the setup described in the obsolete code comment
    referenced above.
    
    Finally, note that we still keep '$(RECURSIVE_CLEAN_TARGETS)' and
    '$(RECURSIVE_TARGETS)' as two distinct variables, to ensure a better
    backward-compatibility for any user-defined rules that happen to use
    those variables.
    
    * NEWS: Update.
    * lib/am/subdirs.am ($(RECURSIVE_CLEAN_TARGETS), $(CLEAN_TARGETS)):
    Merge their recipes.
    * t/subdir-distclean.sh: New test, check that "./configure && make
    && make distclean" is actually a no-op, even when conditional SUBDIRS
    are involved.
    * t/list-of-tests.mk: Add it.
    
    Signed-off-by: Stefano Lattarini <address@hidden>

commit af5d52b7862e2e49ae38b8060b6aa778f709d537
Author: Stefano Lattarini <address@hidden>
Date:   Mon Jun 11 00:49:18 2012 +0200

    tests: add a "demo" test on C support
    
    Showing and testing non-trivial use of C support, and its interaction
    with other features.
    
    * t/c-demo.sh: New test.
    * t/list-of-tests.mk: Add it.
    
    Signed-off-by: Stefano Lattarini <address@hidden>

commit 06dfdbe38e78c5eedb03f688f0264ec0097a4e21
Author: Stefano Lattarini <address@hidden>
Date:   Sun Jun 10 13:38:58 2012 +0200

    subdir-objects: improve "make mostlyclean" efficiency and flexibility
    
    Fixes automake bug#10697.
    
    Before this change, the generated Makefile issued one 'rm' invocation
    for each subdir object file.  Not only was this very inefficient when
    there were several such files, but it also caused stale object files
    to be left behind when a source file was renamed or removed.
    
    * automake.in (handle_single_transform): When a subdir object is seen,
    update '%compile_clean_files' to clean all the compiled objects in its
    same subdirectory, and all the libtool compiled objects ('.lo') there
    as well is that subdir object is a libtool one.
    * t/subobj-clean-pr10697.sh: New test.
    * t/subobj-clean-lt-pr10697.sh: Likewise.
    * t/list-of-tests.mk: Add them.
    * NEWS: Update.
    
    Signed-off-by: Stefano Lattarini <address@hidden>

-----------------------------------------------------------------------

Summary of changes:
 NEWS                         |   16 ++++
 automake.in                  |   28 ++++---
 lib/am/subdirs.am            |   54 ++-----------
 t/c-demo.sh                  |  179 ++++++++++++++++++++++++++++++++++++++++++
 t/list-of-tests.mk           |    4 +
 t/subdir-distclean.sh        |  103 ++++++++++++++++++++++++
 t/subobj-clean-lt-pr10697.sh |  169 +++++++++++++++++++++++++++++++++++++++
 t/subobj-clean-pr10697.sh    |  164 ++++++++++++++++++++++++++++++++++++++
 8 files changed, 660 insertions(+), 57 deletions(-)
 create mode 100755 t/c-demo.sh
 create mode 100755 t/subdir-distclean.sh
 create mode 100755 t/subobj-clean-lt-pr10697.sh
 create mode 100755 t/subobj-clean-pr10697.sh

diff --git a/NEWS b/NEWS
index fd52dea..b61d58a 100644
--- a/NEWS
+++ b/NEWS
@@ -60,6 +60,22 @@ New in 1.12.2:
     input file.  Such a warning will also be present in the next
     Autoconf version (2.70).
 
+* Cleaning rules:
+
+  - Recursive cleaning rules descends into the $(SUBDIRS) in the natural
+    order (as done by the other recursive rules), rather than in the
+    inverse order.  They used to do that in order to work a round a
+    limitation in an older implementation of the automatic dependency
+    tracking support, but that limitation had been lifted years ago
+    already, when the automatic dependency tracking based on side-effects
+    of compilation had been introduced.
+
+  - Cleaning rules for compiled objects (both "plain" and libtool) work
+    better when subdir objects are involved, not triggering a distinct
+    'rm' invocation for each such object.  They do so by removing *any*
+    compiled object file that is in the same directory of a subdir
+    object.  See automake bug#10697.
+
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 New in 1.12.1:
diff --git a/automake.in b/automake.in
index 5cf5a2c..6f8ac0c 100644
--- a/automake.in
+++ b/automake.in
@@ -1963,18 +1963,22 @@ sub handle_single_transform ($$$$$%)
                    err_am "'$full' should not contain a '..' component";
                  }
 
-               # Make sure object is removed by 'make mostlyclean'.
-               $compile_clean_files{$object} = MOSTLY_CLEAN;
-               # If we have a libtool object then we also must remove
-               # the ordinary .o.
-               if ($object =~ /\.lo$/)
-               {
-                   (my $xobj = $object) =~ s,lo$,\$(OBJEXT),;
-                   $compile_clean_files{$xobj} = MOSTLY_CLEAN;
-
-                   # Remove any libtool object in this directory.
-                   $libtool_clean_directories{$directory} = 1;
-               }
+                # Make sure *all* objects files in the subdirectory are
+                # removed by "make mostlyclean".  Not only this is more
+                # efficient than listing the object files to be removed
+                # individually (which would cause an 'rm' invocation for
+                # each of them -- very inefficient, see bug#10697), it
+                # would also leave stale object files in the subdirectory
+                # whenever a source file there is removed or renamed.
+                $compile_clean_files{"$directory/*.\$(OBJEXT)"} = MOSTLY_CLEAN;
+                if ($object =~ /\.lo$/)
+                  {
+                    # If we have a libtool object, then we also must remove
+                    # any '.lo' objects in its same subdirectory.
+                    $compile_clean_files{"$directory/*.lo"} = MOSTLY_CLEAN;
+                    # Remember to cleanup .libs/ in this directory.
+                    $libtool_clean_directories{$directory} = 1;
+                  }
 
                push (@dep_list, require_build_directory ($directory));
 
diff --git a/lib/am/subdirs.am b/lib/am/subdirs.am
index 1d1295e..3fc2888 100644
--- a/lib/am/subdirs.am
+++ b/lib/am/subdirs.am
@@ -32,7 +32,7 @@ AM_RECURSIVE_TARGETS += $(RECURSIVE_TARGETS:-recursive=) \
 #     (which will cause the Makefiles to be regenerated when you run 'make');
 # (2) otherwise, pass the desired values on the 'make' command line.
 
-$(RECURSIVE_TARGETS):
+$(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS):
 ## Using $failcom allows "-k" to keep its natural meaning when running a
 ## recursive rule.
        @fail= failcom='exit 1'; \
@@ -44,7 +44,14 @@ $(RECURSIVE_TARGETS):
        done; \
        dot_seen=no; \
        target=`echo $@ | sed s/-recursive//`; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
+## For distclean and maintainer-clean we make sure to use the full
+## list of subdirectories.  We do this so that 'configure; make
+## distclean' really is a no-op, even if SUBDIRS is conditional.
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
          echo "Making $$target in $$subdir"; \
          if test "$$subdir" = "."; then \
            dot_seen=yes; \
@@ -65,46 +72,3 @@ clean: clean-recursive
 distclean: distclean-recursive
 maintainer-clean: maintainer-clean-recursive
 
-## We run all 'clean' targets in reverse order.  Why?  It's an attempt
-## to alleviate a problem that can happen when dependencies are
-## enabled.  In this case, the .P file in one directory can depend on
-## some automatically generated header in an earlier directory.  Since
-## the dependencies are required before any target is examined, make
-## bombs.
-$(RECURSIVE_CLEAN_TARGETS):
-## Using $failcom allows "-k" to keep its natural meaning when running a
-## recursive rule.
-       @fail= failcom='exit 1'; \
-       for f in x $$MAKEFLAGS; do \
-         case $$f in \
-           *=* | --[!k]*);; \
-           *k*) failcom='fail=yes';; \
-         esac; \
-       done; \
-       dot_seen=no; \
-## For distclean and maintainer-clean we make sure to use the full
-## list of subdirectories.  We do this so that 'configure; make
-## distclean' really is a no-op, even if SUBDIRS is conditional.  For
-## other clean targets this doesn't matter.
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       rev=''; for subdir in $$list; do \
-         if test "$$subdir" = "."; then :; else \
-           rev="$$subdir $$rev"; \
-         fi; \
-       done; \
-## Always do '.' last.
-       rev="$$rev ."; \
-       target=`echo $@ | sed s/-recursive//`; \
-       for subdir in $$rev; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done && test -z "$$fail"
diff --git a/t/c-demo.sh b/t/c-demo.sh
new file mode 100755
index 0000000..ed2a109
--- /dev/null
+++ b/t/c-demo.sh
@@ -0,0 +1,179 @@
+#! /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/>.
+
+# Demo on C support, also testing automatic dependency tracking,
+# conditional SUBDIRS and convenience libraries.
+
+required=cc
+am_create_testdir=empty
+. ./defs || Exit 1
+
+cat > configure.ac << 'END'
+AC_INIT([GNU C Demo], [22.3.2], address@hidden)
+AC_CONFIG_SRCDIR([tests/test.test])
+AC_CONFIG_AUX_DIR([build-aux])
+AM_INIT_AUTOMAKE
+AC_PROG_CC
+AM_PROG_CC_C_O
+AM_PROG_AR
+AC_PROG_RANLIB
+AM_CONDITIONAL([RUN_TESTS], [test x"$run_tests" != x"no"])
+AC_CONFIG_FILES([Makefile src/Makefile lib/Makefile tests/Makefile])
+AC_OUTPUT
+END
+
+if cross_compiling; then
+  run_tests=no
+else
+  run_tests=yes
+fi
+export run_tests
+
+mkdir build-aux lib src tests
+
+cat > Makefile.am <<'END'
+SUBDIRS = lib src
+
+if RUN_TESTS
+SUBDIRS += tests
+endif
+
+.PHONY: test-objs
+check-local: test-objs
+test-objs:
+       test -f src/zardoz-main.$(OBJEXT)
+       test -f lib/foo.$(OBJEXT)
+       test -f lib/bar.$(OBJEXT)
+END
+
+cat > src/Makefile.am << 'END'
+bin_PROGRAMS = zardoz
+zardoz_SOURCES = main.c
+zardoz_LDADD = $(top_builddir)/lib/lib-convenience.a
+zardoz_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib
+END
+
+cat > lib/Makefile.am << 'END'
+noinst_LIBRARIES = lib-convenience.a
+lib_convenience_a_SOURCES = foo.c
+lib_convenience_a_SOURCES += bar.c
+dist_lib_convenience_a_SOURCES = bar.h
+nodist_lib_convenience_a_SOURCES = foo.h
+
+# We want this to be auto-generated an removed by "make clean", to
+# ensure that cleaning rules work correctly; an older implementation
+# of automatic dependency tracking support suffered of weaknesses in
+# this situation, see the "historical comments" reported in:
+# http://lists.gnu.org/archive/html/automake-patches/2012-06/msg00033.html
+foo.h: $(srcdir)/foo.c
+       sed -n 's/.*foo *(.*/&;/p' "$(srcdir)/foo.c" >address@hidden
+       test 1 -eq `wc -l <address@hidden
+       chmod a-w address@hidden && mv -f address@hidden $@
+BUILT_SOURCES = foo.h
+CLEANFILES = $(BUILT_SOURCES)
+
+check-local:
+       test -f ${top_srcdir}/tests/test.test
+END
+
+cat > tests/Makefile.am << 'END'
+AUTOMAKE_OPTIONS = parallel-tests
+TEST_LOG_COMPILER = $(SHELL)
+TESTS = test.test
+EXTRA_DIST = $(TESTS)
+END
+
+cat > tests/test.test << 'END'
+#!/bin/sh
+set -x; set -e;
+../src/zardoz
+test "`../src/zardoz`" = 'Foo, Bar!'
+END
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE --add-missing
+
+test -f build-aux/depcomp
+test -f build-aux/compile # We have per-target flags on C sources.
+
+# Don't reject slow dependency extractors.
+./configure --enable-dependency-tracking
+
+cat > src/main.c << 'END'
+#include "foo.h"
+#include "bar.h"
+int main (void)
+{
+  printf ("%s, %s!\n", foo (), bar ());
+  return 0;
+}
+END
+
+cat > lib/foo.c << 'END'
+#include "foo.h"
+static char s[4];
+volatile char *foo (void)
+{
+  s[0] = 'F';
+  s[1] = s[2] = 'o';
+  s[3] = '\0';
+  return s;
+}
+END
+
+cat > lib/bar.c << 'END'
+#include "bar.h"
+const char *bar (void)
+{
+  return BARBAR;
+}
+END
+
+cat > lib/bar.h << 'END'
+#define BARBAR "Bar"
+const char *bar (void);
+END
+
+$MAKE
+ls -l . src lib # For debugging.
+$MAKE test-objs
+
+VERBOSE=x $MAKE check
+if cross_compiling; then
+  test ! -f tests/test-suite.log
+  test ! -f tests/test.log
+else
+  test -f tests/test-suite.log
+  grep 'Foo, Bar!' tests/test.log
+fi
+
+$MAKE distcheck
+
+if ! cross_compiling && ! grep "[ $tab]depmode=none" Makefile; then
+  # Let's check automatic dependency tracking.
+  sed 's/^\(#define BARBAR \).*/\1 "Zap"/'  lib/bar.h > t
+  mv -f t lib/bar.h
+  $MAKE
+  ./src/zardoz
+  test "`./src/zardoz`" = 'Foo, Zap!'
+fi
+
+$MAKE clean
+test ! -f lib/foo.h
+test -f lib/bar.h
+
+:
diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index 446157c..93b50c6 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -329,6 +329,7 @@ t/copy.sh \
 t/cscope.tap \
 t/cscope2.sh \
 t/cscope3.sh \
+t/c-demo.sh \
 t/cxx.sh \
 t/cxx2.sh \
 t/cxxcpp.sh \
@@ -1026,6 +1027,7 @@ t/subdir7.sh \
 t/subdir8.sh \
 t/subdir9.sh \
 t/subdir10.sh \
+t/subdir-distclean.sh \
 t/subdirbuiltsources.sh \
 t/subcond.sh \
 t/subcond2.sh \
@@ -1043,6 +1045,8 @@ t/subobj11a.sh \
 t/subobj11b.sh \
 t/subobj11c.sh \
 t/subobjname.sh \
+t/subobj-clean-pr10697.sh \
+t/subobj-clean-lt-pr10697.sh \
 t/subpkg.sh \
 t/subpkg2.sh \
 t/subpkg3.sh \
diff --git a/t/subdir-distclean.sh b/t/subdir-distclean.sh
new file mode 100755
index 0000000..df89420
--- /dev/null
+++ b/t/subdir-distclean.sh
@@ -0,0 +1,103 @@
+#! /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 "./configure && make && make distclean" is actually a
+# no-op, even when conditional SUBDIRS are involved.
+
+. ./defs || Exit 1
+
+cat >> configure.ac << 'END'
+AC_CONFIG_FILES([sub1/Makefile sub2/Makefile sub1/subsub/Makefile])
+AM_CONDITIONAL([COND], [false])
+AC_SUBST([extra_subdirs], [''])
+AC_OUTPUT
+END
+
+mkdir sub1 sub2 sub1/subsub
+
+cat > Makefile.am << 'END'
+SUBDIRS = sub1
+if COND
+SUBDIRS += sub2
+endif
+END
+
+cat > sub1/Makefile.am << 'END'
+all-local:
+       : > run
+CLEANFILES = run
+SUBDIRS = @extra_subdirs@
+DIST_SUBDIRS = subsub
+END
+
+cat > sub2/Makefile.am << 'END'
+all-local:
+       @echo "Should not run in `pwd`!"
+       exit 1
+DISTCLEANFILES = oops
+END
+cp sub2/Makefile.am sub1/subsub/Makefile.am
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE -c --add-missing
+
+./configure
+
+test -f sub1/Makefile
+test -f sub2/Makefile
+test -f sub1/subsub/Makefile
+
+$MAKE
+test -f sub1/run
+touch sub2/oops sub1/subsub/oops
+
+$MAKE distclean
+test ! -f sub1/run
+test ! -f sub2/oops
+test ! -f sub1/subsub/oops
+test ! -f sub1/Makefile
+test ! -f sub2/Makefile
+test ! -f sub1/subsub/Makefile
+
+mkdir build
+cd build
+
+../configure
+
+$MAKE
+
+test -f sub1/Makefile
+test -f sub2/Makefile
+test -f sub1/subsub/Makefile
+
+test -f sub1/run
+touch sub2/oops sub1/subsub/oops
+
+$MAKE -j4 maintainer-clean
+test ! -f sub1/run
+test ! -f sub2/oops
+test ! -f sub1/subsub/oops
+test ! -f sub1/Makefile
+test ! -f sub2/Makefile
+test ! -f sub1/subsub/Makefile
+
+cd ..
+
+./configure
+$MAKE distclean
+
+:
diff --git a/t/subobj-clean-lt-pr10697.sh b/t/subobj-clean-lt-pr10697.sh
new file mode 100755
index 0000000..95a732c
--- /dev/null
+++ b/t/subobj-clean-lt-pr10697.sh
@@ -0,0 +1,169 @@
+#! /bin/sh
+# Copyright (C) 1998-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/>.
+
+# Removing subdir objects does not cause too much 'rm' invocations.
+# Also, if we rename a source file in a subdirectory, the stale
+# compiled object corresponding to the old name still gets removed
+# by "make mostlyclean".  See automake bug#10697.
+# This is the libtool case.  Keep this test in sync with sister test
+# 'subobj-clean-pr10697.sh', which deals with the non-libtool case.
+
+required='cc libtoolize'
+. ./defs || Exit 1
+
+cat >> configure.ac << 'END'
+AM_PROG_AR
+AC_PROG_LIBTOOL
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_OUTPUT
+END
+
+oPATH=$PATH
+ocwd=`pwd` || fatal_ "getting current working directory"
+
+# An rm(1) wrapper that fails when invoked too many times.
+mkdir rm-wrap
+max_rm_invocations=6
+count_file=$ocwd/rm-wrap/count
+cat > rm-wrap/rm <<END
+#!/bin/sh
+set -e
+count=\`cat '$count_file'\`
+count=\`expr \$count + 1\`
+if test \$count -le $max_rm_invocations; then :; else
+  echo "rm invoked more than $max_rm_invocations times" >&2
+  exit 1
+fi
+echo "\$count" > '$count_file'
+PATH='$oPATH'; export PATH
+exec rm "\$@"
+END
+chmod a+x rm-wrap/rm
+echo "0" > rm-wrap/count
+
+cat > Makefile.am <<'END'
+.PHONY: sanity-check-rm
+sanity-check-rm:
+       rm -f 1
+       rm -f 2
+       rm -f 3
+       rm -f 4
+       rm -f 5
+       rm -f 6
+       rm -f x && exit 1; :
+       echo "0" > rm-wrap/count
+
+AUTOMAKE_OPTIONS = subdir-objects
+lib_LTLIBRARIES = libfoo.la
+libfoo_la_SOURCES = \
+  sub1/a.c \
+  sub1/b.c \
+  sub1/c.c \
+  sub1/d.c \
+  sub1/e.c \
+  sub1/f.c \
+  sub2/a.c \
+  sub2/b.c \
+  sub2/c.c \
+  sub2/d.c \
+  sub2/e.c \
+  sub2/f.c \
+  main.c
+END
+
+mkdir sub1 sub2
+echo 'int libmain (void)' > main.c
+echo '{' >> main.c
+for i in 1 2; do
+  for j in a b c d e f; do
+    echo "void $j$i (void) { }" > sub$i/$j.c
+    echo "  $j$i ();" >> main.c
+  done
+done
+echo '  return 0;' >> main.c
+echo '}' >> main.c
+cat main.c # For debugging.
+
+libtoolize
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE -a
+
+./configure
+
+# The use of this variable is only meant to keep us better in sync
+# with the sister test 'subobj-clean-pr10697.sh'.
+OBJEXT=lo
+
+$MAKE
+
+# This must go after configure, since that will invoke rm many times.
+PATH=$ocwd/rm-wrap:$PATH; export PATH
+$MAKE sanity-check-rm || fatal_ "rm wrapper doesn't work as expected"
+
+$MAKE mostlyclean
+ls -l . sub1 sub2
+for i in 1 2; do
+  for j in a b c d e f; do
+    test ! -f sub$i/$j.o
+    test ! -f sub$i/$j.obj
+    test ! -f sub$i/$j.lo
+    test -f sub$i/$j.c || Exit 99 # Sanity check
+  done
+done
+
+PATH=$oPATH; export PATH
+rm -rf rm-wrap
+
+$MAKE clean
+$MAKE
+test -f sub1/a.$OBJEXT
+test -f sub2/d.$OBJEXT
+
+mv -f sub2/d.c sub2/x.c
+rm -f sub1/a.c
+
+sed -e '/ a1 ()/d' main.c > t
+mv -f t main.c
+
+sed -e '/sub1\/a\.c/d' -e 's|sub2/d\.c|sub2/x.c|' Makefile.am > t
+mv -f t Makefile.am
+
+using_gmake || $MAKE Makefile
+$MAKE
+test -f sub2/x.$OBJEXT
+
+# The stale objects are still there after a mere "make all" ...
+test -f sub1/a.$OBJEXT
+test -f sub2/a.$OBJEXT
+
+# ... but they get removed by "make mostlyclean" ...
+$MAKE mostlyclean
+test ! -f sub1/a.$OBJEXT
+test ! -f sub2/d.$OBJEXT
+
+# ... and do not get rebuilt ...
+$MAKE clean
+$MAKE all
+test ! -f sub1/a.$OBJEXT
+test ! -f sub2/d.$OBJEXT
+
+# ... while the non-stale files do.
+test -f sub1/b.$OBJEXT
+test -f sub2/x.$OBJEXT
+
+:
diff --git a/t/subobj-clean-pr10697.sh b/t/subobj-clean-pr10697.sh
new file mode 100755
index 0000000..3b51cf1
--- /dev/null
+++ b/t/subobj-clean-pr10697.sh
@@ -0,0 +1,164 @@
+#! /bin/sh
+# Copyright (C) 1998-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/>.
+
+# Removing subdir objects does not cause too much 'rm' invocations.
+# Also, if we rename a source file in a subdirectory, the stale
+# compiled object corresponding to the old name still gets removed by
+# "make mostlyclean".  See automake bug#10697.
+# This is the non-libtool case.  Keep this test in sync with sister test
+# 'subobj-clean-lt-pr10697.sh', which deals with the libtool case.
+
+required=cc
+. ./defs || Exit 1
+
+cat >> configure.ac << 'END'
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_CONFIG_FILES([get-objext.sh:get-objext.in])
+AC_OUTPUT
+END
+
+echo "OBJEXT='@OBJEXT@'" > get-objext.in
+
+oPATH=$PATH
+ocwd=`pwd` || fatal_ "getting current working directory"
+
+# An rm(1) wrapper that fails when invoked too many times.
+mkdir rm-wrap
+max_rm_invocations=3
+count_file=$ocwd/rm-wrap/count
+cat > rm-wrap/rm <<END
+#!/bin/sh
+set -e
+count=\`cat '$count_file'\`
+count=\`expr \$count + 1\`
+if test \$count -le $max_rm_invocations; then :; else
+  echo "rm invoked more than $max_rm_invocations times" >&2
+  exit 1
+fi
+echo "\$count" > '$count_file'
+PATH='$oPATH'; export PATH
+exec rm "\$@"
+END
+chmod a+x rm-wrap/rm
+echo "0" > rm-wrap/count
+
+cat > Makefile.am <<'END'
+.PHONY: sanity-check-rm
+sanity-check-rm:
+       rm -f 1
+       rm -f 2
+       rm -f 3
+       rm -f x && exit 1; :
+       echo "0" > rm-wrap/count
+
+AUTOMAKE_OPTIONS = subdir-objects
+bin_PROGRAMS = foo
+foo_SOURCES = \
+  sub1/a.c \
+  sub1/b.c \
+  sub1/c.c \
+  sub1/d.c \
+  sub1/e.c \
+  sub1/f.c \
+  sub2/a.c \
+  sub2/b.c \
+  sub2/c.c \
+  sub2/d.c \
+  sub2/e.c \
+  sub2/f.c \
+  main.c
+END
+
+mkdir sub1 sub2
+echo 'int main (void)' > main.c
+echo '{' >> main.c
+for i in 1 2; do
+  for j in a b c d e f; do
+    echo "void $j$i (void) { }" > sub$i/$j.c
+    echo "  $j$i ();" >> main.c
+  done
+done
+echo '  return 0;' >> main.c
+echo '}' >> main.c
+cat main.c # For debugging.
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE -a
+
+./configure
+
+test -f get-objext.sh
+. ./get-objext.sh
+
+$MAKE
+
+# This must go after configure, since that will invoke rm many times.
+PATH=$ocwd/rm-wrap:$PATH; export PATH
+$MAKE sanity-check-rm || fatal_ "rm wrapper doesn't work as expected"
+
+$MAKE mostlyclean
+ls -l . sub1 sub2
+for i in 1 2; do
+  for j in a b c d e f; do
+    test ! -f sub$i/$j.o
+    test ! -f sub$i/$j.obj
+    test -f sub$i/$j.c || Exit 99 # Sanity check
+  done
+done
+
+PATH=$oPATH; export PATH
+rm -rf rm-wrap
+
+$MAKE clean
+$MAKE
+test -f sub1/a.$OBJEXT
+test -f sub2/d.$OBJEXT
+
+mv -f sub2/d.c sub2/x.c
+rm -f sub1/a.c
+
+sed -e '/ a1 ()/d' main.c > t
+mv -f t main.c
+
+sed -e '/sub1\/a\.c/d' -e 's|sub2/d\.c|sub2/x.c|' Makefile.am > t
+mv -f t Makefile.am
+
+using_gmake || $MAKE Makefile
+$MAKE
+test -f sub2/x.$OBJEXT
+
+# The stale objects are still there after a mere "make all" ...
+test -f sub1/a.$OBJEXT
+test -f sub2/a.$OBJEXT
+
+# ... but they get removed by "make mostlyclean" ...
+$MAKE mostlyclean
+test ! -f sub1/a.$OBJEXT
+test ! -f sub2/d.$OBJEXT
+
+# ... and do not get rebuilt ...
+$MAKE clean
+$MAKE all
+test ! -f sub1/a.$OBJEXT
+test ! -f sub2/d.$OBJEXT
+
+# ... while the non-stale files do.
+test -f sub1/b.$OBJEXT
+test -f sub2/x.$OBJEXT
+
+:


hooks/post-receive
-- 
GNU Automake



reply via email to

[Prev in Thread] Current Thread [Next in Thread]