include ../build/Makefile-vars
PYTHON = ${PACKAGES}/cpython/dist/wasm
POSIX_WASM = $(shell cowasm-package-path @cowasm/posix-wasm)
all: dist/.built
include ../build/Makefile-rules
dist/.built: dist/index.js dist/wasm/libdylink.a wasm-export node_modules
touch dist/.built
dist/libc.js: node_modules src/libc.ts src/wasm-export.ts
npm run build
touch dist/libc.js
dist/libpython.js: node_modules src/libpython.ts src/wasm-export.ts
npm run build
touch dist/libpython.js
dist/index.js: node_modules src/index.ts
npm run build
touch dist/index.js
dist/wasm-export/libc.c: dist/libc.js
mkdir -p dist/wasm-export/
node ./dist/libc.js > dist/wasm-export/libc.c
# TODO! We are moving this to happen in the cpython
# package in the cowasm-python github repo. That's where
# doing this belongs.
dist/wasm-export/libpython.c: dist/libpython.js
# this is where the generated C code goes:
mkdir -p dist/wasm-export/
echo "TODO" >> dist/wasm-export/libpython.c
# # ensure python source code is available, which libpython.js greps through:
# cd ../cpython && make `pwd`/build/wasm/.patched
# # get the exports by inspecting source code
# node ./dist/libpython.js > dist/wasm-export/libpython.c
wasm-export: dist/wasm-export/libpython.c dist/wasm-export/libc.c
build/wasm/libdylink.o: dist/wasm-export/libc.c
cd ../build && make zig
mkdir -p build/wasm
zig cc -target wasm32-wasi \
-w \
-c \
-rdynamic \
-shared \
-fvisibility=default \
-I ${POSIX_WASM} \
dist/wasm-export/libc.c \
-o build/wasm/libdylink.o
# The way we make dist/wasm/libdylink.a is a bit of a cheat -- we do not
# use ar to make an actual archive, and instead what we call "libdylink.a"
# is just a copy of the .a file! The reason is because
# this way the linker will make all of the __WASM_EXPORT__* functions
# (that return pointers to contents of libc) visible and in the resulting
# wasm file of anything that links this. If we don't do this, and just use
# ar, then all of that stuff is garbage collected away, and our runtime won't
# work at all. In particular, this won't work:
# zig ar -crs dist/wasm/libdylink.a build/wasm/libdylink.o
dist/wasm/libdylink.a: build/wasm/libdylink.o
mkdir -p dist/wasm
cp build/wasm/libdylink.o dist/wasm/libdylink.a
test: wasm-export dist/.built
pnpm install
pnpm run build
cd test/wasi && make test
cd test/python-extension && make test
cd test/malloc && make test
cd test/libc-archive && make test
.PHONY: test
test-native-macos:
pnpm install
pnpm run build
cd test/wasi && make test-native-macos
cd test/python-extension && make test-native-macos
cd test/malloc && make test-native-macos
.PHONY: test-native-macos
.PHONY: clean
clean::
rm -rf build dist tsconfig.tsbuildinfo node_modules
cd test/wasi && make clean
cd test/python-extension && make clean
cd test/malloc && make clean
cd test/libc-archive && make clean
.PHONY: clean-build
clean-build::
rm -rf build test/*/build