From 01bf65daf6f6627b56fbe78fc436fd877ccd3537 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 2 Feb 2023 14:17:52 -0800 Subject: [PATCH 2/2] Use higher-resolution file timestamps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 . --- lib/Automake/FileUtils.pm | 12 +++++++++--- 1 file 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; } -- 2.39.1