include ../build/Makefile-vars
# See https://github.com/numpy/numpy/releases
VERSION=1.24.2
URL = https://github.com/numpy/numpy/releases/download/v${VERSION}/numpy-${VERSION}.tar.gz
TARBALL = ${UPSTREAM}/numpy-${VERSION}.tar.gz
CYTHON = ${PACKAGES}/py-cython/dist/wasm
all: deps wasm
include ../build/Makefile-rules
# NOTES:
# - we put fake-bin at the front of the PATH, since build/wasm/numpy/distutils/system_info.py
# explicitly tries to call gcc on the system to get info about the system, and this will hang
# or be very misleading. Instead we put a fake gcc that runs the zig clang wasm32-wasi
# cross compiler.
export PATH := ${SRC}/fake-bin:$(PATH)
${BUILD_WASM}/.patched: ${BUILD_WASM}/.build
cd ${BUILD_WASM} \
&& cat ${SRC}/patches/01-ENH-Add-support-for-platforms-with-missing-fenv-flag.patch | patch -p1 \
&& cat ${SRC}/patches/03-disable-complex.patch | patch -p1 \
&& cat ${SRC}/patches/04-random-no-lm.patch | patch -p1 \
&& cat ${SRC}/patches/05-no-backtrace.patch | patch -p1 \
&& cat ${SRC}/patches/06-setup-setuptools.patch | patch -p1 \
&& echo "" > numpy/core/include/setjmp.h \
&& echo "" > numpy/core/include/execinfo.h
touch ${BUILD_WASM}/.patched
# NOTES:
# - We have to include numpy/core/multiarray.py in addition to the automatic
# numpy/core/multiarray.pyc, since numpy uses __doc__ attributes from
# things in numpy/core/multiarray.py to create the docstrings on the
# numpy module, and that data seems to not be in the pyc file.
# - We do not include numpy headers. They are needed for building other packages, e.g.,
# pandas or a Demo about numpy in the Cython source. Instead, for *building* packages
# we also use `python-wasm setup.py install` to install numpy to site-packages in the cpython package.
# Basically a full build-from source dev setup is needed for building packages from source.
# - We do NOT use cowasm-opt, since it makes the so *larger*.
# - We "python setup.py install" (and not just build) because dependencies
# such as pandas expect a full install in place (with all headers) in
# order to compile themselves.
PYTHONPATH = $(shell cowasm-package-path @cowasm/py-pip):$(shell cowasm-package-path @cowasm/py-cython)
${BUILD_WASM}/.lib: ${BUILD_WASM}/.patched
cd ../build && make zig
# TODO: We install rather than just build *solely* so that
# pip install with pandas doesn't try to install numpy later.
cd ${BUILD_WASM} \
&& PYTHONPATH=${PYTHONPATH} NPY_BLAS_ORDER= NPY_LAPACK_ORDER= BLAS=None LAPACK=None ATLAS=None pnpm-exec cpython setup.py build
touch ${BUILD_WASM}/.lib
${DIST_WASM}/.built: ${BUILD_WASM}/.lib
cd ${BUILD_WASM}/build/lib* \
&& rm -rf numpy/core/include \
&& cp -rv ../src*/numpy/core/include numpy/core/ \
&& pnpm-exec cpython -m cowasm_bundler numpy numpy/core/multiarray.py numpy/core/include
rm -rf ${DIST_WASM} && mkdir -p ${DIST_WASM}
cd ${DIST_WASM} && tar xf ${BUILD_WASM}/build/lib*/numpy.tar.xz
# The include files are needed to building anything that depends on numpy, and they aren't
# in the bundle. These are in addition to the numpy/core/include files in the build,
# which we get above.
cp -r ${BUILD_WASM}/numpy/core/include/* ${DIST_WASM}/numpy/core/include/
touch ${DIST_WASM}/.built
# Just a trivial test for now.
test: ${DIST_WASM}/.built
rm -rf ${BUILD_WASM}/cowasm-test
mkdir -p ${BUILD_WASM}/cowasm-test
@cd ${BUILD_WASM}/cowasm-test \
&& PYTHONPATH=${DIST_WASM} pnpm-exec cpython -c "import numpy; print(numpy.array([3,8,9,5,0,7,7]).sum())" | grep 39 \
&& echo "NUMPY TEST PASSED!"