123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #! /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;
- }
- }
|