|
|
@ -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; |