diff --git a/Configurations/platform.pm b/Configurations/platform.pm new file mode 100644 index 0000000000000..909da0ac7202f --- /dev/null +++ b/Configurations/platform.pm @@ -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__ diff --git a/Configurations/platform/BASE.pm b/Configurations/platform/BASE.pm new file mode 100644 index 0000000000000..b7fec110c24ec --- /dev/null +++ b/Configurations/platform/BASE.pm @@ -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; diff --git a/util/dofile.pl b/util/dofile.pl index c5d9e77162394..10a1ad8cf003d 100644 --- a/util/dofile.pl +++ b/util/dofile.pl @@ -176,10 +176,20 @@ sub broken { # Load the full template (combination of files) into Text::Template # 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 = OpenSSL::Template->new(TYPE => 'STRING', SOURCE => $text, - PREPEND => qq{use lib "$FindBin::Bin/perl";}); + PREPEND => $prepend); sub output_reset_on { $template->output_reset_on();