From: Qin Long Date: Thu, 23 Mar 2017 11:37:00 +0000 (+0800) Subject: CryptoPkg/OpensslLib: Add new Perl script for file list generation. X-Git-Tag: edk2-stable201903~4295 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=da9676f89cc4b0e5ab5b89b5f92b0dc86bcf347e CryptoPkg/OpensslLib: Add new Perl script for file list generation. OpenSSL-1.1.0xx configure mechanism was updated with new configdata. This patch update process_file.sh script to new Perl-based script for auto generation of file list and openssl config file (opensslconf.h). This only needs to be done once by a developer when updating to a new version of OpenSSL (or changing options, etc.). Normal users do not need to do this, since the results are already stored in the EDK2 git repository. Cc: Ting Ye Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Gary Lin Cc: Ronald Cron Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: David Woodhouse Signed-off-by: Qin Long Reviewed-by: Ting Ye Acked-by: Laszlo Ersek --- diff --git a/CryptoPkg/Library/OpensslLib/process_files.pl b/CryptoPkg/Library/OpensslLib/process_files.pl new file mode 100644 index 0000000000..210811b9ed --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/process_files.pl @@ -0,0 +1,223 @@ +#!/usr/bin/perl -w +# +# This script runs the OpenSSL Configure script, then processes the +# resulting file list into our local OpensslLib[Crypto].inf and also +# takes a copy of opensslconf.h. +# +# This only needs to be done once by a developer when updating to a +# new version of OpenSSL (or changing options, etc.). Normal users +# do not need to do this, since the results are stored in the EDK2 +# git repository for them. +# +use strict; +use Cwd; +use File::Copy; + +# +# Find the openssl directory name for use lib. We have to do this +# inside of BEGIN. The variables we create here, however, don't seem +# to be available to the main script, so we have to repeat the +# exercise. +# +my $inf_file; +my $OPENSSL_PATH; +my @inf; + +BEGIN { + $inf_file = "OpensslLib.inf"; + + # Read the contents of the inf file + open( FD, "<" . $inf_file ) || + die "Cannot open \"" . $inf_file . "\"!"; + @inf = (); + close(FD) || + die "Cannot close \"" . $inf_file . "\"!"; + + foreach (@inf) { + if (/DEFINE\s+OPENSSL_PATH\s*=\s*([a-z]+)/) { + + # We need to run Configure before we can include its result... + $OPENSSL_PATH = $1; + + my $basedir = getcwd(); + + chdir($OPENSSL_PATH) || + die "Cannot change to OpenSSL directory \"" . $OPENSSL_PATH . "\""; + + # Configure UEFI + system( + "./Configure", + "UEFI", + "no-afalgeng", + "no-asm", + "no-async", + "no-autoalginit", + "no-autoerrinit", + "no-bf", + "no-blake2", + "no-camellia", + "no-capieng", + "no-cast", + "no-chacha", + "no-cms", + "no-ct", + "no-deprecated", + "no-dgram", + "no-dsa", + "no-dynamic-engine", + "no-ec", + "no-ec2m", + "no-engine", + "no-err", + "no-filenames", + "no-gost", + "no-hw", + "no-idea", + "no-mdc2", + "no-pic", + "no-ocb", + "no-poly1305", + "no-posix-io", + "no-rc2", + "no-rfc3779", + "no-rmd160", + "no-scrypt", + "no-seed", + "no-sock", + "no-srp", + "no-ssl", + "no-stdio", + "no-threads", + "no-ts", + "no-ui", + "no-whirlpool" + ) == 0 || + die "OpenSSL Configure failed!\n"; + + # Generate opensslconf.h per config data + system( + "perl -I. -Mconfigdata util/dofile.pl " . + "include/openssl/opensslconf.h.in " . + "> include/openssl/opensslconf.h" + ) == 0 || + die "Failed to generate opensslconf.h!\n"; + + chdir($basedir) || + die "Cannot change to base directory \"" . $basedir . "\""; + + push @INC, $1; + last; + } + } +} + +# +# Retrieve file lists from OpenSSL configdata +# +use configdata qw/%unified_info/; + +my @cryptofilelist = (); +my @sslfilelist = (); +foreach my $product ((@{$unified_info{libraries}}, + @{$unified_info{engines}})) { + foreach my $o (@{$unified_info{sources}->{$product}}) { + foreach my $s (@{$unified_info{sources}->{$o}}) { + next if ($unified_info{generate}->{$s}); + next if $s =~ "crypto/bio/b_print.c"; + if ($product =~ "libssl") { + push @sslfilelist, ' $(OPENSSL_PATH)/' . $s . "\r\n"; + next; + } + push @cryptofilelist, ' $(OPENSSL_PATH)/' . $s . "\r\n"; + } + } +} + +# +# Update OpensslLib.inf with autogenerated file list +# +my @new_inf = (); +my $subbing = 0; +print "\n--> Updating OpensslLib.inf ... "; +foreach (@inf) { + if ( $_ =~ "# Autogenerated files list starts here" ) { + push @new_inf, $_, @cryptofilelist, @sslfilelist; + $subbing = 1; + next; + } + if ( $_ =~ "# Autogenerated files list ends here" ) { + push @new_inf, $_; + $subbing = 0; + next; + } + + push @new_inf, $_ + unless ($subbing); +} + +my $new_inf_file = $inf_file . ".new"; +open( FD, ">" . $new_inf_file ) || + die $new_inf_file; +print( FD @new_inf ) || + die $new_inf_file; +close(FD) || + die $new_inf_file; +rename( $new_inf_file, $inf_file ) || + die "rename $inf_file"; +print "Done!"; + +# +# Update OpensslLibCrypto.inf with auto-generated file list (no libssl) +# +$inf_file = "OpensslLibCrypto.inf"; + +# Read the contents of the inf file +@inf = (); +@new_inf = (); +open( FD, "<" . $inf_file ) || + die "Cannot open \"" . $inf_file . "\"!"; +@inf = (); +close(FD) || + die "Cannot close \"" . $inf_file . "\"!"; + +$subbing = 0; +print "\n--> Updating OpensslLibCrypto.inf ... "; +foreach (@inf) { + if ( $_ =~ "# Autogenerated files list starts here" ) { + push @new_inf, $_, @cryptofilelist; + $subbing = 1; + next; + } + if ( $_ =~ "# Autogenerated files list ends here" ) { + push @new_inf, $_; + $subbing = 0; + next; + } + + push @new_inf, $_ + unless ($subbing); +} + +$new_inf_file = $inf_file . ".new"; +open( FD, ">" . $new_inf_file ) || + die $new_inf_file; +print( FD @new_inf ) || + die $new_inf_file; +close(FD) || + die $new_inf_file; +rename( $new_inf_file, $inf_file ) || + die "rename $inf_file"; +print "Done!"; + +# +# Copy opensslconf.h generated from OpenSSL Configuration +# +print "\n--> Duplicating opensslconf.h into Include/openssl ... "; +copy($OPENSSL_PATH . "/include/openssl/opensslconf.h", + $OPENSSL_PATH . "/../../../Include/openssl/") || + die "Cannot copy opensslconf.h!"; +print "Done!\n"; + +print "\nProcessing Files Done!\n"; + +exit(0); diff --git a/CryptoPkg/Library/OpensslLib/process_files.sh b/CryptoPkg/Library/OpensslLib/process_files.sh deleted file mode 100755 index 9f10409824..0000000000 --- a/CryptoPkg/Library/OpensslLib/process_files.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/sh -# -# This script runs the OpenSSL Configure script, then processes the resulting -# file list into our local OpensslLib.inf and OpensslLibCrypto.inf, and also -# takes a copy of opensslconf.h. -# -# This only needs to be done once by a developer when updating to a -# new version of OpenSSL (or changing options, etc.). Normal users -# do not need to do this, since the results are stored in the EDK2 -# git repository for them. - -OPENSSL_PATH=$(sed -n '/DEFINE OPENSSL_PATH/{s/.* \(openssl-[0-9.]*[a-z]*\)[[:space:]]*/\1/ p}' OpensslLib.inf) -OPENSSL_CRYPTO_PATH=$(sed -n '/DEFINE OPENSSL_PATH/{s/.* \(openssl-[0-9.]*[a-z]*\)[[:space:]]*/\1/ p}' OpensslLibCrypto.inf) - -if [ "$OPENSSL_PATH" != "$OPENSSL_CRYPTO_PATH" ]; then - echo "OPENSSL_PATH diverges between OpensslLib.inf and OpensslLibCrypto.inf" - exit 1 -fi - -if ! cd "${OPENSSL_PATH}" ; then - echo "Cannot change to OpenSSL directory \"${OPENSSL_PATH}\"" - exit 1 -fi - -./Configure UEFI \ - no-asm \ - no-bf \ - no-camellia \ - no-capieng \ - no-cast \ - no-cms \ - no-deprecated \ - no-dgram \ - no-dsa \ - no-dynamic-engine \ - no-ec \ - no-ecdh \ - no-ecdsa \ - no-engine \ - no-engines \ - no-err \ - no-filenames \ - no-fp-api \ - no-hw \ - no-idea \ - no-jpake \ - no-krb5 \ - no-locking \ - no-mdc2 \ - no-posix-io \ - no-rc2 \ - no-rcs \ - no-rfc3779 \ - no-ripemd \ - no-scrypt \ - no-sct \ - no-seed \ - no-sha0 \ - no-sock \ - no-srp \ - no-ssl \ - no-stdio \ - no-threads \ - no-ts \ - no-ui \ - no-whirlpool \ - || exit 1 - -make files -cd - - -function filelist () -{ - SSL_SELECT="$1" - - echo '1,/# Autogenerated files list starts here/p' - echo '/# Autogenerated files list ends here/,$p' - echo '/# Autogenerated files list starts here/a\' - - while read LINE; do - case "$LINE" in - RELATIVE_DIRECTORY=*) - eval "$LINE" - ;; - LIBSRC=*) - LIBSRC=$(echo "$LINE" | sed s/^LIBSRC=//) - if [ "$RELATIVE_DIRECTORY" != "ssl" ] || - [ "$SSL_SELECT" = "crypto-and-ssl" ]; then - for FILE in $LIBSRC; do - if [ "$FILE" != "b_print.c" ]; then - echo -e ' $(OPENSSL_PATH)/'$RELATIVE_DIRECTORY/$FILE\\r\\ - fi - done - fi - ;; - esac - done - echo -e \\r -} - -filelist crypto-and-ssl < "${OPENSSL_PATH}/MINFO" \ -| sed -n -f - -i OpensslLib.inf - -filelist crypto-only < "${OPENSSL_PATH}/MINFO" \ -| sed -n -f - -i OpensslLibCrypto.inf - -# We can tell Windows users to put this back manually if they can't run -# Configure. For now, until the git repository is fixed to store things -# sanely, also convert to DOS line-endings -unix2dos -n "${OPENSSL_PATH}/crypto/opensslconf.h" opensslconf.h