summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRobert Managan <ramanagan@att.net>2012-10-17 04:28:28 (GMT)
committerRobert Managan <ramanagan@att.net>2012-10-17 04:28:28 (GMT)
commit54128aa8e74ffb6a8a708e58db210e47956adf48 (patch)
tree25ed81f7d4f9f2c2c370faa9d78bd75a2ffc61e7 /src
parentf494d3c3cab9f0bbcbe5b79d8847faca56c57e8b (diff)
downloadSCons-54128aa8e74ffb6a8a708e58db210e47956adf48.zip
SCons-54128aa8e74ffb6a8a708e58db210e47956adf48.tar.gz
SCons-54128aa8e74ffb6a8a708e58db210e47956adf48.tar.bz2
Add library version support to Shared Lib builder
Diffstat (limited to 'src')
-rw-r--r--src/engine/SCons/Environment.py3
-rw-r--r--src/engine/SCons/Tool/__init__.py69
-rw-r--r--src/engine/SCons/Tool/link.py11
3 files changed, 80 insertions, 3 deletions
diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py
index 9a7a848..0bb92ed 100644
--- a/src/engine/SCons/Environment.py
+++ b/src/engine/SCons/Environment.py
@@ -2249,9 +2249,7 @@ class Base(SubstitutionEnvironment):
def VersionedSharedLibrary(self, libname, version, lib_objs=[],parse_flags=[]):
platform = self.subst('$PLATFORM')
- shlib_pre_action = None
shlib_suffix = self.subst('$SHLIBSUFFIX')
- shlib_post_action = None
shlink_flags = SCons.Util.CLVar(self.subst('$SHLINKFLAGS'))
if platform == 'posix':
@@ -2259,6 +2257,7 @@ class Base(SubstitutionEnvironment):
(major, age, revision) = version.split(".")
soname = "lib" + libname + shlib_suffix + "." + major
shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,-soname=%s' % soname ]
+ print "ilib_suffix ",ilib_suffix,", soname ",soname,", shlink_flags ",shlink_flags
elif platform == 'cygwin':
ilib_suffix = shlib_suffix
shlink_flags += [ '-Wl,-Bsymbolic',
diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py
index 5357959..ba473a5 100644
--- a/src/engine/SCons/Tool/__init__.py
+++ b/src/engine/SCons/Tool/__init__.py
@@ -39,6 +39,8 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import imp
import sys
+import re
+import os
import SCons.Builder
import SCons.Errors
@@ -233,6 +235,71 @@ def createStaticLibBuilder(env):
return static_lib
+def VersionedSharedLibrary(target = None, source= None, env=None):
+ Verbose = False
+ try:
+ version = env.subst('$SHLIBVERSION')
+ except KeyError:
+ version = None
+ libname = str(target[0])
+ if Verbose:
+ print "VersionShLib: libname = ",libname
+ platform = env.subst('$PLATFORM')
+ shlib_suffix = env.subst('$SHLIBSUFFIX')
+ shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
+
+ if version:
+ if platform == 'posix':
+ ilib_suffix = '.' + version
+ ilib_len = len(ilib_suffix)
+ (major, age, revision) = version.split(".")
+ index = libname.find('.'+major,-ilib_len,-1)
+ soname = libname[0:index] + "." + major
+ shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,-soname=%s' % soname ]
+ if Verbose:
+ print "ilib_suffix ",ilib_suffix,", soname ",soname,", shlink_flags ",shlink_flags
+ elif platform == 'cygwin':
+ ilib_suffix = shlib_suffix
+ shlink_flags += [ '-Wl,-Bsymbolic',
+ '-Wl,--out-implib,${TARGET.base}.a' ]
+ elif platform == 'darwin':
+ ilib_suffix = '.' + version + shlib_suffix
+ shlink_flags += [ '-current_version', '%s' % version,
+ '-compatibility_version', '%s' % version,
+ '-undefined', 'dynamic_lookup' ]
+ envlink = env.Clone()
+ envlink['SHLINKFLAGS'] = shlink_flags
+ else:
+ envlink = env
+
+ result = SCons.Defaults.ShLinkAction(target, source, envlink)
+
+ if version:
+ if platform == 'darwin':
+ if version.count(".") != 2:
+ # We need a library name in libfoo.x.y.z.dylib form to proceed
+ raise ValueError
+ lib = libname + '.dylib'
+ lib_no_ver = libname + '.dylib'
+ suffix_re = '%s\\.[0-9\\.]*$' % re.escape(shlib_suffix)
+ lib_no_ver = re.sub(suffix_re, shlib_suffix, lib)
+ elif platform == 'posix':
+ if version.count(".") != 2:
+ # We need a library name in libfoo.so.x.y.z form to proceed
+ raise ValueError
+ suffix_re = '%s\\.[0-9\\.]*$' % re.escape(shlib_suffix)
+ # For libfoo.so.x.y.z, links libfoo.so libfoo.so.x.y libfoo.so.x
+ major_name = shlib_suffix + "." + libname.split(".")[2]
+ minor_name = major_name + "." + libname.split(".")[3]
+ for linksuffix in [shlib_suffix, major_name, minor_name]:
+ linkname = re.sub(suffix_re, linksuffix, libname)
+ if Verbose:
+ print "linksuffix ",linksuffix, ", linkname ",linkname, ", target ",str(target[0])
+ os.symlink(str(target[0]),linkname)
+ return False
+
+ShLibAction = SCons.Action.Action(VersionedSharedLibrary, "$SHLINKCOMSTR")
+
def createSharedLibBuilder(env):
"""This is a utility function that creates the SharedLibrary
Builder in an Environment if it is not there already.
@@ -245,7 +312,7 @@ def createSharedLibBuilder(env):
except KeyError:
import SCons.Defaults
action_list = [ SCons.Defaults.SharedCheck,
- SCons.Defaults.ShLinkAction ]
+ ShLibAction ]
shared_lib = SCons.Builder.Builder(action = action_list,
emitter = "$SHLIBEMITTER",
prefix = '$SHLIBPREFIX',
diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py
index fae7f63..2d67a1a 100644
--- a/src/engine/SCons/Tool/link.py
+++ b/src/engine/SCons/Tool/link.py
@@ -66,6 +66,17 @@ def smart_link(source, target, env, for_signature):
def shlib_emitter(target, source, env):
for tgt in target:
tgt.attributes.shared = 1
+ try:
+ # target[0] comes in as libtest.so. Add the version extensions
+ version = env.subst('$SHLIBVERSION')
+ if version:
+ versionparts = version.split('.')
+ name = str(target[0])
+ for ver in versionparts:
+ name = name + '.' + ver
+ target.insert(0, env.fs.File(name))
+ except KeyError:
+ version = None
return (target, source)
def generate(env):