summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Managan <managan1@llnl.gov>2012-10-24 16:58:15 -0700
committerRobert Managan <managan1@llnl.gov>2012-10-24 16:58:15 -0700
commit0bae86a7174afc66622218f7205c478482f5dcf5 (patch)
treeba62cdccfd7adc9773233a69a1ba136bb63ffcd1
parent9020cf144c260994335c06e859c50e715cd3eb6b (diff)
downloadscons-0bae86a7174afc66622218f7205c478482f5dcf5.tar.gz
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.
-rw-r--r--src/engine/SCons/Tool/__init__.py52
-rw-r--r--src/engine/SCons/Tool/link.py38
2 files changed, 64 insertions, 26 deletions
diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py
index 134f3369..708fc647 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 9af9b5fd..4ad4948d 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)