summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2015-02-27 12:27:17 -0500
committerCharles Harris <charlesr.harris@gmail.com>2015-02-27 12:27:17 -0500
commit96abd32de241864ee97f30357234cbc9a96c43ae (patch)
treef53e6e7c1ac8cee5a0aeda47968d68a7bfdb2b7c /numpy
parent06af9918f6bf03b8d818ec834f9fb48db57d1489 (diff)
parent444b5ac1eb8d0e2bfe548770af3ab8e6af846832 (diff)
downloadnumpy-96abd32de241864ee97f30357234cbc9a96c43ae.tar.gz
Merge pull request #5614 from charris/cleanup-gh-5587
BLD: Add support for MinGW-w64/OpenBLAS
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c9
-rw-r--r--numpy/distutils/fcompiler/gnu.py31
-rw-r--r--numpy/distutils/mingw32ccompiler.py44
-rw-r--r--numpy/distutils/system_info.py17
-rw-r--r--numpy/lib/tests/test_function_base.py2
5 files changed, 67 insertions, 36 deletions
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index 79e471cee..1a8fda94d 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -4316,15 +4316,6 @@ PyMODINIT_FUNC initmultiarray(void) {
goto err;
}
-#if defined(MS_WIN64) && defined(__GNUC__)
- PyErr_WarnEx(PyExc_Warning,
- "Numpy built with MINGW-W64 on Windows 64 bits is experimental, " \
- "and only available for \n" \
- "testing. You are advised not to use it for production. \n\n" \
- "CRASHES ARE TO BE EXPECTED - PLEASE REPORT THEM TO NUMPY DEVELOPERS",
- 1);
-#endif
-
/* Initialize access to the PyDateTime API */
numpy_pydatetime_import();
diff --git a/numpy/distutils/fcompiler/gnu.py b/numpy/distutils/fcompiler/gnu.py
index ccd5e8d48..16ad73e5c 100644
--- a/numpy/distutils/fcompiler/gnu.py
+++ b/numpy/distutils/fcompiler/gnu.py
@@ -21,6 +21,8 @@ TARGET_R = re.compile("Target: ([a-zA-Z0-9_\-]*)")
# XXX: handle cross compilation
def is_win64():
return sys.platform == "win32" and platform.architecture()[0] == "64bit"
+def is_win32():
+ return sys.platform == "win32" and platform.architecture()[0] == "32bit"
if is_win64():
#_EXTRAFLAGS = ["-fno-leading-underscore"]
@@ -130,7 +132,7 @@ class GnuFCompiler(FCompiler):
opt.extend(['-undefined', 'dynamic_lookup', '-bundle'])
else:
- opt.append("-shared")
+ opt.append("-shared -Wl,-gc-sections -Wl,-s")
if sys.platform.startswith('sunos'):
# SunOS often has dynamically loaded symbols defined in the
# static library libg2c.a The linker doesn't like this. To
@@ -200,9 +202,17 @@ class GnuFCompiler(FCompiler):
# With this compiler version building Fortran BLAS/LAPACK
# with -O3 caused failures in lib.lapack heevr,syevr tests.
opt = ['-O2']
+ elif v and v>='4.6.0':
+ if is_win32():
+ # use -mincoming-stack-boundary=2
+ # due to the change to 16 byte stack alignment since GCC 4.6
+ # but 32 bit Windows ABI defines 4 bytes stack alignment
+ opt = ['-O2 -march=core2 -mtune=generic -mfpmath=sse -msse2 -mincoming-stack-boundary=2']
+ else:
+ opt = ['-O2 -march=x86-64 -DMS_WIN64 -mtune=generic -msse2']
else:
- opt = ['-O3']
- opt.append('-funroll-loops')
+ opt = ['-O2']
+ # opt.append()
return opt
def _c_arch_flags(self):
@@ -349,10 +359,7 @@ class Gnu95FCompiler(GnuFCompiler):
return ""
def get_flags_opt(self):
- if is_win64():
- return ['-O0']
- else:
- return GnuFCompiler.get_flags_opt(self)
+ return GnuFCompiler.get_flags_opt(self)
def _can_target(cmd, arch):
"""Return true is the command supports the -arch flag for the given
@@ -378,9 +385,13 @@ if __name__ == '__main__':
from distutils import log
log.set_verbosity(2)
- compiler = GnuFCompiler()
- compiler.customize()
- print(compiler.get_version())
+ try:
+ compiler = GnuFCompiler()
+ compiler.customize()
+ print(compiler.get_version())
+ except Exception:
+ msg = get_exception()
+ print(msg)
try:
compiler = Gnu95FCompiler()
diff --git a/numpy/distutils/mingw32ccompiler.py b/numpy/distutils/mingw32ccompiler.py
index c720d142a..bc9573902 100644
--- a/numpy/distutils/mingw32ccompiler.py
+++ b/numpy/distutils/mingw32ccompiler.py
@@ -85,17 +85,28 @@ class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):
elif self.linker_dll == 'gcc':
self.linker = 'g++'
- # **changes: eric jones 4/11/01
- # 1. Check for import library on Windows. Build if it doesn't exist.
+ p = subprocess.Popen(['gcc', '--version'], shell=True,
+ stdout=subprocess.PIPE)
+ out_string = p.stdout.read()
+ p.stdout.close()
+
+ # Before build with MinGW-W64 generate the python import library
+ # with gendef and dlltool according to the MingW-W64 FAQ.
+ # Use the MinGW-W64 provided msvc runtime import libraries.
+ # Don't call build_import_library() and build_msvcr_library.
+
+ if 'MinGW-W64' not in str(out_string):
- build_import_library()
+ # **changes: eric jones 4/11/01
+ # 1. Check for import library on Windows. Build if it doesn't exist.
+ build_import_library()
- # Check for custom msvc runtime library on Windows. Build if it doesn't exist.
- msvcr_success = build_msvcr_library()
- msvcr_dbg_success = build_msvcr_library(debug=True)
- if msvcr_success or msvcr_dbg_success:
- # add preprocessor statement for using customized msvcr lib
- self.define_macro('NPY_MINGW_USE_CUSTOM_MSVCR')
+ # Check for custom msvc runtime library on Windows. Build if it doesn't exist.
+ msvcr_success = build_msvcr_library()
+ msvcr_dbg_success = build_msvcr_library(debug=True)
+ if msvcr_success or msvcr_dbg_success:
+ # add preprocessor statement for using customized msvcr lib
+ self.define_macro('NPY_MINGW_USE_CUSTOM_MSVCR')
# Define the MSVC version as hint for MinGW
msvcr_version = '0x%03i0' % int(msvc_runtime_library().lstrip('msvcr'))
@@ -124,10 +135,10 @@ class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):
else:
# gcc-4 series releases do not support -mno-cygwin option
self.set_executables(
- compiler='gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall',
- compiler_so='gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall -Wstrict-prototypes',
- linker_exe='gcc -g',
- linker_so='gcc -g -shared')
+ compiler='gcc -march=x86-64 -mtune=generic -DMS_WIN64 -O2 -msse2 -Wall',
+ compiler_so='gcc -march=x86-64 -mtune=generic -DMS_WIN64 -O2 -msse2 -Wall -Wstrict-prototypes',
+ linker_exe='gcc',
+ linker_so='gcc -shared -Wl,-gc-sections -Wl,-s')
else:
if self.gcc_version <= "3.0.0":
self.set_executables(compiler='gcc -mno-cygwin -O2 -w',
@@ -142,10 +153,11 @@ class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):
linker_so='g++ -mno-cygwin -shared')
else:
# gcc-4 series releases do not support -mno-cygwin option
- self.set_executables(compiler='gcc -O2 -Wall',
- compiler_so='gcc -O2 -Wall -Wstrict-prototypes',
+ # i686 build needs '-mincoming-stack-boundary=2' due to ABI incompatibility to Win32 ABI
+ self.set_executables(compiler='gcc -O2 -march=core2 -mtune=generic -mfpmath=sse -msse2 -mincoming-stack-boundary=2 -Wall',
+ compiler_so='gcc -O2 -march=core2 -mtune=generic -mfpmath=sse -msse2 -mincoming-stack-boundary=2 -Wall -Wstrict-prototypes',
linker_exe='g++ ',
- linker_so='g++ -shared')
+ linker_so='g++ -shared -Wl,-gc-sections -Wl,-s')
# added for python2.3 support
# we can't pass it through set_executables because pre 2.2 would fail
self.compiler_cxx = ['g++']
diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py
index d73aef59f..25e8a63df 100644
--- a/numpy/distutils/system_info.py
+++ b/numpy/distutils/system_info.py
@@ -1722,6 +1722,23 @@ class openblas_lapack_info(openblas_info):
res = False
finally:
shutil.rmtree(tmpdir)
+ if sys.platform == 'win32' and not res:
+ c = distutils.ccompiler.new_compiler(compiler='mingw32')
+ tmpdir = tempfile.mkdtemp()
+ src = os.path.join(tmpdir, 'source.c')
+ out = os.path.join(tmpdir, 'a.out')
+ try:
+ with open(src, 'wt') as f:
+ f.write(s)
+ obj = c.compile([src], output_dir=tmpdir)
+ try:
+ c.link_executable(obj, out, libraries=info['libraries'],
+ library_dirs=info['library_dirs'])
+ res = True
+ except distutils.ccompiler.LinkError:
+ res = False
+ finally:
+ shutil.rmtree(tmpdir)
return res
diff --git a/numpy/lib/tests/test_function_base.py b/numpy/lib/tests/test_function_base.py
index 03521ca4c..a37c527d9 100644
--- a/numpy/lib/tests/test_function_base.py
+++ b/numpy/lib/tests/test_function_base.py
@@ -668,7 +668,7 @@ class TestVectorize(TestCase):
args = np.array([0, 0.5*np.pi, np.pi, 1.5*np.pi, 2*np.pi])
r1 = f(args)
r2 = np.cos(args)
- assert_array_equal(r1, r2)
+ assert_array_almost_equal(r1, r2)
def test_keywords(self):
import math