diff options
author | Robert Managan <ramanagan@att.net> | 2012-10-17 04:28:28 (GMT) |
---|---|---|
committer | Robert Managan <ramanagan@att.net> | 2012-10-17 04:28:28 (GMT) |
commit | 54128aa8e74ffb6a8a708e58db210e47956adf48 (patch) | |
tree | 25ed81f7d4f9f2c2c370faa9d78bd75a2ffc61e7 /src/engine/SCons/Tool | |
parent | f494d3c3cab9f0bbcbe5b79d8847faca56c57e8b (diff) | |
download | SCons-54128aa8e74ffb6a8a708e58db210e47956adf48.zip SCons-54128aa8e74ffb6a8a708e58db210e47956adf48.tar.gz SCons-54128aa8e74ffb6a8a708e58db210e47956adf48.tar.bz2 |
Add library version support to Shared Lib builder
Diffstat (limited to 'src/engine/SCons/Tool')
-rw-r--r-- | src/engine/SCons/Tool/__init__.py | 69 | ||||
-rw-r--r-- | src/engine/SCons/Tool/link.py | 11 |
2 files changed, 79 insertions, 1 deletions
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): |