]>
Commit | Line | Data |
---|---|---|
1f86b822 RL |
1 | #! {- $config{HASHBANGPERL} -} |
2 | # -*- mode: perl -*- | |
3 | {- | |
1f86b822 RL |
4 | # We must make sourcedir() return an absolute path, because configdata.pm |
5 | # may be loaded as a module from any script in any directory, making | |
6 | # relative paths untrustable. Because the result is used with 'use lib', | |
0c1428f4 RL |
7 | # we must ensure that it returns a Unix style path. Mixing File::Spec |
8 | # and File::Spec::Unix does just that. | |
9 | use File::Spec::Unix; | |
10 | use File::Spec; | |
1f86b822 | 11 | use Cwd qw(abs_path); |
0c1428f4 RL |
12 | sub _fixup_path { |
13 | my $path = shift; | |
14 | ||
15 | # Make the path absolute at all times | |
16 | $path = abs_path($path); | |
17 | ||
18 | if ($^O eq 'VMS') { | |
19 | # Convert any path of the VMS form VOLUME:[DIR1.DIR2]FILE to the | |
20 | # Unix form /VOLUME/DIR1/DIR2/FILE, which is what VMS perl supports | |
21 | # for 'use lib'. | |
22 | ||
e304aa87 | 23 | # Start with splitting the native path |
0c1428f4 RL |
24 | (my $vol, my $dirs, my $file) = File::Spec->splitpath($path); |
25 | my @dirs = File::Spec->splitdir($dirs); | |
26 | ||
27 | # Reassemble it as a Unix path | |
28 | $vol =~ s|:$||; | |
29 | $dirs = File::Spec::Unix->catdir('', $vol, @dirs); | |
30 | $path = File::Spec::Unix->catpath('', $dirs, $file); | |
31 | } | |
32 | ||
33 | return $path; | |
34 | } | |
1f86b822 | 35 | sub sourcedir { |
0c1428f4 | 36 | return _fixup_path(File::Spec->catdir($config{sourcedir}, @_)) |
1f86b822 RL |
37 | } |
38 | sub sourcefile { | |
0c1428f4 | 39 | return _fixup_path(File::Spec->catfile($config{sourcedir}, @_)) |
1f86b822 | 40 | } |
da51dc5f RL |
41 | use lib sourcedir('util', 'perl'); |
42 | use OpenSSL::Util; | |
1f86b822 RL |
43 | -} |
44 | package configdata; | |
45 | ||
46 | use strict; | |
47 | use warnings; | |
48 | ||
49 | use Exporter; | |
50 | our @ISA = qw(Exporter); | |
51 | our @EXPORT = qw( | |
52 | %config %target %disabled %withargs %unified_info | |
53 | @disablables @disablables_int | |
54 | ); | |
55 | ||
da51dc5f RL |
56 | our %config = ({- dump_data(\%config, indent => 0); -}); |
57 | our %target = ({- dump_data(\%target, indent => 0); -}); | |
58 | our @disablables = ({- dump_data(\@disablables, indent => 0) -}); | |
59 | our @disablables_int = ({- dump_data(\@disablables_int, indent => 0) -}); | |
60 | our %disabled = ({- dump_data(\%disabled, indent => 0); -}); | |
61 | our %withargs = ({- dump_data(\%withargs, indent => 0); -}); | |
62 | our %unified_info = ({- dump_data(\%unified_info, indent => 0); -}); | |
1f86b822 RL |
63 | |
64 | # Unexported, only used by OpenSSL::Test::Utils::available_protocols() | |
65 | our %available_protocols = ( | |
da51dc5f RL |
66 | tls => [{- dump_data(\@tls, indent => 0) -}], |
67 | dtls => [{- dump_data(\@dtls, indent => 0) -}], | |
1f86b822 RL |
68 | ); |
69 | ||
70 | # The following data is only used when this files is use as a script | |
da51dc5f RL |
71 | my @makevars = ({- dump_data(\@makevars, indent => 0); -}); |
72 | my %disabled_info = ({- dump_data(\%disabled_info, indent => 0); -}); | |
1f86b822 RL |
73 | my @user_crossable = qw( {- join (' ', @user_crossable) -} ); |
74 | ||
75 | # If run directly, we can give some answers, and even reconfigure | |
76 | unless (caller) { | |
77 | use Getopt::Long; | |
78 | use File::Spec::Functions; | |
79 | use File::Basename; | |
25228896 | 80 | use File::Compare qw(compare_text); |
2660b7cf | 81 | use File::Copy; |
1f86b822 RL |
82 | use Pod::Usage; |
83 | ||
841a438c RL |
84 | use lib '{- sourcedir('util', 'perl') -}'; |
85 | use OpenSSL::fallback '{- sourcefile('external', 'perl', 'MODULES.txt') -}'; | |
86 | ||
1f86b822 RL |
87 | my $here = dirname($0); |
88 | ||
89 | if (scalar @ARGV == 0) { | |
90 | # With no arguments, re-create the build file | |
2660b7cf | 91 | # We do that in two steps, where the first step emits perl |
e304aa87 | 92 | # snippets. |
2660b7cf RL |
93 | |
94 | my $buildfile = $target{build_file}; | |
95 | my $buildfile_template = "$buildfile.in"; | |
96 | my @autowarntext = ( | |
97 | 'WARNING: do not edit!', | |
98 | "Generated by configdata.pm from " | |
99 | .join(", ", @{$config{build_file_templates}}), | |
100 | "via $buildfile_template" | |
101 | ); | |
102 | my %gendata = ( | |
103 | config => \%config, | |
104 | target => \%target, | |
105 | disabled => \%disabled, | |
106 | withargs => \%withargs, | |
107 | unified_info => \%unified_info, | |
108 | autowarntext => \@autowarntext, | |
109 | ); | |
110 | ||
111 | use lib '.'; | |
112 | use lib '{- sourcedir('Configurations') -}'; | |
113 | use gentemplate; | |
114 | ||
2660b7cf RL |
115 | open my $buildfile_template_fh, ">$buildfile_template" |
116 | or die "Trying to create $buildfile_template: $!"; | |
117 | foreach (@{$config{build_file_templates}}) { | |
118 | copy($_, $buildfile_template_fh) | |
119 | or die "Trying to copy $_ into $buildfile_template: $!"; | |
120 | } | |
121 | gentemplate(output => $buildfile_template_fh, %gendata); | |
122 | close $buildfile_template_fh; | |
764cf5b2 | 123 | print 'Created ',$buildfile_template,"\n"; |
1f86b822 | 124 | |
1f86b822 RL |
125 | use OpenSSL::Template; |
126 | ||
09803e9c | 127 | my $prepend = <<'_____'; |
1f86b822 RL |
128 | use File::Spec::Functions; |
129 | use lib '{- sourcedir('util', 'perl') -}'; | |
1f86b822 RL |
130 | use lib '{- sourcedir('Configurations') -}'; |
131 | use lib '{- $config{builddir} -}'; | |
132 | use platform; | |
133 | _____ | |
134 | ||
25228896 | 135 | my $tmpl; |
2660b7cf RL |
136 | open BUILDFILE, ">$buildfile.new" |
137 | or die "Trying to create $buildfile.new: $!"; | |
25228896 RL |
138 | $tmpl = OpenSSL::Template->new(TYPE => 'FILE', |
139 | SOURCE => $buildfile_template); | |
2660b7cf RL |
140 | $tmpl->fill_in(FILENAME => $_, |
141 | OUTPUT => \*BUILDFILE, | |
142 | HASH => \%gendata, | |
143 | PREPEND => $prepend, | |
144 | # To ensure that global variables and functions | |
145 | # defined in one template stick around for the | |
146 | # next, making them combinable | |
147 | PACKAGE => 'OpenSSL::safe') | |
148 | or die $Text::Template::ERROR; | |
1f86b822 | 149 | close BUILDFILE; |
2660b7cf RL |
150 | rename("$buildfile.new", $buildfile) |
151 | or die "Trying to rename $buildfile.new to $buildfile: $!"; | |
764cf5b2 | 152 | print 'Created ',$buildfile,"\n"; |
1f86b822 | 153 | |
25228896 RL |
154 | my $configuration_h = |
155 | catfile('include', 'openssl', 'configuration.h'); | |
156 | my $configuration_h_in = | |
157 | catfile($config{sourcedir}, 'include', 'openssl', 'configuration.h.in'); | |
158 | open CONFIGURATION_H, ">${configuration_h}.new" | |
159 | or die "Trying to create ${configuration_h}.new: $!"; | |
160 | $tmpl = OpenSSL::Template->new(TYPE => 'FILE', | |
161 | SOURCE => $configuration_h_in); | |
162 | $tmpl->fill_in(FILENAME => $_, | |
163 | OUTPUT => \*CONFIGURATION_H, | |
164 | HASH => \%gendata, | |
165 | PREPEND => $prepend, | |
166 | # To ensure that global variables and functions | |
167 | # defined in one template stick around for the | |
168 | # next, making them combinable | |
169 | PACKAGE => 'OpenSSL::safe') | |
170 | or die $Text::Template::ERROR; | |
171 | close CONFIGURATION_H; | |
172 | ||
173 | # When using stat() on Windows, we can get it to perform better by | |
174 | # avoid some data. This doesn't affect the mtime field, so we're not | |
175 | # losing anything... | |
176 | ${^WIN32_SLOPPY_STAT} = 1; | |
177 | ||
178 | my $update_configuration_h = 0; | |
179 | if (-f $configuration_h) { | |
180 | my $configuration_h_mtime = (stat($configuration_h))[9]; | |
181 | my $configuration_h_in_mtime = (stat($configuration_h_in))[9]; | |
182 | ||
183 | # If configuration.h.in was updated after the last configuration.h, | |
184 | # or if configuration.h.new differs configuration.h, we update | |
185 | # configuration.h | |
186 | if ($configuration_h_mtime < $configuration_h_in_mtime | |
187 | || compare_text("${configuration_h}.new", $configuration_h) != 0) { | |
188 | $update_configuration_h = 1; | |
189 | } else { | |
190 | # If nothing has changed, let's just drop the new one and | |
191 | # pretend like nothing happened | |
192 | unlink "${configuration_h}.new" | |
193 | } | |
194 | } else { | |
195 | $update_configuration_h = 1; | |
196 | } | |
197 | ||
198 | if ($update_configuration_h) { | |
199 | rename("${configuration_h}.new", $configuration_h) | |
200 | or die "Trying to rename ${configuration_h}.new to $configuration_h: $!"; | |
201 | print 'Created ',$configuration_h,"\n"; | |
202 | } | |
203 | ||
1f86b822 RL |
204 | exit(0); |
205 | } | |
206 | ||
207 | my $dump = undef; | |
208 | my $cmdline = undef; | |
209 | my $options = undef; | |
210 | my $target = undef; | |
211 | my $envvars = undef; | |
212 | my $makevars = undef; | |
213 | my $buildparams = undef; | |
214 | my $reconf = undef; | |
215 | my $verbose = undef; | |
841a438c | 216 | my $query = undef; |
1f86b822 RL |
217 | my $help = undef; |
218 | my $man = undef; | |
219 | GetOptions('dump|d' => \$dump, | |
220 | 'command-line|c' => \$cmdline, | |
221 | 'options|o' => \$options, | |
222 | 'target|t' => \$target, | |
223 | 'environment|e' => \$envvars, | |
224 | 'make-variables|m' => \$makevars, | |
225 | 'build-parameters|b' => \$buildparams, | |
226 | 'reconfigure|reconf|r' => \$reconf, | |
227 | 'verbose|v' => \$verbose, | |
841a438c | 228 | 'query|q=s' => \$query, |
1f86b822 RL |
229 | 'help' => \$help, |
230 | 'man' => \$man) | |
231 | or die "Errors in command line arguments\n"; | |
232 | ||
e653b04b RL |
233 | # We allow extra arguments with --query. That allows constructs like |
234 | # this: | |
235 | # ./configdata.pm --query 'get_sources(@ARGV)' file1 file2 file3 | |
236 | if (!$query && scalar @ARGV > 0) { | |
1f86b822 RL |
237 | print STDERR <<"_____"; |
238 | Unrecognised arguments. | |
239 | For more information, do '$0 --help' | |
240 | _____ | |
241 | exit(2); | |
242 | } | |
243 | ||
244 | if ($help) { | |
245 | pod2usage(-exitval => 0, | |
246 | -verbose => 1); | |
247 | } | |
248 | if ($man) { | |
249 | pod2usage(-exitval => 0, | |
250 | -verbose => 2); | |
251 | } | |
252 | if ($dump || $cmdline) { | |
253 | print "\nCommand line (with current working directory = $here):\n\n"; | |
254 | print ' ',join(' ', | |
255 | $config{PERL}, | |
256 | catfile($config{sourcedir}, 'Configure'), | |
257 | @{$config{perlargv}}), "\n"; | |
258 | print "\nPerl information:\n\n"; | |
259 | print ' ',$config{perl_cmd},"\n"; | |
260 | print ' ',$config{perl_version},' for ',$config{perl_archname},"\n"; | |
261 | } | |
262 | if ($dump || $options) { | |
263 | my $longest = 0; | |
264 | my $longest2 = 0; | |
265 | foreach my $what (@disablables) { | |
266 | $longest = length($what) if $longest < length($what); | |
267 | $longest2 = length($disabled{$what}) | |
268 | if $disabled{$what} && $longest2 < length($disabled{$what}); | |
269 | } | |
270 | print "\nEnabled features:\n\n"; | |
271 | foreach my $what (@disablables) { | |
272 | print " $what\n" unless $disabled{$what}; | |
273 | } | |
274 | print "\nDisabled features:\n\n"; | |
275 | foreach my $what (@disablables) { | |
276 | if ($disabled{$what}) { | |
277 | print " $what", ' ' x ($longest - length($what) + 1), | |
278 | "[$disabled{$what}]", ' ' x ($longest2 - length($disabled{$what}) + 1); | |
279 | print $disabled_info{$what}->{macro} | |
280 | if $disabled_info{$what}->{macro}; | |
281 | print ' (skip ', | |
282 | join(', ', @{$disabled_info{$what}->{skipped}}), | |
283 | ')' | |
284 | if $disabled_info{$what}->{skipped}; | |
285 | print "\n"; | |
286 | } | |
287 | } | |
288 | } | |
289 | if ($dump || $target) { | |
290 | print "\nConfig target attributes:\n\n"; | |
291 | foreach (sort keys %target) { | |
292 | next if $_ =~ m|^_| || $_ eq 'template'; | |
293 | my $quotify = sub { | |
278de77b RL |
294 | map { |
295 | if (defined $_) { | |
296 | (my $x = $_) =~ s|([\\\$\@"])|\\$1|g; "\"$x\"" | |
297 | } else { | |
298 | "undef"; | |
299 | } | |
300 | } @_; | |
1f86b822 RL |
301 | }; |
302 | print ' ', $_, ' => '; | |
303 | if (ref($target{$_}) eq "ARRAY") { | |
304 | print '[ ', join(', ', $quotify->(@{$target{$_}})), " ],\n"; | |
305 | } else { | |
306 | print $quotify->($target{$_}), ",\n" | |
307 | } | |
308 | } | |
309 | } | |
310 | if ($dump || $envvars) { | |
311 | print "\nRecorded environment:\n\n"; | |
312 | foreach (sort keys %{$config{perlenv}}) { | |
313 | print ' ',$_,' = ',($config{perlenv}->{$_} || ''),"\n"; | |
314 | } | |
315 | } | |
316 | if ($dump || $makevars) { | |
317 | print "\nMakevars:\n\n"; | |
318 | foreach my $var (@makevars) { | |
319 | my $prefix = ''; | |
320 | $prefix = $config{CROSS_COMPILE} | |
321 | if grep { $var eq $_ } @user_crossable; | |
322 | $prefix //= ''; | |
323 | print ' ',$var,' ' x (16 - length $var),'= ', | |
324 | (ref $config{$var} eq 'ARRAY' | |
325 | ? join(' ', @{$config{$var}}) | |
326 | : $prefix.$config{$var}), | |
327 | "\n" | |
328 | if defined $config{$var}; | |
329 | } | |
330 | ||
331 | my @buildfile = ($config{builddir}, $config{build_file}); | |
332 | unshift @buildfile, $here | |
333 | unless file_name_is_absolute($config{builddir}); | |
334 | my $buildfile = canonpath(catdir(@buildfile)); | |
335 | print <<"_____"; | |
336 | ||
337 | NOTE: These variables only represent the configuration view. The build file | |
338 | template may have processed these variables further, please have a look at the | |
339 | build file for more exact data: | |
340 | $buildfile | |
341 | _____ | |
342 | } | |
343 | if ($dump || $buildparams) { | |
344 | my @buildfile = ($config{builddir}, $config{build_file}); | |
345 | unshift @buildfile, $here | |
346 | unless file_name_is_absolute($config{builddir}); | |
347 | print "\nbuild file:\n\n"; | |
348 | print " ", canonpath(catfile(@buildfile)),"\n"; | |
349 | ||
350 | print "\nbuild file templates:\n\n"; | |
351 | foreach (@{$config{build_file_templates}}) { | |
352 | my @tmpl = ($_); | |
353 | unshift @tmpl, $here | |
354 | unless file_name_is_absolute($config{sourcedir}); | |
355 | print ' ',canonpath(catfile(@tmpl)),"\n"; | |
356 | } | |
357 | } | |
358 | if ($reconf) { | |
359 | if ($verbose) { | |
360 | print 'Reconfiguring with: ', join(' ',@{$config{perlargv}}), "\n"; | |
361 | foreach (sort keys %{$config{perlenv}}) { | |
362 | print ' ',$_,' = ',($config{perlenv}->{$_} || ""),"\n"; | |
363 | } | |
364 | } | |
365 | ||
366 | chdir $here; | |
367 | exec $^X,catfile($config{sourcedir}, 'Configure'),'reconf'; | |
368 | } | |
841a438c RL |
369 | if ($query) { |
370 | use OpenSSL::Config::Query; | |
371 | ||
372 | my $confquery = OpenSSL::Config::Query->new(info => \%unified_info, | |
373 | config => \%config); | |
374 | my $result = eval "\$confquery->$query"; | |
375 | ||
376 | # We may need a result class with a printing function at some point. | |
377 | # Until then, we assume that we get a scalar, or a list or a hash table | |
378 | # with scalar values and simply print them in some orderly fashion. | |
379 | if (ref $result eq 'ARRAY') { | |
380 | print "$_\n" foreach @$result; | |
381 | } elsif (ref $result eq 'HASH') { | |
382 | print "$_ : \\\n ", join(" \\\n ", @{$result->{$_}}), "\n" | |
383 | foreach sort keys %$result; | |
384 | } elsif (ref $result eq 'SCALAR') { | |
385 | print "$$result\n"; | |
386 | } | |
387 | } | |
1f86b822 RL |
388 | } |
389 | ||
390 | 1; | |
391 | ||
392 | __END__ | |
393 | ||
394 | =head1 NAME | |
395 | ||
396 | configdata.pm - configuration data for OpenSSL builds | |
397 | ||
398 | =head1 SYNOPSIS | |
399 | ||
400 | Interactive: | |
401 | ||
402 | perl configdata.pm [options] | |
403 | ||
404 | As data bank module: | |
405 | ||
406 | use configdata; | |
407 | ||
408 | =head1 DESCRIPTION | |
409 | ||
410 | This module can be used in two modes, interactively and as a module containing | |
411 | all the data recorded by OpenSSL's Configure script. | |
412 | ||
413 | When used interactively, simply run it as any perl script. | |
414 | If run with no arguments, it will rebuild the build file (Makefile or | |
415 | corresponding). | |
416 | With at least one option, it will instead get the information you ask for, or | |
417 | re-run the configuration process. | |
418 | See L</OPTIONS> below for more information. | |
419 | ||
420 | When loaded as a module, you get a few databanks with useful information to | |
421 | perform build related tasks. The databanks are: | |
422 | ||
423 | %config Configured things. | |
424 | %target The OpenSSL config target with all inheritances | |
425 | resolved. | |
426 | %disabled The features that are disabled. | |
427 | @disablables The list of features that can be disabled. | |
428 | %withargs All data given through --with-THING options. | |
429 | %unified_info All information that was computed from the build.info | |
430 | files. | |
431 | ||
432 | =head1 OPTIONS | |
433 | ||
434 | =over 4 | |
435 | ||
436 | =item B<--help> | |
437 | ||
438 | Print a brief help message and exit. | |
439 | ||
440 | =item B<--man> | |
441 | ||
442 | Print the manual page and exit. | |
443 | ||
444 | =item B<--dump> | B<-d> | |
445 | ||
446 | Print all relevant configuration data. This is equivalent to B<--command-line> | |
447 | B<--options> B<--target> B<--environment> B<--make-variables> | |
448 | B<--build-parameters>. | |
449 | ||
450 | =item B<--command-line> | B<-c> | |
451 | ||
452 | Print the current configuration command line. | |
453 | ||
454 | =item B<--options> | B<-o> | |
455 | ||
456 | Print the features, both enabled and disabled, and display defined macro and | |
457 | skipped directories where applicable. | |
458 | ||
459 | =item B<--target> | B<-t> | |
460 | ||
461 | Print the config attributes for this config target. | |
462 | ||
463 | =item B<--environment> | B<-e> | |
464 | ||
465 | Print the environment variables and their values at the time of configuration. | |
466 | ||
467 | =item B<--make-variables> | B<-m> | |
468 | ||
469 | Print the main make variables generated in the current configuration | |
470 | ||
471 | =item B<--build-parameters> | B<-b> | |
472 | ||
473 | Print the build parameters, i.e. build file and build file templates. | |
474 | ||
475 | =item B<--reconfigure> | B<--reconf> | B<-r> | |
476 | ||
477 | Re-run the configuration process. | |
478 | ||
479 | =item B<--verbose> | B<-v> | |
480 | ||
481 | Verbose output. | |
482 | ||
483 | =back | |
484 | ||
485 | =cut | |
486 | ||
487 | EOF |