diff options
Diffstat (limited to 'util/dofile.pl')
-rw-r--r-- | util/dofile.pl | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/util/dofile.pl b/util/dofile.pl new file mode 100644 index 000000000000..d1ed1e4098a2 --- /dev/null +++ b/util/dofile.pl @@ -0,0 +1,112 @@ +#! /usr/bin/env perl +# Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + +# Reads one or more template files and runs it through Text::Template +# +# It is assumed that this scripts is called with -Mconfigdata, a module +# that holds configuration data in %config + +use strict; +use warnings; + +use FindBin; +use lib "$FindBin::Bin/perl"; +use OpenSSL::fallback "$FindBin::Bin/../external/perl/MODULES.txt"; +use Getopt::Std; +use OpenSSL::Template; + +# We expect to get a lot of information from configdata, so check that +# it was part of our commandline. +die "You must run this script with -Mconfigdata\n" + if !exists($config{target}); + +# Check options ###################################################### + +# -o ORIGINATOR +# declares ORIGINATOR as the originating script. +# -i .ext Like Perl's edit-in-place -i flag +my %opts = (); +getopt('oi', \%opts); + +my @autowarntext = ( + "WARNING: do not edit!", + "Generated" + . (defined($opts{o}) ? " by $opts{o}" : "") + . (scalar(@ARGV) > 0 ? " from " .join(", ", @ARGV) : "") +); + +if (defined($opts{s})) { + local $/ = undef; + open VARS, $opts{s} or die "Couldn't open $opts{s}, $!"; + my $contents = <VARS>; + close VARS; + eval $contents; + die $@ if $@; +} +die "Must have input files" + if defined($opts{i}) and scalar(@ARGV) == 0; + +# Template setup ##################################################### + +my @template_settings = + @ARGV + ? map { { TYPE => 'FILE', SOURCE => $_, FILENAME => $_ } } @ARGV + : ( { TYPE => 'FILEHANDLE', SOURCE => \*STDIN, FILENAME => '<stdin>' } ); + +# Error callback; print message, set status, return "stop processing" +my $failed = 0; +sub errorcallback { + my %args = @_; + print STDERR $args{error}; + $failed++; + return undef; +} + +# Engage! ############################################################ + +my $prepend = <<"_____"; +use File::Spec::Functions; +use lib '$FindBin::Bin/../Configurations'; +use lib '$config{builddir}'; +use platform; +_____ + +foreach (@template_settings) { + my $template = OpenSSL::Template->new(%$_); + die "Couldn't create template: $Text::Template::ERROR" + if !defined($template); + + my $result = $template->fill_in(%$_, + HASH => { config => \%config, + target => \%target, + disabled => \%disabled, + withargs => \%withargs, + unified_info => \%unified_info, + autowarntext => \@autowarntext }, + BROKEN => \&errorcallback, + PREPEND => $prepend, + # To ensure that global variables and functions + # defined in one template stick around for the + # next, making them combinable + PACKAGE => 'OpenSSL::safe'); + exit 1 if $failed; + + if (defined($opts{i})) { + my $in = $_->{FILENAME}; + my $out = $in; + $out =~ s/$opts{i}$//; + die "Cannot replace file in-place $in" + if $in eq $out; + open OFH, ">$out" + or die "Can't open $out, $!"; + print OFH $result; + close OFH; + } else { + print $result; + } +} |