Merge pull request #4677 from mwichmann/issue/debug-memoizer
[scons.git] / SCons / Tool / linkCommon / LoadableModule.py
blob77a06edddfa916e942ddddfed4f002946b119010
1 # MIT License
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):
34 """
35 Get the basename for a library (so for libxyz.so, return xyz)
36 :param target:
37 :param source:
38 :param env:
39 :param for_signature:
40 :return:
41 """
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)]
52 return target_name
55 def _ldmodule_soversion(target, source, env, for_signature):
56 """Function to determine what to use for SOVERSION"""
58 if 'SOVERSION' in env:
59 return '.$SOVERSION'
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]
64 else:
65 return ''
68 def _ldmodule_soname(target, source, env, for_signature) -> str:
69 if 'SONAME' in env:
70 return '$SONAME'
71 else:
72 return "$LDMODULEPREFIX$_get_ldmodule_stem${LDMODULESUFFIX}$_LDMODULESOVERSION"
74 def _LDMODULEVERSION(target, source, env, for_signature):
75 """
76 Return "." + version if it's set, otherwise just a blank
77 """
78 value = env.subst('$LDMODULEVERSION', target=target, source=source)
79 # print("_has_LDMODULEVERSION:%s"%value)
80 if value:
81 return "."+value
82 else:
83 return ""
85 def setup_loadable_module_logic(env) -> None:
86 """
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.
93 :param env:
94 :return:
95 """
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'