Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/python-wasm
Path: blob/main/python/py-numpy/Makefile
1391 views
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!"