#! /bin/sh
# Copyright (C) 2011 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/>.

# Test for automake bug#8365.
# TODO: A proper description of the bug!
# The bug is due to an improbable race condition, so we'll need
# some timestamp hacks to consistently expose it.

. ./defs || Exit 1

set -e

cat >> configure.in << 'END'
FOOBAR=zardoz
AC_OUTPUT
END

#: > foo.m4
: > Makefile.am

$ACLOCAL
# Run automake *before* autoconf, because we want to ensure that
# Makefile.in is not newer than configure.
$AUTOMAKE
$AUTOCONF

./configure
$MAKE Makefile
$EGREP 'FOOBAR|zardoz' Makefile && Exit 1 # Sanity check.

echo 'AC_SUBST([FOOBAR])' >> configure.in

# Modified configure dependencies must have the same timestamp of
# config.status and Makefile in order to trigger the bug.
touch -r config.status Makefile configure.in
stat config.status Makefile configure.in || : # For debugging.

# Also, the race condition is triggered only when aclocal, automake
# and aclocal run fast enough to keep the timestamp of the generated
# aclocal.m4, Makefile.in and configure equal to the timestamp of
# Makefile & config.status.  To reproduce this race consistently, we
# need the following hackish wrappers.

save_AUTOCONF=$AUTOCONF

cat > aclocal-wrap <<END
#!/bin/sh
set -ex
# Aclocal shouldn't use our autoconf wrapper when extracting
# the races from configure.in.
AUTOCONF='$save_AUTOCONF'; export AUTOCONF
$ACLOCAL "\$@"
touch -r config.status aclocal.m4
stat aclocal.m4 || :
END

cat > automake-wrap <<END
#!/bin/sh
set -ex
# Automake shouldn't use our autoconf wrapper when extracting
# the races from configure.in.
AUTOCONF='$save_AUTOCONF'; export AUTOCONF
$AUTOMAKE "\$@"
touch -r config.status Makefile.in
stat Makefile.in || :
END

cat > autoconf-wrap <<END
#!/bin/sh
set -ex
$AUTOCONF "\$@"
touch -r config.status configure
stat configure || :
END

chmod a+x aclocal-wrap automake-wrap autoconf-wrap

env \
  ACLOCAL=./aclocal-wrap AUTOMAKE=./automake-wrap AUTOCONF=./autoconf-wrap \
  $MAKE -e Makefile
grep '^FOOBAR =' Makefile.in
grep '^FOOBAR *= *zardoz *$' Makefile

:
