e277108f0734f96210b13ee758a76e6e470ca1eb
[mirror_edk2.git] / CryptoPkg / Library / OpensslLib / process_files.pl
1 #!/usr/bin/perl -w\r
2 #\r
3 # This script runs the OpenSSL Configure script, then processes the\r
4 # resulting file list into our local OpensslLib[Crypto].inf and also\r
5 # takes a copy of opensslconf.h.\r
6 #\r
7 # This only needs to be done once by a developer when updating to a\r
8 # new version of OpenSSL (or changing options, etc.). Normal users\r
9 # do not need to do this, since the results are stored in the EDK2\r
10 # git repository for them.\r
11 #\r
12 use strict;\r
13 use Cwd;\r
14 use File::Copy;\r
15 \r
16 #\r
17 # Find the openssl directory name for use lib. We have to do this\r
18 # inside of BEGIN. The variables we create here, however, don't seem\r
19 # to be available to the main script, so we have to repeat the\r
20 # exercise.\r
21 #\r
22 my $inf_file;\r
23 my $OPENSSL_PATH;\r
24 my @inf;\r
25 \r
26 BEGIN {\r
27     $inf_file = "OpensslLib.inf";\r
28 \r
29     # Read the contents of the inf file\r
30     open( FD, "<" . $inf_file ) ||\r
31         die "Cannot open \"" . $inf_file . "\"!";\r
32     @inf = (<FD>);\r
33     close(FD) ||\r
34         die "Cannot close \"" . $inf_file . "\"!";\r
35 \r
36     foreach (@inf) {\r
37         if (/DEFINE\s+OPENSSL_PATH\s*=\s*([a-z]+)/) {\r
38 \r
39             # We need to run Configure before we can include its result...\r
40             $OPENSSL_PATH = $1;\r
41 \r
42             my $basedir = getcwd();\r
43 \r
44             chdir($OPENSSL_PATH) ||\r
45                 die "Cannot change to OpenSSL directory \"" . $OPENSSL_PATH . "\"";\r
46 \r
47             # Configure UEFI\r
48             system(\r
49                 "./Configure",\r
50                 "UEFI",\r
51                 "no-afalgeng",\r
52                 "no-asm",\r
53                 "no-async",\r
54                 "no-autoalginit",\r
55                 "no-autoerrinit",\r
56                 "no-bf",\r
57                 "no-blake2",\r
58                 "no-camellia",\r
59                 "no-capieng",\r
60                 "no-cast",\r
61                 "no-chacha",\r
62                 "no-cms",\r
63                 "no-ct",\r
64                 "no-deprecated",\r
65                 "no-dgram",\r
66                 "no-dsa",\r
67                 "no-dynamic-engine",\r
68                 "no-ec",\r
69                 "no-ec2m",\r
70                 "no-engine",\r
71                 "no-err",\r
72                 "no-filenames",\r
73                 "no-gost",\r
74                 "no-hw",\r
75                 "no-idea",\r
76                 "no-mdc2",\r
77                 "no-pic",\r
78                 "no-ocb",\r
79                 "no-poly1305",\r
80                 "no-posix-io",\r
81                 "no-rc2",\r
82                 "no-rfc3779",\r
83                 "no-rmd160",\r
84                 "no-scrypt",\r
85                 "no-seed",\r
86                 "no-sock",\r
87                 "no-srp",\r
88                 "no-ssl",\r
89                 "no-stdio",\r
90                 "no-threads",\r
91                 "no-ts",\r
92                 "no-ui",\r
93                 "no-whirlpool",\r
94                 # OpenSSL1_1_1b doesn't support default rand-seed-os for UEFI\r
95                 # UEFI only support --with-rand-seed=none\r
96                 "--with-rand-seed=none"\r
97                 ) == 0 ||\r
98                     die "OpenSSL Configure failed!\n";\r
99 \r
100             # Generate opensslconf.h per config data\r
101             system(\r
102                 "perl -I. -Mconfigdata util/dofile.pl " .\r
103                 "include/openssl/opensslconf.h.in " .\r
104                 "> include/openssl/opensslconf.h"\r
105                 ) == 0 ||\r
106                     die "Failed to generate opensslconf.h!\n";\r
107 \r
108             chdir($basedir) ||\r
109                 die "Cannot change to base directory \"" . $basedir . "\"";\r
110 \r
111             push @INC, $1;\r
112             last;\r
113         }\r
114     }\r
115 }\r
116 \r
117 #\r
118 # Retrieve file lists from OpenSSL configdata\r
119 #\r
120 use configdata qw/%unified_info/;\r
121 \r
122 my @cryptofilelist = ();\r
123 my @sslfilelist = ();\r
124 foreach my $product ((@{$unified_info{libraries}},\r
125                       @{$unified_info{engines}})) {\r
126     foreach my $o (@{$unified_info{sources}->{$product}}) {\r
127         foreach my $s (@{$unified_info{sources}->{$o}}) {\r
128             next if ($unified_info{generate}->{$s});\r
129             next if $s =~ "crypto/bio/b_print.c";\r
130 \r
131             # No need to add unused files in UEFI.\r
132             # So it can reduce porting time, compile time, library size.\r
133             next if $s =~ "crypto/rand/randfile.c";\r
134             next if $s =~ "crypto/store/";\r
135 \r
136             if ($product =~ "libssl") {\r
137                 push @sslfilelist, '  $(OPENSSL_PATH)/' . $s . "\r\n";\r
138                 next;\r
139             }\r
140             push @cryptofilelist, '  $(OPENSSL_PATH)/' . $s . "\r\n";\r
141         }\r
142     }\r
143 }\r
144 \r
145 #\r
146 # Update OpensslLib.inf with autogenerated file list\r
147 #\r
148 my @new_inf = ();\r
149 my $subbing = 0;\r
150 print "\n--> Updating OpensslLib.inf ... ";\r
151 foreach (@inf) {\r
152     if ( $_ =~ "# Autogenerated files list starts here" ) {\r
153         push @new_inf, $_, @cryptofilelist, @sslfilelist;\r
154         $subbing = 1;\r
155         next;\r
156     }\r
157     if ( $_ =~ "# Autogenerated files list ends here" ) {\r
158         push @new_inf, $_;\r
159         $subbing = 0;\r
160         next;\r
161     }\r
162 \r
163     push @new_inf, $_\r
164         unless ($subbing);\r
165 }\r
166 \r
167 my $new_inf_file = $inf_file . ".new";\r
168 open( FD, ">" . $new_inf_file ) ||\r
169     die $new_inf_file;\r
170 print( FD @new_inf ) ||\r
171     die $new_inf_file;\r
172 close(FD) ||\r
173     die $new_inf_file;\r
174 rename( $new_inf_file, $inf_file ) ||\r
175     die "rename $inf_file";\r
176 print "Done!";\r
177 \r
178 #\r
179 # Update OpensslLibCrypto.inf with auto-generated file list (no libssl)\r
180 #\r
181 $inf_file = "OpensslLibCrypto.inf";\r
182 \r
183 # Read the contents of the inf file\r
184 @inf = ();\r
185 @new_inf = ();\r
186 open( FD, "<" . $inf_file ) ||\r
187     die "Cannot open \"" . $inf_file . "\"!";\r
188 @inf = (<FD>);\r
189 close(FD) ||\r
190     die "Cannot close \"" . $inf_file . "\"!";\r
191 \r
192 $subbing = 0;\r
193 print "\n--> Updating OpensslLibCrypto.inf ... ";\r
194 foreach (@inf) {\r
195     if ( $_ =~ "# Autogenerated files list starts here" ) {\r
196         push @new_inf, $_, @cryptofilelist;\r
197         $subbing = 1;\r
198         next;\r
199     }\r
200     if ( $_ =~ "# Autogenerated files list ends here" ) {\r
201         push @new_inf, $_;\r
202         $subbing = 0;\r
203         next;\r
204     }\r
205 \r
206     push @new_inf, $_\r
207         unless ($subbing);\r
208 }\r
209 \r
210 $new_inf_file = $inf_file . ".new";\r
211 open( FD, ">" . $new_inf_file ) ||\r
212     die $new_inf_file;\r
213 print( FD @new_inf ) ||\r
214     die $new_inf_file;\r
215 close(FD) ||\r
216     die $new_inf_file;\r
217 rename( $new_inf_file, $inf_file ) ||\r
218     die "rename $inf_file";\r
219 print "Done!";\r
220 \r
221 #\r
222 # Copy opensslconf.h generated from OpenSSL Configuration\r
223 #\r
224 print "\n--> Duplicating opensslconf.h into Include/openssl ... ";\r
225 copy($OPENSSL_PATH . "/include/openssl/opensslconf.h",\r
226      $OPENSSL_PATH . "/../../Include/openssl/") ||\r
227    die "Cannot copy opensslconf.h!";\r
228 print "Done!\n";\r
229 \r
230 print "\nProcessing Files Done!\n";\r
231 \r
232 exit(0);\r
233 \r