summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2018-05-03 18:06:45 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2018-05-03 18:06:45 -0400
commit1f1cd9b5ddc6e7464c1c7416bcce7007fe3bc88c (patch)
tree359e61dff30b9129c65132f0845114cbaa6964c3
parent9bf28f96c7eb0c3630ef034679c426c2ee289aca (diff)
downloadpostgresql-1f1cd9b5ddc6e7464c1c7416bcce7007fe3bc88c.tar.gz
Avoid overwriting unchanged output files in genbki.pl and Gen_fmgrtab.pl.
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
-rw-r--r--src/backend/catalog/Catalog.pm23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index eee7cb3b90..2889cb9fb0 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -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.