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
This commit is contained in:
Tom Lane 2018-05-03 18:06:45 -04:00
parent 9bf28f96c7
commit 1f1cd9b5dd
1 changed files with 20 additions and 3 deletions

View 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.