summaryrefslogtreecommitdiff
path: root/t/remake-subdir-long-time.sh
blob: db452eeb99b80917115da72d27eeaf24cbb458c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#! /bin/sh
# Copyright (C) 2011-2018 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 <https://www.gnu.org/licenses/>.

# Check that remake rules from subdirectories do not hang or cycle
# endlessly, even with build systems that takes several seconds to
# rebuild the Makefiles.
# This test tries to ensure a long-enough rebuild time by introducing
# an explicit delay in the build process.
# Suggestion by Ralf Wildenhues.

. test-init.sh

cat > configure.ac <<END
AC_INIT([$me], [1.0])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_FILES([Makefile sub/Makefile])
AC_SUBST([MAGIC], [magic])
AC_OUTPUT
END

echo SUBDIRS = sub > Makefile.am
mkdir sub
: > sub/Makefile.am

# Both aclocal and automake are expected to run one and just one time.
# Create and use wrappers that will verify that.

ocwd=$(pwd) || fatal_ "cannot get current working directory"

mkdir bin

cat > bin/automake <<END
#!/bin/sh
set -e
PATH='$PATH'; export PATH
sentinel='$ocwd/automake-has-run'
if test -f "\$sentinel"; then
  echo "Automake has been run more than one time" >&2
  exit 1
else
  echo automake has run > "\$sentinel"
fi
$sleep; $sleep;
exec $AUTOMAKE \${1+"\$@"}
END
chmod a+x bin/automake

cat > bin/aclocal <<END
#!/bin/sh
set -e
PATH='$PATH'; export PATH
sentinel='$ocwd/aclocal-has-run'
if test -f "\$sentinel"; then
  echo "Aclocal has been run more than one time" >&2
  exit 1
else
  echo aclocal has run > "\$sentinel"
fi
$sleep; $sleep;
exec $ACLOCAL \${1+"\$@"}
END
chmod a+x bin/aclocal

# Just to be sure.
cp bin/automake bin/automake-$APIVERSION
cp bin/aclocal bin/aclocal-$APIVERSION

PATH=$ocwd/bin$PATH_SEPARATOR$PATH; export PATH

AUTOMAKE=automake ACLOCAL=aclocal; export AUTOMAKE ACLOCAL

$ACLOCAL  # Should use or just-defined wrapper.
$AUTOMAKE # Likewise.
$AUTOCONF

# Sanity check: the wrappers have been used.
test -f automake-has-run
test -f aclocal-has-run
rm -f automake-has-run aclocal-has-run

./configure
# Sanity check: Makefile doesn't get updated uselessly.
run_make ACLOCAL=false AUTOMAKE=false AUTOCONF=false

$sleep
sed "s|magic|magic2|" configure.ac > t
mv -f t configure.ac

cd sub
run_make Makefile AUTOMAKE="$AUTOMAKE" ACLOCAL="$ACLOCAL"
cd ..

# For debugging.
ls -l . sub
grep -i magic configure Makefile.in Makefile sub/Makefile.in sub/Makefile
# Sanity checks.
$FGREP magic2 configure
$FGREP magic2 Makefile
$FGREP magic2 sub/Makefile

: