From f6bd57cdfa43fb809688a45e8b5bb2f76d82a23f Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Tue, 26 Aug 2008 13:26:48 +0000 Subject: Issue 2168: Mac OS X fixes for SWIG tests. (Greg Noel) --- QMTest/TestSCons.py | 68 +++++++++++++++++++++++++++++------------- src/CHANGES.txt | 2 ++ test/Java/swig-dependencies.py | 4 +-- test/SWIG/build-dir.py | 2 +- test/SWIG/live.py | 18 +++++++---- test/SWIG/module-parens.py | 26 +++++++++++++--- test/SWIG/noproxy.py | 2 +- test/SWIG/remove-modules.py | 2 +- test/SWIG/subdir.py | 2 +- 9 files changed, 89 insertions(+), 37 deletions(-) diff --git a/QMTest/TestSCons.py b/QMTest/TestSCons.py index 1b31852..2d04266 100644 --- a/QMTest/TestSCons.py +++ b/QMTest/TestSCons.py @@ -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. diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 05c7f96..04e19b7 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -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 diff --git a/test/Java/swig-dependencies.py b/test/Java/swig-dependencies.py index cc54180..f71ab31 100644 --- a/test/Java/swig-dependencies.py +++ b/test/Java/swig-dependencies.py @@ -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'], diff --git a/test/SWIG/build-dir.py b/test/SWIG/build-dir.py index 8f122af..85ad7f5 100644 --- a/test/SWIG/build-dir.py +++ b/test/SWIG/build-dir.py @@ -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': diff --git a/test/SWIG/live.py b/test/SWIG/live.py index 5070d8e..893d839 100644 --- a/test/SWIG/live.py +++ b/test/SWIG/live.py @@ -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 diff --git a/test/SWIG/module-parens.py b/test/SWIG/module-parens.py index 0d89ebe..3dabacf 100644 --- a/test/SWIG/module-parens.py +++ b/test/SWIG/module-parens.py @@ -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() diff --git a/test/SWIG/noproxy.py b/test/SWIG/noproxy.py index 8b0adb0..edbffb1 100644 --- a/test/SWIG/noproxy.py +++ b/test/SWIG/noproxy.py @@ -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') diff --git a/test/SWIG/remove-modules.py b/test/SWIG/remove-modules.py index 5f15dcf..ca681ea 100644 --- a/test/SWIG/remove-modules.py +++ b/test/SWIG/remove-modules.py @@ -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 diff --git a/test/SWIG/subdir.py b/test/SWIG/subdir.py index 4905d3e..f96b706 100644 --- a/test/SWIG/subdir.py +++ b/test/SWIG/subdir.py @@ -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 -- cgit v0.12