Due to how the handling of $(BUILT_SOURCES) is implemented in Automake-NG, a recursive make call in the recipe of any $(BUILT_SOURCES) (or of any of its prerequisites) will cause an infinite recursion (complete with fork bomb, yuck). Expose the issue in a test case (still failing, of course).
See: <http://lists.gnu.org/archive/html/help-smalltalk/2012-08/msg00027.html> <http://lists.gnu.org/archive/html/automake-patches/2012-08/msg00052.html> * t/built-sources-fork-bomb.sh: New test. * Makefile.am (XFAIL_TESTS): Add it. Signed-off-by: Stefano Lattarini <[email protected]> --- Makefile.am | 1 + t/built-sources-fork-bomb.sh | 69 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100755 t/built-sources-fork-bomb.sh diff --git a/Makefile.am b/Makefile.am index 656ebac..e19f3fd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -338,6 +338,7 @@ perl_fake_XFAIL_TESTS = \ XFAIL_TESTS = \ t/all.sh \ + t/built-sources-fork-bomb.sh \ t/override-suggest-local.sh \ t/comments-in-var-def.sh \ t/cond17.sh \ diff --git a/t/built-sources-fork-bomb.sh b/t/built-sources-fork-bomb.sh new file mode 100755 index 0000000..8279704 --- /dev/null +++ b/t/built-sources-fork-bomb.sh @@ -0,0 +1,69 @@ +#! /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/>. + +# Due to how the handling of $(BUILT_SOURCES) is implemented in Automake-NG, +# a recursive make call in the recipe of any $(BUILT_SOURCES) (or of any of +# its prerequisites) might cause an infinite recursion (complete with fork +# bomb, yuck) if not handled correctly. Verify that this doesn't happen. +# For more background, see: +# <http://lists.gnu.org/archive/html/help-smalltalk/2012-08/msg00027.html> +# <http://lists.gnu.org/archive/html/automake-patches/2012-08/msg00052.html> + +. ./defs || exit 1 + +echo AC_OUTPUT >> configure.ac + +cat > Makefile.am << 'END' +BUILT_SOURCES = foo +.PHONY: build-foo +build-foo: + echo OK > foo +foo: + $(MAKE) build-foo + +# If the bug is still present, we want this test to fail, not to actually +# go fork bomb and potentially crash the user machine. Take care of that. + +is_too_deep := $(shell test $(MAKELEVEL) -lt 10 && echo no) + +## Extra indentation here required to avoid confusing Automake. +## FIXME: now that we assume make is GNU make, this shouldn't happen! + ifeq ($(is_too_deep),no) + # All is ok. + else + $(error ::OOPS:: Recursion too deep, $(MAKELEVEL) levels) + endif +END + +$ACLOCAL +$AUTOMAKE +$AUTOCONF + +./configure + +$MAKE -n foo >output 2>&1 || { cat output; exit 1; } +cat output +test ! -f foo +# Guard against possible infinite recursion. +$FGREP '::OOPS::' output && exit 1 + +$MAKE foo >output 2>&1 || { cat output; exit 1; } +cat output +$MAKE foo +# Guard against possible infinite recursion. +$FGREP '::OOPS::' output && exit 1 + +: -- 1.7.12
