1package platform::BASE; 2 3use strict; 4use warnings; 5use Carp; 6 7# Assume someone set @INC right before loading this module 8use configdata; 9 10# Globally defined "platform specific" extensions, available for uniformity 11sub 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 25sub binname { return $_[1] } # Name of executable binary 26sub dsoname { return $_[1] } # Name of dynamic shared object (DSO) 27sub sharedname { return __isshared($_[1]) ? $_[1] : undef } # Name of shared lib 28sub 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. 32sub shlib_version_as_filename { return $config{shlib_version} } 33 34# Convenience functions to convert the possible extension of an input file name 35sub bin { return $_[0]->binname($_[1]) . $_[0]->binext() } 36sub dso { return $_[0]->dsoname($_[1]) . $_[0]->dsoext() } 37sub sharedlib { return __concat($_[0]->sharedname($_[1]), $_[0]->shlibext()) } 38sub staticlib { return $_[0]->staticname($_[1]) . $_[0]->libext() } 39 40# More convenience functions for intermediary files 41sub def { return __base($_[1], '.ld') . $_[0]->defext() } 42sub obj { return __base($_[1], '.o') . $_[0]->objext() } 43sub res { return __base($_[1], '.res') . $_[0]->resext() } 44sub dep { return __base($_[1], '.o') . $_[0]->depext() } # <- objname 45sub 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 51sub isdef { return $_[1] =~ m|\.ld$|; } 52sub isobj { return $_[1] =~ m|\.o$|; } 53sub isres { return $_[1] =~ m|\.res$|; } 54sub isasm { return $_[1] =~ m|\.s$|; } 55sub iscppasm { return $_[1] =~ m|\.S$|; } 56sub isstaticlib { return $_[1] =~ m|\.a$|; } 57sub 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 70sub __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 83sub __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. 90sub __concat { 91 my $result = ''; 92 foreach (@_) { 93 return undef unless defined $_; 94 $result .= $_; 95 } 96 return $result; 97} 98 991; 100