Issue 2168: Mac OS X fixes for SWIG tests. (Greg Noel)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 26 Aug 2008 13:26:48 +0000 (13:26 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 26 Aug 2008 13:26:48 +0000 (13:26 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@3311 fdb21ef1-2011-0410-befe-b5e4ea1792b1

QMTest/TestSCons.py
src/CHANGES.txt
test/Java/swig-dependencies.py
test/SWIG/build-dir.py
test/SWIG/live.py
test/SWIG/module-parens.py
test/SWIG/noproxy.py
test/SWIG/remove-modules.py
test/SWIG/subdir.py

index 1b31852eef8082bf9cec5f22b6479343b26c3473..2d042667d6ca4b975b8a12773dfde7f894a7cf4d 100644 (file)
@@ -230,8 +230,8 @@ class TestSCons(TestCommon):
         if not kw.has_key('workdir'):
             kw['workdir'] = ''
 
-       # Term causing test failures due to bogus readline init
-       # control character output on FC8
+        # Term causing test failures due to bogus readline init
+        # control character output on FC8
         # TERM can cause test failures due to control chars in prompts etc.
         os.environ['TERM'] = 'dumb'
 
@@ -492,8 +492,12 @@ class TestSCons(TestCommon):
         import sys
         if not version:
             version=''
+            frame = '/System/Library/Frameworks/JavaVM.framework/Headers/jni.h'
+        else:
+            frame = '/System/Library/Frameworks/JavaVM.framework/Versions/%s*/Headers/jni.h'%version
         jni_dirs = ['/usr/lib/jvm/java-*-sun-%s*/include/jni.h'%version,
                     '/usr/java/jdk%s*/include/jni.h'%version,
+                   frame,
                     ]
         dirs = self.paths(jni_dirs)
         if not dirs:
@@ -953,7 +957,7 @@ print "self._msvs_versions =", str(env['MSVS']['VERSIONS'])
         testing must use the executable version that corresponds to the
         framework we link against, or else we get interpreter errors.
         """
-        if sys.platform == 'darwin':
+        if sys.platform[:6] == 'darwin':
             return '/System/Library/Frameworks/Python.framework/Versions/Current/bin/python'
         else:
             global python
@@ -969,50 +973,72 @@ print "self._msvs_versions =", str(env['MSVS']['VERSIONS'])
         testing must use the executable version that corresponds to the
         framework we link against, or else we get interpreter errors.
         """
-        if sys.platform == 'darwin':
+        if sys.platform[:6] == 'darwin':
             return '"' + self.get_platform_python() + '"'
         else:
             global _python_
             return _python_
 
-    def get_platform_sys_prefix(self):
-        """
-        Returns a "sys.prefix" value suitable for linking on this platform.
-
-        Mac OS X has a built-in Python but no static libpython,
-        so we must link to it using Apple's 'framework' scheme.
-        """
-        if sys.platform == 'darwin':
-            fmt = '/System/Library/Frameworks/Python.framework/Versions/%s/'
-            return fmt % self.get_python_version()
-        else:
-            return sys.prefix
+#    def get_platform_sys_prefix(self):
+#        """
+#        Returns a "sys.prefix" value suitable for linking on this platform.
+#
+#        Mac OS X has a built-in Python but no static libpython,
+#        so we must link to it using Apple's 'framework' scheme.
+#        """
+#        if sys.platform[:6] == 'darwin':
+#            fmt = '/System/Library/Frameworks/Python.framework/Versions/%s/'
+#            return fmt % self.get_python_version()
+#        else:
+#            return sys.prefix
 
     def get_python_frameworks_flags(self):
         """
-        Returns a FRAMEWORKSFLAGS value for linking with Python.
+        Returns a FRAMEWORKS value for linking with Python.
 
         Mac OS X has a built-in Python but no static libpython,
         so we must link to it using Apple's 'framework' scheme.
         """
-        if sys.platform == 'darwin':
-            return '-framework Python'
+        if sys.platform[:6] == 'darwin':
+            return 'Python'
         else:
             return ''
 
     def get_python_inc(self):
         """
         Returns a path to the Python include directory.
+
+        Mac OS X has a built-in Python but no static libpython,
+        so we must link to it using Apple's 'framework' scheme.
         """
+        if sys.platform[:6] == 'darwin':
+            return '/System/Library/Frameworks/Python.framework/Headers'
         try:
             import distutils.sysconfig
         except ImportError:
-            return os.path.join(self.get_platform_sys_prefix(),
-                                'include',
+            return os.path.join(sys.prefix, 'include',
                                 'python' + self.get_python_version())
         else:
             return distutils.sysconfig.get_python_inc()
 
+    def get_python_library_path(self):
+        """
+        Returns the full path of the Python static library (libpython*.a)
+        """
+        python_version = self.get_python_version()
+        python_lib = os.path.join(sys.prefix, 'lib',
+                                  'python%s' % python_version, 'config',
+                                  'libpython%s.a' % python_version)
+        if os.path.exists(python_lib):
+            return python_lib
+        # The library usually exists on OS X as above,
+        # but fall back to the framework layout just in case
+        python_lib = os.path.join(sys.prefix, 'Python')
+        if os.path.exists(python_lib):
+            return python_lib
+        # We can't find it, so maybe it's in the standard path
+        return ''
+
     def wait_for(self, fname, timeout=10.0, popen=None):
         """
         Waits for the specified file name to exist.
index 05c7f9679dc5a1c6e4844119afbd54b6cfb7eab9..04e19b7d40fd9059d90df7c9952ec988a9d25e01 100644 (file)
@@ -42,6 +42,8 @@ RELEASE 1.0.0 - XXX
 
     - Update documentation of SConscript(variant_dir) usage.
 
+    - Fix SWIG tests for (some versions of) Mac OS X.
+
   From Jonas Olsson:
 
     - Print the warning about -j on Windows being potentially unreliable if
index cc5418073416e8f7b9eec256cadc43235eb3cecf..f71ab31ece8433d6a58210d278970b6b53acdb68 100644 (file)
@@ -35,13 +35,13 @@ import TestSCons
 test = TestSCons.TestSCons()
 
 swig = test.where_is('swig')
-
 if not swig:
     test.skip_test('Can not find installed "swig", skipping test.\n')
 
 where_javac, java_version = test.java_where_javac()
 where_javah = test.java_where_javah()
-where_jar = test.java_where_jar()
+#where_jar = test.java_where_jar()
+
 where_java_include=test.java_where_includes()
 
 test.subdir(['foo'],
index 8f122af6802c6ff35209a5847cefab45bbcacb17..85ad7f5049e0afee34b95311e50228547b770780 100644 (file)
@@ -70,7 +70,7 @@ env = Environment(CPPPATH = [".", r'%(python_include_dir)s'],
                   SWIGCXXFILESUFFIX = "_wrap.cpp",
                   LDMODULEPREFIX='_',
                   LDMODULESUFFIX='%(_dll)s',
-                  FRAMEWORKSFLAGS='%(python_frameworks_flags)s')
+                  FRAMEWORKS='%(python_frameworks_flags)s')
 
 import sys
 if sys.version[0] == '1':
index 5070d8e24be3b98a1fbad2c5677c30377e3e22fd..893d8394dfe5e4b40766ad74c20411fdc8543b5d 100644 (file)
@@ -39,7 +39,7 @@ import TestSCons
 if sys.platform == 'win32':
     _dll = '.dll'
 else:
-    _dll   = '.so' 
+    _dll   = '.so'
 
 test = TestSCons.TestSCons()
 
@@ -52,19 +52,24 @@ python = test.get_platform_python()
 _python_ = test.get_quoted_platform_python()
 
 
-
 # handle testing on other platforms:
 ldmodule_prefix = '_'
 
 python_include_dir = test.get_python_inc()
 
 Python_h = os.path.join(python_include_dir, 'Python.h')
-
 if not os.path.exists(Python_h):
     test.skip_test('Can not find %s, skipping test.\n' % Python_h)
 
-python_frameworks_flags = test.get_python_frameworks_flags()
-    
+python_frameworks = test.get_python_frameworks_flags()
+
+# To test the individual Python versions on OS X,
+# particularly versions installed in non-framework locations,
+# we'll need something like this.
+python_library_path = test.get_python_library_path()
+if python_library_path:
+    python_library_path = 'File("""%s""")' % python_library_path
+
 test.write("wrapper.py",
 """import os
 import string
@@ -78,7 +83,8 @@ foo = Environment(SWIGFLAGS='-python',
                   CPPPATH='%(python_include_dir)s/',
                   LDMODULEPREFIX='%(ldmodule_prefix)s',
                   LDMODULESUFFIX='%(_dll)s',
-                  FRAMEWORKSFLAGS='%(python_frameworks_flags)s',
+                  FRAMEWORKS='%(python_frameworks)s',
+                  #LIBS=%(python_library_path)s,
                   )
 
 import sys
index 0d89ebe92dd6bc83f09fe178e5e8db680edfb6d0..3dabacf4608c4053e7381cbf9255613479673c84 100644 (file)
@@ -29,6 +29,7 @@ Verify that we handle %module(directors="1") statements, both with and
 without white space before the opening parenthesis.
 """
 
+import os.path
 import TestSCons
 
 test = TestSCons.TestSCons()
@@ -40,18 +41,35 @@ if not swig:
 
 python_include_dir = test.get_python_inc()
 
+python_frameworks_flags = test.get_python_frameworks_flags()
+
+Python_h = os.path.join(python_include_dir, 'Python.h')
+if not os.path.exists(Python_h):
+    test.skip_test('Can not find %s, skipping test.\n' % Python_h)
+
 test.write(['SConstruct'], """\
-env = Environment(SWIGFLAGS = '-python',
-                  CPPPATH=r"%(python_include_dir)s")
+env = Environment(SWIGFLAGS = '-python -c++',
+                  CPPPATH=r"%(python_include_dir)s",
+                 FRAMEWORKS='%(python_frameworks_flags)s',
+                 )
 
 import sys
 if sys.version[0] == '1':
     # SWIG requires the -classic flag on pre-2.0 Python versions.
     env.Append(SWIGFLAGS = ' -classic')
 
-env.SharedLibrary('test1.so', 'test1.i')
-env.SharedLibrary('test2.so', 'test2.i')
+env.LoadableModule('test1.so', ['test1.i', 'test1.cc'])
+env.LoadableModule('test2.so', ['test2.i', 'test2.cc'])
+env.Clean('.', ['test1_wrap.h', 'test2_wrap.h'])  ### SEE NOTE BELOW
 """ % locals())
+# NOTE: For some reason, this test on OS X is unstable.  The first time 'scons'
+# is run, it works as expected.  However, when 'scons' is run again, the
+# 'test?_wrap.os' files are rebuilt.  (When run a third time, it correctly
+# determines that nothing is to be rebuilt.)  When 'scons -c' is run, the
+# 'test?_wrap.h' files are not removed, meaning that they are not identified
+# by the emitter.  Mentioning the two files in the SConscript file stabilizes
+# the runs and makes the test reliable.  When whatever that is causing this
+# instability is chased down and cured, this hack should be removed.
 
 test.write(['test1.cc'], """\
 int test1func()
index 8b0adb0251796554921c91bdd2c0988c0e3fffb7..edbffb19fa7047291ee2308d51bcbdb02aab071f 100644 (file)
@@ -71,7 +71,7 @@ foo = Environment(SWIGFLAGS=['-python', '-noproxy'],
                   CPPPATH='%(python_include_dir)s',
                   LDMODULEPREFIX='%(ldmodule_prefix)s',
                   LDMODULESUFFIX='%(_dll)s',
-                  FRAMEWORKSFLAGS='%(python_frameworks_flags)s',
+                  FRAMEWORKS='%(python_frameworks_flags)s',
                   )
 
 swig = foo.Dictionary('SWIG')
index 5f15dcf9b8660b37ce6429d9dd49a03fa1d72cee..ca681ea4653a32d573e205c8606b469a22c687f7 100644 (file)
@@ -72,7 +72,7 @@ foo = Environment(SWIGFLAGS='-python',
                   CPPPATH='%(python_include_dir)s',
                   LDMODULEPREFIX='%(ldmodule_prefix)s',
                   LDMODULESUFFIX='%(_dll)s',
-                  FRAMEWORKSFLAGS='%(python_frameworks_flags)s',
+                  FRAMEWORKS='%(python_frameworks_flags)s',
                   )
 
 import sys
index 4905d3e79a2b030188ccaabe7c541480580832ab..f96b706f0e5603c756ff123bf4e760c47620b488 100644 (file)
@@ -70,7 +70,7 @@ env = Environment(SWIGFLAGS='-python',
                   CPPPATH='%(python_include_dir)s/',
                   LDMODULEPREFIX='%(ldmodule_prefix)s',
                   LDMODULESUFFIX='%(_dll)s',
-                  FRAMEWORKSFLAGS='%(python_frameworks_flags)s',
+                  FRAMEWORKS='%(python_frameworks_flags)s',
                   )
 
 import sys