summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2023-02-02 14:17:52 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2023-02-02 14:20:09 -0800
commit01bf65daf6f6627b56fbe78fc436fd877ccd3537 (patch)
tree698dd4d16a59ddb57c6ee2b1d969ee73a644b30f
parent4e3744a15c4d8bdb46c11ead2fb56c5f591b714b (diff)
downloadautomake-01bf65daf6f6627b56fbe78fc436fd877ccd3537.tar.gz
Use higher-resolution file timestamps
* lib/Automake/FileUtils.pm (mtime): Return higher-resolution file timestamps. This isn’t perfect, but it’s better than what we had. Code change taken from Autoconf to partially fix a race <https://bugs.gentoo.org/show_bug.cgi?id=782985>.
-rw-r--r--lib/Automake/FileUtils.pm12
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/Automake/FileUtils.pm b/lib/Automake/FileUtils.pm
index bd173032b..6e9796a98 100644
--- a/lib/Automake/FileUtils.pm
+++ b/lib/Automake/FileUtils.pm
@@ -39,7 +39,7 @@ use strict;
use warnings FATAL => 'all';
use Exporter;
-use File::stat;
+use Time::HiRes qw(stat);
use IO::File;
use Automake::Channels;
@@ -115,10 +115,16 @@ sub mtime ($)
return 0
if $file eq '-' || ! -f $file;
- my $stat = stat ($file)
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks) = stat ($file)
or fatal "cannot stat $file: $!";
- return $stat->mtime;
+ # 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;
}