Commits

Rob Managan committed e00c5c6

Get sym links working with VariantDir and add a test

Comments (0)

Files changed (3)

src/engine/SCons/Tool/__init__.py

         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
     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)

src/engine/SCons/Tool/link.py

             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)

test/LINK/VersionedLib.py

+#!/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:
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.