Index: ports/python_modules/numpy/nacl.patch |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/ports/python_modules/numpy/nacl.patch |
@@ -0,0 +1,174 @@ |
+diff --git a/numpy/core/code_generators/generate_numpy_api.py b/numpy/core/code_generators/generate_numpy_api.py |
+index ce270a6..4094a56 100644 |
+--- a/numpy/core/code_generators/generate_numpy_api.py |
++++ b/numpy/core/code_generators/generate_numpy_api.py |
+@@ -111,14 +111,18 @@ _import_array(void) |
+ } |
+ #if NPY_BYTE_ORDER == NPY_BIG_ENDIAN |
+ if (st != NPY_CPU_BIG) { |
+- PyErr_Format(PyExc_RuntimeError, "FATAL: module compiled as "\ |
+- "big endian, but detected different endianness at runtime"); |
++ PyErr_Format(PyExc_RuntimeError, "FATAL: (for real) module compiled as "\ |
++ "big endian, but detected different endianness at runtime. "\ |
++ "(%%d %%d %%d) (%%d %%d)", st, (int) NPY_CPU_BIG, (int) NPY_CPU_LITTLE, |
++ (int) NPY_BIG_ENDIAN, (int) NPY_LITTLE_ENDIAN); |
+ return -1; |
+ } |
+ #elif NPY_BYTE_ORDER == NPY_LITTLE_ENDIAN |
+ if (st != NPY_CPU_LITTLE) { |
+- PyErr_Format(PyExc_RuntimeError, "FATAL: module compiled as "\ |
+- "little endian, but detected different endianness at runtime"); |
++ PyErr_Format(PyExc_RuntimeError, "FATAL: (for real) module compiled as "\ |
++ "little endian, but detected different endianness at runtime. " \ |
++ "(%%d %%d %%d) (%%d %%d)", st, (int) NPY_CPU_BIG, (int) NPY_CPU_LITTLE, |
++ (int) NPY_BIG_ENDIAN, (int) NPY_LITTLE_ENDIAN); |
+ return -1; |
+ } |
+ #endif |
+diff --git a/numpy/core/include/numpy/npy_cpu.h b/numpy/core/include/numpy/npy_cpu.h |
+index ab14731..86c48ac 100644 |
+--- a/numpy/core/include/numpy/npy_cpu.h |
++++ b/numpy/core/include/numpy/npy_cpu.h |
+@@ -27,7 +27,10 @@ |
+ * i386 by Sun compilers on opensolaris at least |
+ */ |
+ #define NPY_CPU_X86 |
+-#elif defined(__x86_64__) || defined(__amd64__) || defined(__x86_64) || defined(_M_AMD64) |
++/* For [P]NaCl toolchain, we need to define a CPU manually in order to ensure |
++ * it has been defined at all. This only comes into play in a handful of |
++ * places, but is necessary to generate any code at all. */ |
++#elif defined(__x86_64__) || defined(__amd64__) || defined(__x86_64) || defined(_M_AMD64) || defined (__native_client__) |
+ /* |
+ * both __x86_64__ and __amd64__ are defined by gcc |
+ * __x86_64 defined by sun compiler on opensolaris at least |
+diff --git a/numpy/core/setup.py b/numpy/core/setup.py |
+index 28b15aa..a6c8513 100644 |
+--- a/numpy/core/setup.py |
++++ b/numpy/core/setup.py |
+@@ -288,7 +288,7 @@ def check_types(config_cmd, ext, build_dir): |
+ "Cannot compile 'Python.h'. Perhaps you need to "\ |
+ "install python-dev|python-devel.") |
+ res = config_cmd.check_header("endian.h") |
+- if res: |
++ if res and os.environ.get("NACL_PORT_BUILD") not in ["host", "bootstrap"]: |
+ private_defines.append(('HAVE_ENDIAN_H', 1)) |
+ public_defines.append(('NPY_HAVE_ENDIAN_H', 1)) |
+ |
+@@ -465,7 +465,7 @@ def configuration(parent_package='',top_path=None): |
+ 'MOTOROLA_EXTENDED_12_BYTES_BE', |
+ 'IEEE_QUAD_LE', 'IEEE_QUAD_BE', |
+ 'IEEE_DOUBLE_LE', 'IEEE_DOUBLE_BE', |
+- 'DOUBLE_DOUBLE_BE']: |
++ 'DOUBLE_DOUBLE_BE', "NO_LONG_DOUBLE"]: |
+ moredefs.append(('HAVE_LDOUBLE_%s' % rep, 1)) |
+ else: |
+ raise ValueError("Unrecognized long double format: %s" % rep) |
+@@ -648,12 +648,13 @@ def configuration(parent_package='',top_path=None): |
+ # explicitly add an extension which has generate_config_h and |
+ # generate_numpyconfig_h as sources *before* adding npymath. |
+ |
+- config.add_extension('_dummy', |
+- sources = [join('src', 'dummymodule.c'), |
+- generate_config_h, |
+- generate_numpyconfig_h, |
+- generate_numpy_api] |
+- ) |
++ if os.environ.get("NACL_PORT_BUILD") != "bootstrap": |
++ config.add_extension('_dummy', |
++ sources = [join('src', 'dummymodule.c'), |
++ generate_config_h, |
++ generate_numpyconfig_h, |
++ generate_numpy_api] |
++ ) |
+ |
+ ####################################################################### |
+ # npymath library # |
+diff --git a/numpy/core/setup_common.py b/numpy/core/setup_common.py |
+index bad3607..1574d0d 100644 |
+--- a/numpy/core/setup_common.py |
++++ b/numpy/core/setup_common.py |
+@@ -3,6 +3,7 @@ from __future__ import division, absolute_import, print_function |
+ # Code common to build tools |
+ import sys |
+ from os.path import join |
++import os |
+ import warnings |
+ import copy |
+ import binascii |
+@@ -304,5 +305,7 @@ def long_double_representation(lines): |
+ if saw is not None: |
+ raise ValueError("Unrecognized format (%s)" % saw) |
+ else: |
++ if os.environ.get("NACL_PORT_BUILD") == "bootstrap": |
++ return "NO_LONG_DOUBLE" |
+ # We never detected the after_sequence |
+ raise ValueError("Could not lock sequences (%s)" % saw) |
+diff --git a/numpy/core/src/npymath/npy_math_private.h b/numpy/core/src/npymath/npy_math_private.h |
+index 2bca6bf..9d35356 100644 |
+--- a/numpy/core/src/npymath/npy_math_private.h |
++++ b/numpy/core/src/npymath/npy_math_private.h |
+@@ -51,29 +51,27 @@ |
+ * fix this at some point */ |
+ #define IEEE_WORD_ORDER NPY_BYTE_ORDER |
+ |
+-#if IEEE_WORD_ORDER == NPY_BIG_ENDIAN |
++#if (IEEE_WORD_ORDER == NPY_LITTLE_ENDIAN) || defined(__native_client__) |
+ |
+ typedef union |
+ { |
+ double value; |
+ struct |
+ { |
+- npy_uint32 msw; |
+ npy_uint32 lsw; |
++ npy_uint32 msw; |
+ } parts; |
+ } ieee_double_shape_type; |
+ |
+-#endif |
+- |
+-#if IEEE_WORD_ORDER == NPY_LITTLE_ENDIAN |
++#elif IEEE_WORD_ORDER == NPY_BIG_ENDIAN |
+ |
+ typedef union |
+ { |
+ double value; |
+ struct |
+ { |
+- npy_uint32 lsw; |
+ npy_uint32 msw; |
++ npy_uint32 lsw; |
+ } parts; |
+ } ieee_double_shape_type; |
+ |
+diff --git a/numpy/core/src/private/npy_fpmath.h b/numpy/core/src/private/npy_fpmath.h |
+index 8a120ca..984bd65 100644 |
+--- a/numpy/core/src/private/npy_fpmath.h |
++++ b/numpy/core/src/private/npy_fpmath.h |
+@@ -7,6 +7,10 @@ |
+ #include "numpy/npy_cpu.h" |
+ #include "numpy/npy_common.h" |
+ |
++#ifdef __native_client__ |
++ #define HAVE_LDOUBLE_IEEE_DOUBLE_LE |
++#endif |
++ |
+ #ifdef NPY_OS_DARWIN |
+ /* This hardcoded logic is fragile, but universal builds makes it |
+ * difficult to detect arch-specific features */ |
+diff --git a/numpy/distutils/misc_util.py b/numpy/distutils/misc_util.py |
+index f77e525..7bdaee6 100644 |
+--- a/numpy/distutils/misc_util.py |
++++ b/numpy/distutils/misc_util.py |
+@@ -2036,6 +2036,11 @@ def get_cmd(cmdname, _cache={}): |
+ |
+ def get_numpy_include_dirs(): |
+ # numpy_include_dirs are set by numpy/core/setup.py, otherwise [] |
++ if os.environ.get("NACL_PORT_BUILD") == "dest": |
++ # We fake our numpy includes when building on the destination. |
++ base_path = os.environ["NACL_BUILD_TREE"] |
++ return [os.path.join(base_path, |
++ "lib/python2.7/site-packages/numpy/core/include")] |
+ include_dirs = Configuration.numpy_include_dirs[:] |
+ if not include_dirs: |
+ import numpy |