diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/engine/SCons/Tool/__init__.py | 52 | ||||
-rw-r--r-- | src/engine/SCons/Tool/link.py | 38 |
2 files changed, 64 insertions, 26 deletions
diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index 134f336..708fc64 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -41,6 +41,7 @@ import imp import sys import re import os +import shutil import SCons.Builder import SCons.Errors @@ -241,23 +242,24 @@ def VersionedSharedLibrary(target = None, source= None, env=None): version = env.subst('$SHLIBVERSION') except KeyError: version = None - libname = str(target[0]) - if Verbose: - print "VersionShLib: libname = ",libname + libname = target[0].name platform = env.subst('$PLATFORM') shlib_suffix = env.subst('$SHLIBSUFFIX') shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS')) + if Verbose: + print "VersionShLib: libname = ",libname + print "VersionShLib: platform = ",platform + print "VersionShLib: shlib_suffix = ",shlib_suffix if version: + # set the shared lib link flags if platform == 'posix': - ilib_suffix = '.' + version - ilib_len = len(ilib_suffix) + suffix_re = re.escape(shlib_suffix + '.' + version) (major, age, revision) = version.split(".") - index = libname.find('.'+major,-ilib_len,-1) - soname = libname[0:index] + "." + major + soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,-soname=%s' % soname ] if Verbose: - print "ilib_suffix ",ilib_suffix,", soname ",soname,", shlink_flags ",shlink_flags + print " soname ",soname,", shlink_flags ",shlink_flags elif platform == 'cygwin': shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,--out-implib,${TARGET.base}.a' ] @@ -265,6 +267,8 @@ def VersionedSharedLibrary(target = None, source= None, env=None): shlink_flags += [ '-current_version', '%s' % version, '-compatibility_version', '%s' % version, '-undefined', 'dynamic_lookup' ] + if Verbose: + print "VersionShLib: shlink_flags = ",shlink_flags envlink = env.Clone() envlink['SHLINKFLAGS'] = shlink_flags else: @@ -273,28 +277,36 @@ def VersionedSharedLibrary(target = None, source= None, env=None): result = SCons.Defaults.ShLinkAction(target, source, envlink) if version: + # keep name with version in it + lib_ver = libname if platform == 'darwin': if version.count(".") != 2: # We need a library name in libfoo.x.y.z.dylib form to proceed raise ValueError - # regex to find version+.dylib in the target name - suffix_re = '[\\.0-9]*%s$' % re.escape(shlib_suffix) - # remove the version string from libname so we can make a symlink - lib_no_ver = re.sub(suffix_re, shlib_suffix, libname) - os.symlink(libname,lib_no_ver) + # create sym link of linkname -> lib_ver, linkname has no version number + suffix_re = re.escape('.' + version + shlib_suffix) + linkname = re.sub(suffix_re, shlib_suffix, libname) + if Verbose: + print "VersionShLib: linkname = ",linkname + os.symlink(lib_ver,linkname) 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) + suffix_re = re.escape(shlib_suffix + '.' + version) + # remove version number for linkname + linkname = re.sub(suffix_re, shlib_suffix, libname) + if Verbose: + print "VersionShLib: linkname = ",linkname + os.symlink(lib_ver, linkname) # 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) + versionparts = version.split('.') + major_name = linkname + "." + versionparts[0] + minor_name = major_name + "." + versionparts[1] + for linkname in [major_name, minor_name]: if Verbose: - print "linksuffix ",linksuffix, ", linkname ",linkname, ", target ",str(target[0]) - os.symlink(str(target[0]),linkname) + print " linkname ",linkname, ", target ",libname + os.symlink(lib_ver,linkname) return False ShLibAction = SCons.Action.Action(VersionedSharedLibrary, "$SHLINKCOMSTR") diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py index 9af9b5f..4ad4948 100644 --- a/src/engine/SCons/Tool/link.py +++ b/src/engine/SCons/Tool/link.py @@ -66,6 +66,7 @@ def smart_link(source, target, env, for_signature): return '$CC' def shlib_emitter(target, source, env): + Verbose = False platform = env.subst('$PLATFORM') for tgt in target: tgt.attributes.shared = 1 @@ -75,15 +76,40 @@ def shlib_emitter(target, source, env): if version: if platform == 'posix': versionparts = version.split('.') - name = str(target[0]) - for ver in versionparts: + name = target[0].name + # generate library name with the version number + version_name = target[0].name + '.' + version + # change the name of the target to version_name + target[0].name = version_name + if Verbose: + print "shlib_emitter: target is ", version_name + print "shlib_emitter: side effect: ", name + # make name w/o version number a side effect (will be a sym link) + env.SideEffect(version_name, target[0]) + env.Clean(target[0], version_name) + if Verbose: + print "shlib_emitter: versionparts ",versionparts + for ver in versionparts[0:-1]: name = name + '.' + ver - target.insert(0, env.fs.File(name)) + if Verbose: + print "shlib_emitter: side effect: ", name + # make side effects of sym links with partial version number + env.SideEffect(name, target[0]) + env.Clean(target[0], name) elif platform == 'darwin': shlib_suffix = env.subst('$SHLIBSUFFIX') - name = str(target[0]) - name = re.sub(shlib_suffix+"$",'.'+version+shlib_suffix,name) - target.insert(0, env.fs.File(name)) + name = target[0].name + # generate library name with the version number + suffix_re = re.escape(shlib_suffix) + version_name = re.sub(suffix_re, '.' + version + shlib_suffix, name) + # change the name of the target to version_name + target[0].name = version_name + if Verbose: + print "shlib_emitter: target is ", version_name + print "shlib_emitter: side effect: ", name + # make name w/o version number a side effect (will be a sym link) + env.SideEffect(version_name, target[0]) + env.Clean(target[0], version_name) except KeyError: version = None return (target, source) |