pandemonium_engine/SCSCons/Tool/linkCommon/LoadableModule.py

131 lines
4.5 KiB
Python

# MIT License
#
# Copyright The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from SCons.Tool import createLoadableModuleBuilder
from .SharedLibrary import shlib_symlink_emitter
from . import lib_emitter
def ldmod_symlink_emitter(target, source, env, **kw):
return shlib_symlink_emitter(target, source, env, variable_prefix='LDMODULE')
def _get_ldmodule_stem(target, source, env, for_signature):
"""
Get the basename for a library (so for libxyz.so, return xyz)
:param target:
:param source:
:param env:
:param for_signature:
:return:
"""
target_name = str(target)
ldmodule_prefix = env.subst('$LDMODULEPREFIX')
ldmodule_suffix = env.subst("$_LDMODULESUFFIX")
if target_name.startswith(ldmodule_prefix):
target_name = target_name[len(ldmodule_prefix):]
if target_name.endswith(ldmodule_suffix):
target_name = target_name[:-len(ldmodule_suffix)]
return target_name
def _ldmodule_soversion(target, source, env, for_signature):
"""Function to determine what to use for SOVERSION"""
if 'SOVERSION' in env:
return '.$SOVERSION'
elif 'LDMODULEVERSION' in env:
ldmod_version = env.subst('$LDMODULEVERSION')
# We use only the most significant digit of LDMODULEVERSION
return '.' + ldmod_version.split('.')[0]
else:
return ''
def _ldmodule_soname(target, source, env, for_signature):
if 'SONAME' in env:
return '$SONAME'
else:
return "$LDMODULEPREFIX$_get_ldmodule_stem${LDMODULESUFFIX}$_LDMODULESOVERSION"
def _LDMODULEVERSION(target, source, env, for_signature):
"""
Return "." + version if it's set, otherwise just a blank
"""
value = env.subst('$LDMODULEVERSION', target=target, source=source)
# print("_has_LDMODULEVERSION:%s"%value)
if value:
return "."+value
else:
return ""
def setup_loadable_module_logic(env):
"""
Just the logic for loadable modules
For most platforms, a loadable module is the same as a shared
library. Platforms which are different can override these, but
setting them the same means that LoadableModule works everywhere.
:param env:
:return:
"""
createLoadableModuleBuilder(env)
env['_get_ldmodule_stem'] = _get_ldmodule_stem
env['_LDMODULESOVERSION'] = _ldmodule_soversion
env['_LDMODULESONAME'] = _ldmodule_soname
env['LDMODULENAME'] = '${LDMODULEPREFIX}$_get_ldmodule_stem${_LDMODULESUFFIX}'
# This is the non versioned LDMODULE filename
# If LDMODULEVERSION is defined then this will symlink to $LDMODULENAME
env['LDMODULE_NOVERSION_SYMLINK'] = '$_get_shlib_dir${LDMODULEPREFIX}$_get_ldmodule_stem${LDMODULESUFFIX}'
# This is the sonamed file name
# If LDMODULEVERSION is defined then this will symlink to $LDMODULENAME
env['LDMODULE_SONAME_SYMLINK'] = '$_get_shlib_dir$_LDMODULESONAME'
env['_LDMODULEVERSION'] = _LDMODULEVERSION
env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME'
env['LDMODULEEMITTER'] = [lib_emitter, ldmod_symlink_emitter]
env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
env['_LDMODULESUFFIX'] = '${LDMODULESUFFIX}${_LDMODULEVERSION}'
env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
env['LDMODULE'] = '$SHLINK'
env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__LDMODULEVERSIONFLAGS $__RPATH $SOURCES ' \
'$_LIBDIRFLAGS $_LIBFLAGS '
env['LDMODULEVERSION'] = '$SHLIBVERSION'
env['LDMODULENOVERSIONSYMLINKS'] = '$SHLIBNOVERSIONSYMLINKS'