include ../build/Makefile-vars
# OPT = -OReleaseFast
# OPT = -OReleaseSafe
OPT = -OReleaseSmall
# OPT = -ODebug
all: deps ${DIST}/.built python
include ../build/Makefile-rules
CPYTHON_WASM = $(shell cowasm-package-path @cowasm/cpython)
POSIX_WASM = $(shell cowasm-package-path @cowasm/posix-wasm)
CFLAGS = -I$(shell cowasm-package-path @cowasm/cpython)/include/python3.11 -I$(shell cowasm-package-path @cowasm/posix-wasm)
LDFLAGS = -L${BUILD} -lpython3.11
###
# Python as a web assembly library with a few extras compiled in
# needed be usable.
###
# This is a little complicated because we *might* have the
# libpython3.11.a compressed in the @cowasm/cpython package,
# since it is 25MB and so rarely needed, except here.
# It's compressed when uploaded to npmjs.com, but not compressed
# when used via the workspace.
${BUILD}/libpython3.11.a:
cp ${CPYTHON_WASM}/lib/libpython3.11.a* ${BUILD}
@[[ -f ${BUILD}/libpython3.11.a ]] || xz -d ${BUILD}/libpython3.11.a.xz
${BUILD}/libpython.o:
mkdir -p ${BUILD}
cd ../build && make zig
${BIN}/cowasm-cc -Oz ${CFLAGS} \
-c ${CPYTHON_WASM}/lib/libpython.c \
-o ${BUILD}/libpython.o
${DIST}/python.wasm: src/python.zig src/signal.zig ${BUILD}/libpython.o ${BUILD}/libpython3.11.a
cd ../build && make zig
mkdir -p ${DIST}
cd src/ \
&& ${BIN}/cowasm-zig \
-cowasm-verbose \
${OPT} \
${CFLAGS} \
${LDFLAGS} \
python.zig \
${BUILD}/libpython.o \
&& rm python.o \
&& mv python.wasm ${DIST}/python.wasm
BUNDLES = ${DIST}/python-minimal.zip ${DIST}/python-readline.zip ${DIST}/python-stdlib.zip ${DIST}/python-everything.zip
${DIST}/python-minimal.zip:
mkdir -p ${DIST}
cp ${CPYTHON_WASM}/lib/dist/python-minimal.zip ${DIST}
${DIST}/python-readline.zip:
mkdir -p ${DIST}
cp ${CPYTHON_WASM}/lib/dist/python-readline.zip ${DIST}
${DIST}/python-stdlib.zip:
mkdir -p ${DIST}
cp ${CPYTHON_WASM}/lib/dist/python-stdlib.zip ${DIST}
PYTHON_PACKAGES = ${DIST}/Cython.tar.xz ${DIST}/mpmath.tar.xz ${DIST}/numpy.tar.xz ${DIST}/sympy.tar.xz ${DIST}/pandas.tar.xz ${DIST}/pytz.tar.xz ${DIST}/dateutil.tar.xz ${DIST}/six.tar.xz
${DIST}/Cython.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-cython) && tar -Jcf ${DIST}/Cython.tar.xz Cython
${DIST}/mpmath.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-mpmath) && tar -Jcf ${DIST}/mpmath.tar.xz mpmath
${DIST}/numpy.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-numpy) && tar -Jcf ${DIST}/numpy.tar.xz numpy
${DIST}/pandas.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/pandas.tar.xz pandas
${DIST}/pytz.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/pytz.tar.xz pytz
${DIST}/dateutil.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/dateutil.tar.xz dateutil
${DIST}/six.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/six.tar.xz six
${DIST}/sympy.tar.xz:
mkdir -p ${DIST}
cd $(shell cowasm-package-path @cowasm/py-sympy) && tar -Jcf ${DIST}/sympy.tar.xz sympy
${DIST}/python-everything.zip: ${DIST}/python-stdlib.zip ${PYTHON_PACKAGES} ${DIST}/python.wasm
cd ${DIST} \
&& cp python-stdlib.zip .python-everything.zip \
&& zip .python-everything.zip *.tar.xz python.wasm \
&& mv .python-everything.zip python-everything.zip
.PHONY: python
python: ${DIST}/python.wasm hello hellozig ${BUNDLES} ${PYTHON_PACKAGES}
###
# An example minimal Python extension module, written in C.
###
PLATFORM = cpython-311-wasm32-wasi
${DIST}/hello.${PLATFORM}.so: src/extension/hellomodule.c
cd ../build && make zig
${BIN}/cowasm-cc -Oz ${CFLAGS} -shared \
src/extension/hellomodule.c -o ${DIST}/hello.${PLATFORM}.so
.PHONEY: hello
hello: ${DIST}/hello.${PLATFORM}.so
###
# An example minimal Python extension module, written in Zig.
###
${DIST}/hellozig.${PLATFORM}.so: src/extension/hellozigmodule.zig src/extension/hellozigmodule.c
cd ../build && make zig
cd src/extension \
&& ${BIN}/cowasm-cc ${CFLAGS} -Oz -c hellozigmodule.c -o hellozigmodule-c.o \
&& ${BIN}/cowasm-zig ${CFLAGS} ${OPT} hellozigmodule-c.o hellozigmodule.zig \
&& rm hellozigmodule-c.o \
&& mv hellozigmodule.wasm ${DIST}/hellozig.${PLATFORM}.so
.PHONEY: hellozig
hellozig: ${DIST}/hellozig.${PLATFORM}.so
###
# Node related makefile wrapping...
###
${DIST}/.built:
mkdir -p ${DIST}
npx tsc
touch ${DIST}/.built
###
# Testing
###
.PHONY: test
test: all
npm run test