]>
Commit | Line | Data |
---|---|---|
d7e4932e RL |
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 | |
61db9961 RL |
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} } | |
d7e4932e RL |
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 | |
b8d3cf09 | 45 | sub asm { return __base($_[1], '.s') . $_[0]->asmext() } |
d7e4932e RL |
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$|; } | |
b8d3cf09 RL |
54 | sub isasm { return $_[1] =~ m|\.s$|; } |
55 | sub iscppasm { return $_[1] =~ m|\.S$|; } | |
e805c2d6 | 56 | sub isstaticlib { return $_[1] =~ m|\.a$|; } |
d7e4932e | 57 | sub convertext { |
e805c2d6 RL |
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]); } | |
d7e4932e RL |
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; |