As I mentioned earlier, there's a logic bug in GNU make 3.79 in the case of WINDOWS32: the code if (mtime > now && (((mtime % 2) == 0) && ((mtime-1) > now))) does not warn about a future timestamp if the timestamp is odd. I earlier sent a patch that was combined with a lot of other stuff that turned out to be undesirable as it missed some skews; sorry about that. Here's a patch that fixes just this problem, and cleans up the code a bit so it's easier to follow. 2000-05-22 Paul Eggert <[EMAIL PROTECTED]> * remake.c (f_mtime): Fix bug when handling future odd timestamps in the WINDOWS32 case. Do not bother initializing static var to zero. Simplify code that works around WINDOWS32 and __MSDOS__ time skew brain damage. =================================================================== RCS file: remake.c,v retrieving revision 3.79 retrieving revision 3.79.0.2 diff -pu -r3.79 -r3.79.0.2 --- remake.c 2000/04/03 05:46:08 3.79 +++ remake.c 2000/05/22 16:45:52 3.79.0.2 @@ -1142,9 +1142,27 @@ f_mtime (file, search) We only need to do this once, for now. */ - static FILE_TIMESTAMP now = 0; + static FILE_TIMESTAMP now; + + FILE_TIMESTAMP adjusted_mtime = mtime; +#ifdef WINDOWS32 + /* FAT filesystems round time to the nearest even second! + Allow for any file (NTFS or FAT) to perhaps suffer from this + brain damage. */ + if ((FILE_TIMESTAMP_S (adjusted_mtime) & 1) == 0 + && FILE_TIMESTAMP_NS (adjusted_mtime) == 0) + adjusted_mtime -= FILE_TIMESTAMPS_PER_S; +#else +#ifdef __MSDOS__ + /* On DJGPP under Windows 98 and Windows NT, FAT filesystems can + set file times up to 3 seconds into the future! The bug doesn't + occur in plain DOS or in Windows 95, but we play it safe. */ + adjusted_mtime -= 3 * FILE_TIMESTAMPS_PER_S; +#endif +#endif + if (!clock_skew_detected - && mtime != (FILE_TIMESTAMP)-1 && mtime > now + && mtime != (FILE_TIMESTAMP)-1 && now < adjusted_mtime && !file->updated) { /* This file's time appears to be in the future. @@ -1152,22 +1170,7 @@ f_mtime (file, search) now = file_timestamp_now (); -#ifdef WINDOWS32 - /* - * FAT filesystems round time to nearest even second(!). Just - * allow for any file (NTFS or FAT) to perhaps suffer from this - * braindamage. - */ - if (mtime > now && (((mtime % 2) == 0) && ((mtime-1) > now))) -#else -#ifdef __MSDOS__ - /* Scrupulous testing indicates that some Windows - filesystems can set file times up to 3 sec into the future! */ - if (mtime > now + 3) -#else - if (mtime > now) -#endif -#endif + if (now < adjusted_mtime) { char mtimebuf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1]; char nowbuf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];