| diff --git a/numpy/core/code_generators/generate_numpy_api.py b/numpy/core/code_generators/generate_numpy_api.py |
| --- 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 |
| --- 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 |
| --- 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 |
| --- 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 |
| --- 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 |
| --- 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 |
| --- 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 |