summaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorPawel Tomulik <ptomulik@meil.pw.edu.pl>2015-09-20 03:36:54 (GMT)
committerPawel Tomulik <ptomulik@meil.pw.edu.pl>2015-09-20 03:36:54 (GMT)
commit31a9cc12812eeb3a83dd26010ec6947a79368f96 (patch)
treea5318a66c869ba7bb885aaa6f1a6fd000c99318e /src/engine
parentcb508c9a37c2a3cd5fcf55cc1efd4c47a0abdd41 (diff)
downloadSCons-31a9cc12812eeb3a83dd26010ec6947a79368f96.zip
SCons-31a9cc12812eeb3a83dd26010ec6947a79368f96.tar.gz
SCons-31a9cc12812eeb3a83dd26010ec6947a79368f96.tar.bz2
refactor code -> avoid code duplication
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/SCons/Tool/gnulink.py35
-rw-r--r--src/engine/SCons/Tool/link.py45
-rw-r--r--src/engine/SCons/Tool/sunar.py2
-rw-r--r--src/engine/SCons/Tool/sunlink.py21
4 files changed, 54 insertions, 49 deletions
diff --git a/src/engine/SCons/Tool/gnulink.py b/src/engine/SCons/Tool/gnulink.py
index 2e0ed03..6b0d5b3 100644
--- a/src/engine/SCons/Tool/gnulink.py
+++ b/src/engine/SCons/Tool/gnulink.py
@@ -55,36 +55,13 @@ def generate(env):
env['RPATHSUFFIX'] = ''
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
- # The $_SHLIBVERSIONFLAGS define extra commandline flags used when
- # building VERSIONED shared libraries. It's always set, but used only
- # when VERSIONED library is built (see __SHLIBVERSIONFLAGS).
- if sys.platform.startswith('openbsd'):
- # OpenBSD doesn't usually use SONAME for libraries
- env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
- env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
- else:
- env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -Wl,-soname=$_SHLINKSONAME'
- env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME'
- env['SHLIBVERSIONFLAGS'] = SCons.Util.CLVar('-Wl,-Bsymbolic')
- env['LDMODULEVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
-
- # libfoo.so.X.Y.Z -> libfoo.so.X
- env['_SHLINKSONAME'] = '${ShLibSonameGenerator(__env__,TARGET)}'
- env['_LDMODULESONAME'] = '${LdModSonameGenerator(__env__,TARGET)}'
+ # OpenBSD doesn't usually use SONAME for libraries
+ use_soname = not sys.platform.startswith('openbsd')
+ link._setup_versioned_lib_variables(env, tool = 'gnulink', use_soname = use_soname)
+ env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
- env['ShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
- env['LdModSonameGenerator'] = SCons.Tool.LdModSonameGenerator
-
- env['LINKCALLBACKS'] = {
- 'VersionedShLibSuffix' : link._versioned_lib_suffix,
- 'VersionedLdModSuffix' : link._versioned_lib_suffix,
- 'VersionedShLibSymlinks' : link._versioned_shlib_symlinks,
- 'VersionedLdModSymlinks' : link._versioned_ldmod_symlinks,
- 'VersionedShLibName' : link._versioned_shlib_name,
- 'VersionedLdModName' : link._versioned_ldmod_name,
- 'VersionedShLibSoname' : link._versioned_shlib_soname,
- 'VersionedLdModSoname' : link._versioned_ldmod_soname,
- }
+ # For backward-compatiblity with older SCons versions
+ env['SHLIBVERSIONFLAGS'] = SCons.Util.CLVar('-Wl,-Bsymbolic')
def exists(env):
# TODO: sync with link.smart_link() to choose a linker
diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py
index 0af7776..6bd36e4 100644
--- a/src/engine/SCons/Tool/link.py
+++ b/src/engine/SCons/Tool/link.py
@@ -227,6 +227,51 @@ def _versioned_ldmod_symlinks(env, libnode, version, prefix, suffix):
sf = _versioned_ldmod_soname
return _versioned_lib_symlinks(env, libnode, version, prefix, suffix, nf, sf)
+def _versioned_lib_callbacks():
+ return {
+ 'VersionedShLibSuffix' : _versioned_lib_suffix,
+ 'VersionedLdModSuffix' : _versioned_lib_suffix,
+ 'VersionedShLibSymlinks' : _versioned_shlib_symlinks,
+ 'VersionedLdModSymlinks' : _versioned_ldmod_symlinks,
+ 'VersionedShLibName' : _versioned_shlib_name,
+ 'VersionedLdModName' : _versioned_ldmod_name,
+ 'VersionedShLibSoname' : _versioned_shlib_soname,
+ 'VersionedLdModSoname' : _versioned_ldmod_soname,
+ }.copy()
+
+# Setup all variables required by the versioning machinery
+def _setup_versioned_lib_variables(env, **kw):
+
+ tool = None
+ try: tool = kw['tool']
+ except KeyError: pass
+
+ use_soname = False
+ try: use_soname = kw['use_soname']
+ except KeyError: pass
+
+ # The $_SHLIBVERSIONFLAGS define extra commandline flags used when
+ # building VERSIONED shared libraries. It's always set, but used only
+ # when VERSIONED library is built (see __SHLIBVERSIONFLAGS in SCons/Defaults.py).
+ if use_soname:
+ # If the linker uses SONAME, then we need this little automata
+ if tool == 'sunlink':
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -h $_SHLINKSONAME'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -h $_LDMODULESONAME'
+ else:
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -Wl,-soname=$_SHLINKSONAME'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME'
+ env['_SHLINKSONAME'] = '${ShLibSonameGenerator(__env__,TARGET)}'
+ env['_LDMODULESONAME'] = '${LdModSonameGenerator(__env__,TARGET)}'
+ env['ShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ env['LdModSonameGenerator'] = SCons.Tool.LdModSonameGenerator
+ else:
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
+
+ # LDOMDULVERSIONFLAGS should always default to $SHLIBVERSIONFLAGS
+ env['LDMODULEVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+
def generate(env):
"""Add Builders and construction variables for gnulink to an Environment."""
diff --git a/src/engine/SCons/Tool/sunar.py b/src/engine/SCons/Tool/sunar.py
index 779414f..3ee4344 100644
--- a/src/engine/SCons/Tool/sunar.py
+++ b/src/engine/SCons/Tool/sunar.py
@@ -53,7 +53,7 @@ def generate(env):
env['SHLINK'] = '$LINK'
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
- env['SHLINKCOM'] = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $__SHLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
env['LIBPREFIX'] = 'lib'
env['LIBSUFFIX'] = '.a'
diff --git a/src/engine/SCons/Tool/sunlink.py b/src/engine/SCons/Tool/sunlink.py
index 751bf92..680af03 100644
--- a/src/engine/SCons/Tool/sunlink.py
+++ b/src/engine/SCons/Tool/sunlink.py
@@ -67,25 +67,8 @@ def generate(env):
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
# Support for versioned libraries
- env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -h $_SHLINKSONAME'
- env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -h $_LDMODULESONAME'
-
- env['_SHLINKSONAME'] = '${ShLibSonameGenerator(__env__,TARGET)}'
- env['_LDMODULESONAME'] = '${LdModSonameGenerator(__env__,TARGET)}'
-
- env['ShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
- env['LdModSonameGenerator'] = SCons.Tool.LdModSonameGenerator
-
- env['LINKCALLBACKS'] = {
- 'VersionedShLibSuffix' : link._versioned_lib_suffix,
- 'VersionedLdModSuffix' : link._versioned_lib_suffix,
- 'VersionedShLibSymlinks' : link._versioned_shlib_symlinks,
- 'VersionedLdModSymlinks' : link._versioned_ldmod_symlinks,
- 'VersionedShLibName' : link._versioned_shlib_name,
- 'VersionedLdModName' : link._versioned_ldmod_name,
- 'VersionedShLibSoname' : link._versioned_shlib_soname,
- 'VersionedLdModSoname' : link._versioned_ldmod_soname,
- }
+ link._setup_versioned_lib_variables(env, tool = 'sunlink', use_soname = True)
+ env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
def exists(env):
return ccLinker