diff options
author | Robert Managan <managan1@llnl.gov> | 2012-11-07 20:33:34 (GMT) |
---|---|---|
committer | Robert Managan <managan1@llnl.gov> | 2012-11-07 20:33:34 (GMT) |
commit | 71735a8d66abd7b60f3a3dc96fb1d3cc9fbb3df0 (patch) | |
tree | e97d455646b1b7b3c7e1ca3e020b3ce2e95a70a1 | |
parent | 66ff94edc6d248131e1038a664c79f96805bcd89 (diff) | |
download | SCons-71735a8d66abd7b60f3a3dc96fb1d3cc9fbb3df0.zip SCons-71735a8d66abd7b60f3a3dc96fb1d3cc9fbb3df0.tar.gz SCons-71735a8d66abd7b60f3a3dc96fb1d3cc9fbb3df0.tar.bz2 |
Get sym links working with VariantDir and add a test
-rw-r--r-- | src/engine/SCons/Tool/__init__.py | 9 | ||||
-rw-r--r-- | src/engine/SCons/Tool/link.py | 2 | ||||
-rw-r--r-- | test/LINK/VersionedLib.py | 154 |
3 files changed, 163 insertions, 2 deletions
diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index 36e2a56..35a05f0 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -291,6 +291,7 @@ symlinks for the platform we are on""" print "VersionShLib: libname = ",libname print "VersionShLib: platform = ",platform print "VersionShLib: shlib_suffix = ",shlib_suffix + print "VersionShLib: target = ",str(target[0]) if version: # set the shared library link flags @@ -319,11 +320,15 @@ symlinks for the platform we are on""" result = SCons.Defaults.ShLinkAction(target, source, envlink) if version: + # here we need the full pathname so the links end up in the right directory + libname = target[0].path linknames = VersionShLibLinkNames(version, libname, env) - # keep name with version in it - lib_ver = libname + # Here we just need the file name w/o path as the target of the link + lib_ver = target[0].name for linkname in linknames: os.symlink(lib_ver,linkname) + if Verbose: + print "VerShLib: made sym link of %s -> %s" % (linkname, lib_ver) return result ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None) diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py index 9c9600e..67d5b19 100644 --- a/src/engine/SCons/Tool/link.py +++ b/src/engine/SCons/Tool/link.py @@ -80,6 +80,8 @@ def shlib_emitter(target, source, env): for name in version_names: env.SideEffect(name, target[0]) env.Clean(target[0], name) + if Verbose: + print "shlib_emitter: add side effect - ",name except KeyError: version = None return (target, source) diff --git a/test/LINK/VersionedLib.py b/test/LINK/VersionedLib.py new file mode 100644 index 0000000..0460444 --- /dev/null +++ b/test/LINK/VersionedLib.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import sys
+import TestSCons
+
+# copied from SCons/Platform/__init__.py
+def platform_default():
+ """Return the platform string for our execution environment.
+
+ The returned value should map to one of the SCons/Platform/*.py
+ files. Since we're architecture independent, though, we don't
+ care about the machine architecture.
+ """
+ osname = os.name
+ if osname == 'java':
+ osname = os._osType
+ if osname == 'posix':
+ if sys.platform == 'cygwin':
+ return 'cygwin'
+ elif sys.platform.find('irix') != -1:
+ return 'irix'
+ elif sys.platform.find('sunos') != -1:
+ return 'sunos'
+ elif sys.platform.find('hp-ux') != -1:
+ return 'hpux'
+ elif sys.platform.find('aix') != -1:
+ return 'aix'
+ elif sys.platform.find('darwin') != -1:
+ return 'darwin'
+ else:
+ return 'posix'
+ elif os.name == 'os2':
+ return 'os2'
+ else:
+ return sys.platform
+
+_exe = TestSCons._exe
+
+test = TestSCons.TestSCons()
+
+test.write('SConstruct', """\
+import os
+env = Environment()
+objs = env.SharedObject('test.c')
+mylib = env.SharedLibrary('test', objs, SHLIBVERSION = '2.5.4')
+env.Program(source=['testapp.c',mylib])
+env.Program(target=['testapp2'],source=['testapp.c','libtest.dylib'])
+instnode = env.Install("#/installtest",mylib)
+env.Default(instnode)
+""")
+
+test.write('test.c', """\
+int testlib(int n)
+{
+return n+1 ;
+}
+""")
+
+test.write('testapp.c', """\
+#include <stdio.h>
+int main(int argc, char **argv)
+{
+int itest ;
+
+itest = testlib(2) ;
+printf("results: testlib(2) = %d\n",itest) ;
+return 0 ;
+}
+""")
+
+platform = platform_default()
+
+test.run()
+
+if platform == 'posix':
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libtest.so',
+ 'libtest.so.2',
+ 'libtest.so.2.5',
+ 'libtest.so.2.5.4',
+ 'test.os',
+ ]
+ # All (?) the files we expect will get created in the 'installtest' directory
+ instfiles = [
+ 'libtest.so',
+ 'libtest.so.2',
+ 'libtest.so.2.5',
+ 'libtest.so.2.5.4',
+ ]
+elif platform == 'darwin':
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libtest.dylib',
+ 'libtest.2.5.4.dylib',
+ 'test.os',
+ ]
+ # All (?) the files we expect will get created in the 'installtest' directory
+ instfiles = [
+ 'libtest.dylib',
+ 'libtest.2.5.4.dylib',
+ ]
+else:
+ # All (?) the files we expect will get created in the current directory
+ files= [
+ 'libtest.so',
+ 'test.os']
+ # All (?) the files we expect will get created in the 'installtest' directory
+ instfiles = []
+
+for f in files:
+ test.must_exist([ f])
+for f in instfiles:
+ test.must_exist(['installtest', f])
+
+test.run(arguments = '-c')
+
+for f in files:
+ test.must_not_exist([ f])
+for f in instfiles:
+ test.must_not_exist(['installtest', f])
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
|