summaryrefslogtreecommitdiff
path: root/m4/sanity.m4
blob: db9a1f5639f16eca22685859b2097bfa6da5b95b (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
115
116
117
118
119
120
121
122
123
124
125
# Check to make sure that the build environment is sane.    -*- Autoconf -*-

# Copyright (C) 1996-2023 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# _AM_SLEEP_FRACTIONAL_SECONDS
# ----------------------------
AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl
AC_CACHE_CHECK([whether sleep supports fractional seconds], am_cv_sleep_fractional_seconds, [dnl
AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=true], [am_cv_sleep_fractional_seconds=false])
])])

# _AM_FILESYSTEM_TIMESTAMP_RESOLUTION
# -----------------------------------
# Determine the filesystem timestamp resolution.  Modern systems are nanosecond
# capable, but historical systems could be millisecond, second, or even 2-second
# resolution.
AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl
AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS])
AC_CACHE_CHECK([the filesystem timestamp resolution], am_cv_filesystem_timestamp_resolution, [dnl
# Use names that lexically sort older-first when the timestamps are equal.
rm -f conftest.file.a conftest.file.b
: > conftest.file.a
AS_IF([$am_cv_sleep_fractional_seconds], [dnl
  am_try_sleep=0.1 am_try_loops=20
], [dnl
  am_try_sleep=1   am_try_loops=2
])
am_try=0
while :; do
  AS_VAR_ARITH([am_try], [$am_try + 1])
  echo "timestamp $am_try" > conftest.file.b
  set X `ls -t conftest.file.a conftest.file.b`
  if test "$[2]" = conftest.file.b || test $am_try -eq $am_try_loops; then
    break
  fi
  sleep $am_try_sleep
done
rm -f conftest.file.a conftest.file.b
am_cv_filesystem_timestamp_resolution=$am_try
AS_IF([$am_cv_sleep_fractional_seconds], [dnl
  AS_VAR_ARITH([am_cv_filesystem_timestamp_resolution], [$am_try / 10])
  AS_VAR_ARITH([am_fraction], [$am_try % 10])
  AS_VAR_APPEND([am_cv_filesystem_timestamp_resolution], [.$am_fraction])
])
])])

# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION])
rm -f conftest.file
AC_CACHE_CHECK([whether build environment is sane], am_cv_build_env_is_sane, [dnl
# Reject unsafe characters in $srcdir or the absolute working directory
# name.  Accept space and tab only in the latter.
am_lf='
'
case `pwd` in
  *[[\\\"\#\$\&\'\`$am_lf]]*)
    AC_MSG_ERROR([unsafe absolute working directory name]);;
esac
case $srcdir in
  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
esac

# Do 'set' in a subshell so we don't clobber the current shell's
# arguments.  Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
   am_has_slept=no
   for am_try in 1 2; do
     echo "timestamp, slept: $am_has_slept" > conftest.file
     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
     if test "$[*]" = "X"; then
	# -L didn't work.
	set X `ls -t "$srcdir/configure" conftest.file`
     fi
     if test "$[*]" != "X $srcdir/configure conftest.file" \
	&& test "$[*]" != "X conftest.file $srcdir/configure"; then

	# If neither matched, then we have a broken ls.  This can happen
	# if, for instance, CONFIG_SHELL is bash and it inherits a
	# broken ls alias from the environment.  This has actually
	# happened.  Such a system could not be considered "sane".
	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
  alias in your environment])
     fi
     if test "$[2]" = conftest.file || test $am_try -eq 2; then
       break
     fi
     # Just in case.
     sleep $am_cv_filesystem_timestamp_resolution
     am_has_slept=yes
   done
   test "$[2]" = conftest.file
   )
then
  am_cv_build_env_is_sane=yes
else
   AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
])
# If we didn't sleep, we still need to ensure time stamps of config.status and
# generated files are strictly newer.
am_sleep_pid=
if ! test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1; then
  ( sleep $am_cv_filesystem_timestamp_resolution ) &
  am_sleep_pid=$!
fi
AC_CONFIG_COMMANDS_PRE(
  [AC_MSG_CHECKING([that generated files are newer than configure])
   if test -n "$am_sleep_pid"; then
     # Hide warnings about reused PIDs.
     wait $am_sleep_pid 2>/dev/null
   fi
   AC_MSG_RESULT([done])])
rm -f conftest.file
])