diff --git a/Configure b/Configure index 648fc0694e..1992f907aa 100755 --- a/Configure +++ b/Configure @@ -2854,8 +2854,11 @@ if (-f $configdata_outname) { # like nothing happened unlink "$configdata_outname.new"; - # We still run configdata.pm if the build file (Makefile) is missing - $run_configdata = !( -f $target{build_file} ); + # We still run configdata.pm if one of the build file (Makefile) or + # the configuration header file are missing + $run_configdata = + !( -f $target{build_file} ) + || !( -f catfile('include', 'openssl', 'configuration.h') ); } } else { $update_configdata = 1; diff --git a/build.info b/build.info index a70d1671f2..881dc907b5 100644 --- a/build.info +++ b/build.info @@ -22,7 +22,6 @@ DEPEND[]=include/openssl/asn1.h \ include/openssl/cmp.h \ include/openssl/cms.h \ include/openssl/conf.h \ - include/openssl/configuration.h \ include/openssl/crmf.h \ include/openssl/crypto.h \ include/openssl/ct.h \ @@ -49,7 +48,6 @@ GENERATE[include/openssl/bio.h]=include/openssl/bio.h.in GENERATE[include/openssl/cmp.h]=include/openssl/cmp.h.in GENERATE[include/openssl/cms.h]=include/openssl/cms.h.in GENERATE[include/openssl/conf.h]=include/openssl/conf.h.in -GENERATE[include/openssl/configuration.h]=include/openssl/configuration.h.in GENERATE[include/openssl/crmf.h]=include/openssl/crmf.h.in GENERATE[include/openssl/crypto.h]=include/openssl/crypto.h.in GENERATE[include/openssl/ct.h]=include/openssl/ct.h.in diff --git a/configdata.pm.in b/configdata.pm.in index cdaea868c1..840e23b6c1 100644 --- a/configdata.pm.in +++ b/configdata.pm.in @@ -77,6 +77,7 @@ unless (caller) { use Getopt::Long; use File::Spec::Functions; use File::Basename; + use File::Compare qw(compare_text); use File::Copy; use Pod::Usage; @@ -131,10 +132,11 @@ use lib '{- $config{builddir} -}'; use platform; _____ + my $tmpl; open BUILDFILE, ">$buildfile.new" or die "Trying to create $buildfile.new: $!"; - my $tmpl = OpenSSL::Template->new(TYPE => 'FILE', - SOURCE => $buildfile_template); + $tmpl = OpenSSL::Template->new(TYPE => 'FILE', + SOURCE => $buildfile_template); $tmpl->fill_in(FILENAME => $_, OUTPUT => \*BUILDFILE, HASH => \%gendata, @@ -149,6 +151,56 @@ _____ or die "Trying to rename $buildfile.new to $buildfile: $!"; print 'Created ',$buildfile,"\n"; + my $configuration_h = + catfile('include', 'openssl', 'configuration.h'); + my $configuration_h_in = + catfile($config{sourcedir}, 'include', 'openssl', 'configuration.h.in'); + open CONFIGURATION_H, ">${configuration_h}.new" + or die "Trying to create ${configuration_h}.new: $!"; + $tmpl = OpenSSL::Template->new(TYPE => 'FILE', + SOURCE => $configuration_h_in); + $tmpl->fill_in(FILENAME => $_, + OUTPUT => \*CONFIGURATION_H, + HASH => \%gendata, + PREPEND => $prepend, + # To ensure that global variables and functions + # defined in one template stick around for the + # next, making them combinable + PACKAGE => 'OpenSSL::safe') + or die $Text::Template::ERROR; + close CONFIGURATION_H; + + # When using stat() on Windows, we can get it to perform better by + # avoid some data. This doesn't affect the mtime field, so we're not + # losing anything... + ${^WIN32_SLOPPY_STAT} = 1; + + my $update_configuration_h = 0; + if (-f $configuration_h) { + my $configuration_h_mtime = (stat($configuration_h))[9]; + my $configuration_h_in_mtime = (stat($configuration_h_in))[9]; + + # If configuration.h.in was updated after the last configuration.h, + # or if configuration.h.new differs configuration.h, we update + # configuration.h + if ($configuration_h_mtime < $configuration_h_in_mtime + || compare_text("${configuration_h}.new", $configuration_h) != 0) { + $update_configuration_h = 1; + } else { + # If nothing has changed, let's just drop the new one and + # pretend like nothing happened + unlink "${configuration_h}.new" + } + } else { + $update_configuration_h = 1; + } + + if ($update_configuration_h) { + rename("${configuration_h}.new", $configuration_h) + or die "Trying to rename ${configuration_h}.new to $configuration_h: $!"; + print 'Created ',$configuration_h,"\n"; + } + exit(0); }