Rework building: initial changes
This is the start of a major work to correct some quirks in the buiding system. The base for this is to move certain attributes that lack desired flexibility from Configurations/*.conf to perl modules that can be selected with one single attribute in the config targets. The way this is meant to work is by adding this attribute in select config targets: perl_module => 'Name'; # Name to be replaced Then, in the perl scripts or modules that need the functionality, these lines should be added: use lib catdir($srcdir, 'Configurations'); # Ensure access to platform.pm use lib $blddir; # Ensure access to configdata.pm use platform; # Will load platform::$target{perl_module} Reviewed-by: Tim Hudson <tjh@openssl.org> Reviewed-by: Paul Dale <paul.dale@oracle.com> (Merged from https://github.com/openssl/openssl/pull/7473)
This commit is contained in:
parent
ac454d8d46
commit
d7e4932eaf
3 changed files with 125 additions and 1 deletions
18
Configurations/platform.pm
Normal file
18
Configurations/platform.pm
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package platform;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use vars qw(@ISA);
|
||||||
|
|
||||||
|
# Callers must make sure @INC has the build directory
|
||||||
|
use configdata;
|
||||||
|
|
||||||
|
my $module = $target{perl_platform} || 'Unix';
|
||||||
|
(my $module_path = $module) =~ s|::|/|g;
|
||||||
|
|
||||||
|
require "platform/$module_path.pm";
|
||||||
|
@ISA = ("platform::$module");
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
96
Configurations/platform/BASE.pm
Normal file
96
Configurations/platform/BASE.pm
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
package platform::BASE;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Carp;
|
||||||
|
|
||||||
|
# Assume someone set @INC right before loading this module
|
||||||
|
use configdata;
|
||||||
|
|
||||||
|
# Globally defined "platform specific" extensions, available for uniformity
|
||||||
|
sub depext { '.d' }
|
||||||
|
|
||||||
|
# Functions to convert internal file representations to platform specific
|
||||||
|
# ones. Note that these all depend on extension functions that MUST be
|
||||||
|
# defined per platform.
|
||||||
|
#
|
||||||
|
# Currently known internal or semi-internal extensions are:
|
||||||
|
#
|
||||||
|
# .a For libraries that are made static only.
|
||||||
|
# Internal libraries only.
|
||||||
|
# .o For object files.
|
||||||
|
# .s, .S Assembler files. This is an actual extension on Unix
|
||||||
|
# .res Resource file. This is an actual extension on Windows
|
||||||
|
|
||||||
|
sub binname { return $_[1] } # Name of executable binary
|
||||||
|
sub dsoname { return $_[1] } # Name of dynamic shared object (DSO)
|
||||||
|
sub sharedname { return __isshared($_[1]) ? $_[1] : undef } # Name of shared lib
|
||||||
|
sub staticname { return __base($_[1], '.a') } # Name of static lib
|
||||||
|
|
||||||
|
# Convenience function to convert the shlib version to an acceptable part
|
||||||
|
# of a file or directory name.
|
||||||
|
sub shlib_version_as_filename { return $_[1] }
|
||||||
|
|
||||||
|
# Convenience functions to convert the possible extension of an input file name
|
||||||
|
sub bin { return $_[0]->binname($_[1]) . $_[0]->binext() }
|
||||||
|
sub dso { return $_[0]->dsoname($_[1]) . $_[0]->dsoext() }
|
||||||
|
sub sharedlib { return __concat($_[0]->sharedname($_[1]), $_[0]->shlibext()) }
|
||||||
|
sub staticlib { return $_[0]->staticname($_[1]) . $_[0]->libext() }
|
||||||
|
|
||||||
|
# More convenience functions for intermediary files
|
||||||
|
sub def { return __base($_[1], '.ld') . $_[0]->defext() }
|
||||||
|
sub obj { return __base($_[1], '.o') . $_[0]->objext() }
|
||||||
|
sub res { return __base($_[1], '.res') . $_[0]->resext() }
|
||||||
|
sub dep { return __base($_[1], '.o') . $_[0]->depext() } # <- objname
|
||||||
|
sub asm { return __base($_[1], '.S', '.s') . $_[0]->asmext() }
|
||||||
|
|
||||||
|
# Another set of convenience functions for standard checks of certain
|
||||||
|
# internal extensions and conversion from internal to platform specific
|
||||||
|
# extension. Note that the latter doesn't deal with libraries because
|
||||||
|
# of ambivalence
|
||||||
|
sub isdef { return $_[1] =~ m|\.ld$|; }
|
||||||
|
sub isobj { return $_[1] =~ m|\.o$|; }
|
||||||
|
sub isres { return $_[1] =~ m|\.res$|; }
|
||||||
|
sub isasm { return $_[1] =~ m|\.[Ss]$|; }
|
||||||
|
sub convertext {
|
||||||
|
if ($_[0]->isdef($_[1])) { return $_[0]->def($_[1]); }
|
||||||
|
if ($_[0]->isobj($_[1])) { return $_[0]->obj($_[1]); }
|
||||||
|
if ($_[0]->isres($_[1])) { return $_[0]->res($_[1]); }
|
||||||
|
if ($_[0]->isasm($_[1])) { return $_[0]->asm($_[1]); }
|
||||||
|
return $_[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
# Helpers ############################################################
|
||||||
|
|
||||||
|
# __base EXPR, LIST
|
||||||
|
# This returns the given path (EXPR) with the matching suffix from LIST stripped
|
||||||
|
sub __base {
|
||||||
|
my $path = shift;
|
||||||
|
foreach (@_) {
|
||||||
|
if ($path =~ m|\Q${_}\E$|) {
|
||||||
|
return $`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
# __isshared EXPR
|
||||||
|
# EXPR is supposed to be a library name. This will return true if that library
|
||||||
|
# can be assumed to be a shared library, otherwise false
|
||||||
|
sub __isshared {
|
||||||
|
return !($disabled{shared} || $_[0] =~ /\.a$/);
|
||||||
|
}
|
||||||
|
|
||||||
|
# __concat LIST
|
||||||
|
# Returns the concatenation of all elements of LIST if none of them is
|
||||||
|
# undefined. If one of them is undefined, returns undef instead.
|
||||||
|
sub __concat {
|
||||||
|
my $result = '';
|
||||||
|
foreach (@_) {
|
||||||
|
return undef unless defined $_;
|
||||||
|
$result .= $_;
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
|
@ -176,10 +176,20 @@ my $text =
|
||||||
# Load the full template (combination of files) into Text::Template
|
# Load the full template (combination of files) into Text::Template
|
||||||
# and fill it up with our data. Output goes directly to STDOUT
|
# and fill it up with our data. Output goes directly to STDOUT
|
||||||
|
|
||||||
|
my $prepend = qq{
|
||||||
|
use File::Spec::Functions;
|
||||||
|
use lib catdir('$config{sourcedir}', 'util', 'perl');
|
||||||
|
};
|
||||||
|
$prepend .= qq{
|
||||||
|
use lib catdir('$config{sourcedir}', 'Configurations');
|
||||||
|
use lib '$config{builddir}';
|
||||||
|
use platform;
|
||||||
|
} if defined $target{perl_platform};
|
||||||
|
|
||||||
my $template =
|
my $template =
|
||||||
OpenSSL::Template->new(TYPE => 'STRING',
|
OpenSSL::Template->new(TYPE => 'STRING',
|
||||||
SOURCE => $text,
|
SOURCE => $text,
|
||||||
PREPEND => qq{use lib "$FindBin::Bin/perl";});
|
PREPEND => $prepend);
|
||||||
|
|
||||||
sub output_reset_on {
|
sub output_reset_on {
|
||||||
$template->output_reset_on();
|
$template->output_reset_on();
|
||||||
|
|
Loading…
Reference in a new issue