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. By default, we consider it acceptable as is. sub shlib_version_as_filename { return $config{shlib_version} } # 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 isstaticlib { return $_[1] =~ m|\.a$|; } 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]); } if ($_[0]->isstaticlib($_[1])) { return $_[0]->staticlib($_[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;