Home | History | Annotate | Line # | Download | only in platform
      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