]> granicus.if.org Git - postgresql/commitdiff
Avoid overwriting unchanged output files in genbki.pl and Gen_fmgrtab.pl.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 May 2018 22:06:45 +0000 (18:06 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 May 2018 22:06:45 +0000 (18:06 -0400)
If a particular output file already exists with the contents it should
have, leave it alone, so that its mod timestamp is not advanced.

In builds using --enable-depend, this can avoid the need to recompile .c
files whose included files didn't actually change.  It's not clear whether
it saves much of anything for users of ccache; but the cost of doing the
file comparisons seems to be negligible, so we might as well do it.

For developers using the MSVC toolchain, this will create a regression:
msvc/Solution.pm will sometimes run genbki.pl or Gen_fmgrtab.pl
unnecessarily.  I'll look into fixing that separately.

Discussion: https://postgr.es/m/16925.1525376229@sss.pgh.pa.us

src/backend/catalog/Catalog.pm

index eee7cb3b90e0e433b569b1c34b32be13a9e910cc..2889cb9fb060af7109820777367aa2f432dcb081 100644 (file)
@@ -16,6 +16,9 @@ package Catalog;
 use strict;
 use warnings;
 
+use File::Compare;
+
+
 # Parses a catalog header file into a data structure describing the schema
 # of the catalog.
 sub ParseHeader
@@ -336,15 +339,29 @@ sub AddDefaultValues
 }
 
 # Rename temporary files to final names.
-# Call this function with the final file name and the .tmp extension
+# Call this function with the final file name and the .tmp extension.
+#
+# If the final file already exists and has identical contents, don't
+# overwrite it; this behavior avoids unnecessary recompiles due to
+# updating the mod date on unchanged header files.
+#
 # Note: recommended extension is ".tmp$$", so that parallel make steps
-# can't use the same temp files
+# can't use the same temp files.
 sub RenameTempFile
 {
        my $final_name = shift;
        my $extension  = shift;
        my $temp_name  = $final_name . $extension;
-       rename($temp_name, $final_name) || die "rename: $temp_name: $!";
+
+       if (-f $final_name
+               && compare($temp_name, $final_name) == 0)
+       {
+               unlink $temp_name || die "unlink: $temp_name: $!";
+       }
+       else
+       {
+               rename($temp_name, $final_name) || die "rename: $temp_name: $!";
+       }
 }
 
 # Find a symbol defined in a particular header file and extract the value.