1 package platform::BASE; 2 3 use strict; 4 use warnings; 5 use Carp; 6 7 # Assume someone set @INC right before loading this module 8 use configdata; 9 10 # Globally defined "platform specific" extensions, available for uniformity 11 sub depext { '.d' } 12 13 # Functions to convert internal file representations to platform specific 14 # ones. Note that these all depend on extension functions that MUST be 15 # defined per platform. 16 # 17 # Currently known internal or semi-internal extensions are: 18 # 19 # .a For libraries that are made static only. 20 # Internal libraries only. 21 # .o For object files. 22 # .s, .S Assembler files. This is an actual extension on Unix 23 # .res Resource file. This is an actual extension on Windows 24 25 sub binname { return $_[1] } # Name of executable binary 26 sub dsoname { return $_[1] } # Name of dynamic shared object (DSO) 27 sub sharedname { return __isshared($_[1]) ? $_[1] : undef } # Name of shared lib 28 sub staticname { return __base($_[1], '.a') } # Name of static lib 29 30 # Convenience function to convert the shlib version to an acceptable part 31 # of a file or directory name. By default, we consider it acceptable as is. 32 sub shlib_version_as_filename { return $config{shlib_version} } 33 34 # Convenience functions to convert the possible extension of an input file name 35 sub bin { return $_[0]->binname($_[1]) . $_[0]->binext() } 36 sub dso { return $_[0]->dsoname($_[1]) . $_[0]->dsoext() } 37 sub sharedlib { return __concat($_[0]->sharedname($_[1]), $_[0]->shlibext()) } 38 sub staticlib { return $_[0]->staticname($_[1]) . $_[0]->libext() } 39 40 # More convenience functions for intermediary files 41 sub def { return __base($_[1], '.ld') . $_[0]->defext() } 42 sub obj { return __base($_[1], '.o') . $_[0]->objext() } 43 sub res { return __base($_[1], '.res') . $_[0]->resext() } 44 sub dep { return __base($_[1], '.o') . $_[0]->depext() } # <- objname 45 sub asm { return __base($_[1], '.s') . $_[0]->asmext() } 46 47 # Another set of convenience functions for standard checks of certain 48 # internal extensions and conversion from internal to platform specific 49 # extension. Note that the latter doesn't deal with libraries because 50 # of ambivalence 51 sub isdef { return $_[1] =~ m|\.ld$|; } 52 sub isobj { return $_[1] =~ m|\.o$|; } 53 sub isres { return $_[1] =~ m|\.res$|; } 54 sub isasm { return $_[1] =~ m|\.s$|; } 55 sub iscppasm { return $_[1] =~ m|\.S$|; } 56 sub isstaticlib { return $_[1] =~ m|\.a$|; } 57 sub convertext { 58 if ($_[0]->isdef($_[1])) { return $_[0]->def($_[1]); } 59 if ($_[0]->isobj($_[1])) { return $_[0]->obj($_[1]); } 60 if ($_[0]->isres($_[1])) { return $_[0]->res($_[1]); } 61 if ($_[0]->isasm($_[1])) { return $_[0]->asm($_[1]); } 62 if ($_[0]->isstaticlib($_[1])) { return $_[0]->staticlib($_[1]); } 63 return $_[1]; 64 } 65 66 # Helpers ############################################################ 67 68 # __base EXPR, LIST 69 # This returns the given path (EXPR) with the matching suffix from LIST stripped 70 sub __base { 71 my $path = shift; 72 foreach (@_) { 73 if ($path =~ m|\Q${_}\E$|) { 74 return $`; 75 } 76 } 77 return $path; 78 } 79 80 # __isshared EXPR 81 # EXPR is supposed to be a library name. This will return true if that library 82 # can be assumed to be a shared library, otherwise false 83 sub __isshared { 84 return !($disabled{shared} || $_[0] =~ /\.a$/); 85 } 86 87 # __concat LIST 88 # Returns the concatenation of all elements of LIST if none of them is 89 # undefined. If one of them is undefined, returns undef instead. 90 sub __concat { 91 my $result = ''; 92 foreach (@_) { 93 return undef unless defined $_; 94 $result .= $_; 95 } 96 return $result; 97 } 98 99 1; 100