diff --git a/SConscript b/SConscript index e5072565..8867bdfa 100644 --- a/SConscript +++ b/SConscript @@ -7,6 +7,7 @@ # Big thanks to Mike Jarvis for help with the configuration prescriptions below. +from __future__ import print_function import os import sys import subprocess @@ -48,7 +49,7 @@ int main() import distutils.sysconfig except ImportError: context.Result(0) - print 'Failed to import distutils.sysconfig.' + print('Failed to import distutils.sysconfig.') return False context.env.AppendUnique(CPPPATH=[distutils.sysconfig.get_python_inc()]) libDir = distutils.sysconfig.get_config_var("LIBDIR") @@ -74,16 +75,16 @@ int main() if d2 == "Python.framework": if not "Python" in os.listdir(os.path.join(frameworkDir, d2)): context.Result(0) - print ( + print(( "Expected to find Python in framework directory %s, but it isn't there" - % frameworkDir) + % frameworkDir)) return False break context.env.AppendUnique(LINKFLAGS="-F%s" % frameworkDir) result, output = context.TryRun(python_source_file,'.cpp') if not result: context.Result(0) - print "Cannot run program built with Python." + print("Cannot run program built with Python.") return False if context.env["PLATFORM"] == "darwin": context.env["LDMODULESUFFIX"] = ".so" @@ -94,8 +95,17 @@ def CheckNumPy(context): numpy_source_file = """ #include "Python.h" #include "numpy/arrayobject.h" +#if PY_MAJOR_VERSION == 2 +static void wrap_import_array() { + import_array(); +} +#else +static void * wrap_import_array() { + import_array(); +} +#endif void doImport() { - import_array(); + wrap_import_array(); } int main() { @@ -119,29 +129,29 @@ int main() import numpy except ImportError: context.Result(0) - print 'Failed to import numpy.' - print 'Things to try:' - print '1) Check that the command line python (with which you probably installed numpy):' - print ' ', + print('Failed to import numpy.') + print('Things to try:') + print('1) Check that the command line python (with which you probably installed numpy):') + print(' ', end=' ') sys.stdout.flush() subprocess.call('which python',shell=True) - print ' is the same as the one used by SCons:' - print ' ',sys.executable - print ' If not, then you probably need to reinstall numpy with %s.' % sys.executable - print ' Alternatively, you can reinstall SCons with your preferred python.' - print '2) Check that if you open a python session from the command line,' - print ' import numpy is successful there.' + print(' is the same as the one used by SCons:') + print(' ',sys.executable) + print(' If not, then you probably need to reinstall numpy with %s.' % sys.executable) + print(' Alternatively, you can reinstall SCons with your preferred python.') + print('2) Check that if you open a python session from the command line,') + print(' import numpy is successful there.') return False context.env.Append(CPPPATH=numpy.get_include()) result = context.checkLibs([''],numpy_source_file) if not result: context.Result(0) - print "Cannot build against NumPy." + print("Cannot build against NumPy.") return False result, output = context.TryRun(numpy_source_file,'.cpp') if not result: context.Result(0) - print "Cannot run program built with NumPy." + print("Cannot run program built with NumPy.") return False context.Result(1) return True @@ -165,19 +175,20 @@ int main() include = GetOption("boost_include"), lib = GetOption("boost_lib") ) + boost_python_lib = GetOption ('boost_python_lib') result = ( context.checkLibs([''], bp_source_file) or - context.checkLibs(['boost_python'], bp_source_file) or - context.checkLibs(['boost_python-mt'], bp_source_file) + context.checkLibs([boost_python_lib], bp_source_file) or + context.checkLibs([boost_python_lib+'_mt'], bp_source_file) ) if not result: context.Result(0) - print "Cannot build against Boost.Python." + print("Cannot build against Boost.Python.") return False result, output = context.TryRun(bp_source_file, '.cpp') if not result: context.Result(0) - print "Cannot run program built against Boost.Python." + print ("Cannot run program built against Boost.Python.") return False context.Result(1) return True @@ -199,6 +210,8 @@ def setupOptions(): metavar="DIR", help="location of Boost libraries") AddOption("--rpath", dest="custom_rpath", type="string", action="append", help="runtime link paths to add to libraries and executables; may be passed more than once") + AddOption("--boost-python-lib", dest="boost_python_lib", type="string", action="store", + help="name of boost_python_lib", default='boost_python') variables = Variables() variables.Add("CCFLAGS", default=os.environ.get("CCFLAGS", "-O2 -g"), help="compiler flags") return variables @@ -209,7 +222,7 @@ def makeEnvironment(variables): if key in os.environ: shellEnv[key] = os.environ[key] env = Environment(variables=variables, ENV=shellEnv) - if os.environ.has_key("CCFLAGS"): + if "CCFLAGS" in os.environ: env.AppendUnique(CCFLAGS = os.environ["CCFLAGS"]) custom_rpath = GetOption("custom_rpath") if custom_rpath is not None: diff --git a/libs/numpy/src/SConscript b/libs/numpy/src/SConscript index c4fe05b1..11f71432 100644 --- a/libs/numpy/src/SConscript +++ b/libs/numpy/src/SConscript @@ -5,8 +5,25 @@ # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import sys +VERSION = sys.version_info.major +import sysconfig +EXT_SUFFIX = sysconfig.get_config_var("EXT_SUFFIX") + +if VERSION == 2 and EXT_SUFFIX == 'None' or EXT_SUFFIX==None: + EXT_SUFFIX = '.so' +elif VERSION == 3 and EXT_SUFFIX == b'None' or EXT_SUFFIX==None: + EXT_SUFFIX = '.so' +print ('EXT:', EXT_SUFFIX) + +OBJ_SUFFIX = EXT_SUFFIX.replace ('.so', '.os') + Import("env") -lib = env.SharedLibrary("boost_numpy", Glob("*.cpp")) +LIB_BOOST_NUMPY = ('boost_numpy' + EXT_SUFFIX) +mods = [g.name.replace('.cpp', '') for g in Glob("*.cpp")] +for m in mods: + env.SharedObject (target=m+OBJ_SUFFIX, source=m+'.cpp') +lib = env.SharedLibrary(LIB_BOOST_NUMPY, source=[m+OBJ_SUFFIX for m in mods]) Return("lib") diff --git a/libs/numpy/src/dtype.cpp b/libs/numpy/src/dtype.cpp index a21c27eb..f630ec06 100644 --- a/libs/numpy/src/dtype.cpp +++ b/libs/numpy/src/dtype.cpp @@ -114,9 +114,13 @@ public: static void * convertible(PyObject * obj) { if (obj->ob_type == get_pytype()) { return obj; - } else { - return 0; + } else { + dtype dt(python::detail::borrowed_reference(obj->ob_type)); + if (equivalent(dt, dtype::get_builtin())) { + return obj; + } } + return 0; } static void convert(PyObject * obj, pyconv::rvalue_from_python_stage1_data* data) { diff --git a/libs/numpy/test/SConscript b/libs/numpy/test/SConscript index de3bc998..b2366b19 100644 --- a/libs/numpy/test/SConscript +++ b/libs/numpy/test/SConscript @@ -15,8 +15,17 @@ lib_path = os.path.abspath(os.path.join("..", "src")) test_env.Append(LIBPATH=[lib_path]) test_env.Append(RPATH=[lib_path]) test_env.Append(LINKFLAGS = ["$__RPATH"]) # workaround for SCons bug #1644t -test_env.Append(LIBS=["boost_numpy"]) +import sys; +VERSION = sys.version_info.major +print (VERSION) +import sysconfig +EXT_SUFFIX = sysconfig.get_config_var("EXT_SUFFIX") + +if VERSION == 2: + test_env.Append(LIBS=["boost_numpy"]) +elif VERSION == 3: + test_env.Append(LIBS=["boost_numpy"+EXT_SUFFIX.replace('.so', '')]) test = [] def RunPythonUnitTest(target, source, env):