Bruno Haible wrote:
[I'm writing to automake@gnu.org because bug-autom...@gnu.org
appears to be equivalent to /dev/null: no echo in
https://lists.gnu.org/archive/html/bug-automake/2024-06/threads.html
nor in https://debbugs.gnu.org/cgi/pkgreport.cgi?package=automake,
even after several hours.]
In configure scripts generated by Autoconf 2.72 and Automake 1.16.90,
one of the early tests
checking filesystem timestamp resolution...
takes 7 seconds! Seen e.g. on NetBSD 10.0.
Logging the execution time, via
sh -x ./configure 2>&1 | gawk '{ print strftime("%H:%M:%S"), $0; fflush(); }'
> log1
I get the attached output. There are
6x sleep 1
4x sleep 0.1
That is, 6.4 seconds are wasted in sleeps. IBM software may do this;
but GNU software shouldn't.
AFAIU, the 4x sleep 0.1 are to determine whether
am_cv_filesystem_timestamp_resolution should be set to 0.1 or to 1.
OK, so be it.
But the 6x sleep 1 are to determine whether
am_cv_filesystem_timestamp_resolution should be set to 1 or 2.
2 is known to be the case only for FAT/VFAT file systems. Therefore
here is a proposed patch to speed this up. On NetBSD, it reduces
the execution time of the test from ca. 7 seconds to ca. 0.5 seconds.
The problem with the proposed patch is that it tries to read a
filesystem name instead of testing for the feature. This would not be
portable to new systems that use a different name for their FAT
filesystem driver.
I think the test can be better optimized for the common case by first
checking if stat(1) from GNU coreutils is available ([[case `stat
--version` in *coreutils*) YES;; *) NO;; esac]]) and, if it is (common
case and definitely so on the GNU system), checking [[case `stat
--format=%y .` in *:??.000000000) SUBSEC_RESOLUTION=no;; *)
SUBSEC_RESOLUTION=yes;; esac]] to determine if sub-second timestamps are
likely to be available; this has a 1-in-actual-ticks-per-second of
giving a false negative. These checks would be very fast, so could also
be repeated with the access and inode change timestamps and/or extended
to other files (`stat *`) for better certainty. The basic concept
should be sound, although the pattern matching used in the examples is a
first cut.
The essential idea is that the fractional part beyond what the
filesystem actually records will always read as zero, and unpacking an
archive is not instant, so we should see every implemented fractional
bit set at least once across files in the tree containing configure.
To handle filesystems with 2-second timestamp resolution, check the
timestamp on configure, and arrange for autoconf to ensure that the
timestamp of a generated configure script is always odd---that
least-significant bit will be dropped when the script is unpacked on a
filesystem with 2-second timestamp resolution.
If stat from GNU coreutils is not available, fall back to the current
sleep(1)-based test and just eat the delay in the name of portability.
The test checks only for "coreutils" because very old versions did not
say GNU. A better, functional test for stat(1) is probably also possible.
-- Jacob