The Automake test suite wants this in order to know if it’s safe to reduce the length of various delays for the purpose of ensuring files in autom4te.cache are newer than the corresponding source files.
* lib/Autom4te/FileUtils.pm: Provide (but do not export) a flag $subsecond_mtime, indicating whether the ‘mtime’ function reports modification time with precision greater than one second. Reorganize commentary and import logic for clarity. Add configuration for emacs’ perl-mode to the bottom of the file. * bin/autom4te.in ($version): If $Autom4te::FileUtils::subsecond_mtime is true, add the text “ (subsecond timestamps supported)” to the first line of --version output. --- bin/autom4te.in | 6 ++-- lib/Autom4te/FileUtils.pm | 71 ++++++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/bin/autom4te.in b/bin/autom4te.in index 38a61ac9..9a2e5f12 100644 --- a/bin/autom4te.in +++ b/bin/autom4te.in @@ -207,8 +207,10 @@ General help using GNU software: <https://www.gnu.org/gethelp/>. # $VERSION # -------- -$version = "autom4te (@PACKAGE_NAME@) @VERSION@ -Copyright (C) @RELEASE_YEAR@ Free Software Foundation, Inc. +$version = "autom4te (@PACKAGE_NAME@) @VERSION@" + . ($Autom4te::FileUtils::subsecond_mtime + ? " (subsecond timestamps supported)\n" : "\n") + . "Copyright (C) @RELEASE_YEAR@ Free Software Foundation, Inc. License GPLv3+/Autoconf: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>, <https://gnu.org/licenses/exceptions.html> This is free software: you are free to change and redistribute it. diff --git a/lib/Autom4te/FileUtils.pm b/lib/Autom4te/FileUtils.pm index c1e8e8c3..06f87c31 100644 --- a/lib/Autom4te/FileUtils.pm +++ b/lib/Autom4te/FileUtils.pm @@ -38,24 +38,45 @@ use 5.006; use strict; use warnings FATAL => 'all'; -use Exporter; +BEGIN +{ + require Exporter; + our @ISA = qw (Exporter); + our @EXPORT = qw (&contents + &find_file &mtime + &update_file + &xsystem &xsystem_hint &xqx + &dir_has_case_matching_file &reset_dir_cache + &set_dir_cache_file); +} + +# Use sub-second resolution file timestamps if available, carry on +# with one-second resolution timestamps if Time::HiRes is not available. +# +# Unfortunately, even if Time::HiRes is available, we don't get +# timestamps to the full precision recorded by the operating system, +# because Time::HiRes converts timestamps to floating-point, and the +# rounding error is hundreds of nanoseconds for circa-2023 timestamps +# in IEEE double precision. But this is the best we can do without +# dropping down to C. +# +# $subsecond_mtime is not exported, but is intended for external +# consumption, as $Autom4te::FileUtils::subsecond_mtime. +BEGIN +{ + our $subsecond_mtime = 0; + eval + { + require Time::HiRes; + import Time::HiRes qw(stat); + $subsecond_mtime = 1; + } +} + use IO::File; - -# use sub-second resolution timestamps if available, -# carry on with one-second resolution timestamps if that is all we have -BEGIN { eval { require Time::HiRes; import Time::HiRes qw(stat) } } - use Autom4te::Channels; use Autom4te::ChannelDefs; -our @ISA = qw (Exporter); -our @EXPORT = qw (&contents - &find_file &mtime - &update_file - &xsystem &xsystem_hint &xqx - &dir_has_case_matching_file &reset_dir_cache - &set_dir_cache_file); - =over 4 =item C<find_file ($file_name, @include)> @@ -122,11 +143,6 @@ sub mtime ($) $atime,$mtime,$ctime,$blksize,$blocks) = stat ($file) or fatal "cannot stat $file: $!"; - # Unfortunately Time::HiRes converts timestamps to floating-point, and the - # rounding error can be hundreds of nanoseconds for circa-2023 timestamps. - # Perhaps some day Perl will support accurate file timestamps. - # For now, do the best we can without going outside Perl. - return $mtime; } @@ -394,3 +410,20 @@ sub set_dir_cache_file ($$) =cut 1; # for require + +### Setup "GNU" style for perl-mode and cperl-mode. +## Local Variables: +## perl-indent-level: 2 +## perl-continued-statement-offset: 2 +## perl-continued-brace-offset: 0 +## perl-brace-offset: 0 +## perl-brace-imaginary-offset: 0 +## perl-label-offset: -2 +## cperl-indent-level: 2 +## cperl-brace-offset: 0 +## cperl-continued-brace-offset: 0 +## cperl-label-offset: -2 +## cperl-extra-newline-before-brace: t +## cperl-merge-trailing-else: nil +## cperl-continued-statement-offset: 2 +## End: -- 2.41.0