3 # Copyright The SCons Foundation
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
17 # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
18 # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 from SCons
.Tool
import createLoadableModuleBuilder
25 from .SharedLibrary
import shlib_symlink_emitter
26 from . import lib_emitter
29 def ldmod_symlink_emitter(target
, source
, env
, **kw
):
30 return shlib_symlink_emitter(target
, source
, env
, variable_prefix
='LDMODULE')
33 def _get_ldmodule_stem(target
, source
, env
, for_signature
):
35 Get the basename for a library (so for libxyz.so, return xyz)
42 target_name
= str(target
)
43 ldmodule_prefix
= env
.subst('$LDMODULEPREFIX')
44 ldmodule_suffix
= env
.subst("$_LDMODULESUFFIX")
46 if target_name
.startswith(ldmodule_prefix
):
47 target_name
= target_name
[len(ldmodule_prefix
):]
49 if target_name
.endswith(ldmodule_suffix
):
50 target_name
= target_name
[:-len(ldmodule_suffix
)]
55 def _ldmodule_soversion(target
, source
, env
, for_signature
):
56 """Function to determine what to use for SOVERSION"""
58 if 'SOVERSION' in env
:
60 elif 'LDMODULEVERSION' in env
:
61 ldmod_version
= env
.subst('$LDMODULEVERSION')
62 # We use only the most significant digit of LDMODULEVERSION
63 return '.' + ldmod_version
.split('.')[0]
68 def _ldmodule_soname(target
, source
, env
, for_signature
) -> str:
72 return "$LDMODULEPREFIX$_get_ldmodule_stem${LDMODULESUFFIX}$_LDMODULESOVERSION"
74 def _LDMODULEVERSION(target
, source
, env
, for_signature
):
76 Return "." + version if it's set, otherwise just a blank
78 value
= env
.subst('$LDMODULEVERSION', target
=target
, source
=source
)
79 # print("_has_LDMODULEVERSION:%s"%value)
85 def setup_loadable_module_logic(env
) -> None:
87 Just the logic for loadable modules
89 For most platforms, a loadable module is the same as a shared
90 library. Platforms which are different can override these, but
91 setting them the same means that LoadableModule works everywhere.
97 createLoadableModuleBuilder(env
)
99 env
['_get_ldmodule_stem'] = _get_ldmodule_stem
100 env
['_LDMODULESOVERSION'] = _ldmodule_soversion
101 env
['_LDMODULESONAME'] = _ldmodule_soname
103 env
['LDMODULENAME'] = '${LDMODULEPREFIX}$_get_ldmodule_stem${_LDMODULESUFFIX}'
105 # This is the non versioned LDMODULE filename
106 # If LDMODULEVERSION is defined then this will symlink to $LDMODULENAME
107 env
['LDMODULE_NOVERSION_SYMLINK'] = '$_get_shlib_dir${LDMODULEPREFIX}$_get_ldmodule_stem${LDMODULESUFFIX}'
109 # This is the sonamed file name
110 # If LDMODULEVERSION is defined then this will symlink to $LDMODULENAME
111 env
['LDMODULE_SONAME_SYMLINK'] = '$_get_shlib_dir$_LDMODULESONAME'
113 env
['_LDMODULEVERSION'] = _LDMODULEVERSION
115 env
['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME'
117 env
['LDMODULEEMITTER'] = [lib_emitter
, ldmod_symlink_emitter
]
119 env
['LDMODULEPREFIX'] = '$SHLIBPREFIX'
120 env
['_LDMODULESUFFIX'] = '${LDMODULESUFFIX}${_LDMODULEVERSION}'
121 env
['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
123 env
['LDMODULE'] = '$SHLINK'
125 env
['LDMODULEFLAGS'] = '$SHLINKFLAGS'
127 env
['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__LDMODULEVERSIONFLAGS $__RPATH $SOURCES ' \
128 '$_LIBDIRFLAGS $_LIBFLAGS '
130 env
['LDMODULEVERSION'] = '$SHLIBVERSION'
131 env
['LDMODULENOVERSIONSYMLINKS'] = '$SHLIBNOVERSIONSYMLINKS'