From 4976bb1cf85184d9ee545b77fe9d18e064a42bee Mon Sep 17 00:00:00 2001 From: Robert Managan Date: Wed, 24 Oct 2012 16:58:15 -0700 Subject: Treat the sym links as side effects instead of extra targets. This prevents Install from copying the links as full files. Still need to get Install to create the links, if possible. Still a test failure or two to clean up as well. Needs a new test as well. --- src/engine/SCons/Tool/__init__.py | 52 ++++++++++++++++++++++++--------------- 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) -- cgit v0.12