diff options
author | Stefano Lattarini <stefano.lattarini@gmail.com> | 2012-01-13 12:42:36 +0100 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2012-01-13 12:42:36 +0100 |
commit | 539cae3bb691b4cef90e3c1fdbce833093ed6203 (patch) | |
tree | 1f5d9c3b571b4ffc7015dd8de1f7828137d45bcd | |
parent | f1df5481b9a51023b46390d7730c3a401a00e9fd (diff) | |
parent | dfb5e52f5f52fda733f1a6d27680fc347ba17286 (diff) | |
download | automake-539cae3bb691b4cef90e3c1fdbce833093ed6203.tar.gz |
Merge branch 'fix-pr10470' into maint
* fix-pr10470:
dist: avoid $(distdir) removal failure on MSYS/MinGW
coverage: expose automake bug#10470 (distcheck-related)
-rw-r--r-- | lib/am/distdir.am | 17 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/distcheck-pr10470.test | 61 |
3 files changed, 74 insertions, 5 deletions
diff --git a/lib/am/distdir.am b/lib/am/distdir.am index a681101e0..cd2e4bf5f 100644 --- a/lib/am/distdir.am +++ b/lib/am/distdir.am @@ -1,6 +1,6 @@ ## automake - create Makefile.in from Makefile.am ## Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, -## 2010, 2011 Free Software Foundation, Inc. +## 2010, 2011, 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 @@ -23,10 +23,17 @@ distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } - + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ +## On MSYS (1.0.17) it is not possible to remove a directory that is in +## use; so, if the first rm fails, we sleep some seconds and retry, to +## give pending processes some time to exit and "release" the directory +## before we remove it. The value of "some seconds" is 5 for the moment, +## which is mostly an arbitrary value, but seems high enough in practice. +## See automake bug#10470. + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi endif %?TOPDIR_P% if %?SUBDIRS% diff --git a/tests/Makefile.am b/tests/Makefile.am index 8817b64f8..e79c3beb4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -352,6 +352,7 @@ distcheck-hook2.test \ distcheck-missing-m4.test \ distcheck-outdated-m4.test \ distcheck-pr9579.test \ +distcheck-pr10470.test \ distcheck-override-infodir.test \ dmalloc.test \ doc-parsing-buglets-colneq-subst.test \ diff --git a/tests/distcheck-pr10470.test b/tests/distcheck-pr10470.test new file mode 100755 index 000000000..e774dd70d --- /dev/null +++ b/tests/distcheck-pr10470.test @@ -0,0 +1,61 @@ +#! /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/>. + +# Ensure "make distcheck" does not experience racy failures on +# systems (like MinGW/MSYS) that cannot remove a directory "in use" +# by a process (e.g., that is its "current working directory"). +# See automake bug#10470. + +parallel_tests=no +. ./defs || Exit 1 + +set -e + +mkdir foo.d +sh -c "cd foo.d && sleep '4'" & +# Without this sleep, the "rm -rf foo.d" below would reliably beat +# the "cd foo.d" in the subshell above, and the test would be always +# skipped, even on MinGW/MSYS. +sleep '1' +rm -rf foo.d && skip_ 'system is able to remove "in use" directories' + +echo AC_OUTPUT >> configure.in + +cat > Makefile.am <<END +TESTS = foo.test +EXTRA_DIST= foo.test +END + +cat > foo.test <<END +#!/bin/sh +sleep '4' & +exit 0 +END +chmod a+x foo.test + +$ACLOCAL +$AUTOCONF +$AUTOMAKE +./configure + +# We can build the distribution. +$MAKE distcheck >output 2>&1 || { cat output; Exit 1; } +cat output +# Sanity check: verify that our code has hit a problem removing +# the distdir, but has recovered from it. +grep "rm:.*$destdir" output || fatal_ "expected code path not covered" + +: |