include ../build/Makefile-vars
# OPT = -O ReleaseFast
# OPT = -O ReleaseSafe
OPT = -O ReleaseSmall
# OPT = -O Debug
ZIG_PKG = --main-pkg-path ${SRC}
POSIX_WASM = $(shell cowasm-package-path @cowasm/posix-wasm)
DYLINK_WASM = $(shell cowasm-package-path dylink)/wasm
WASI_EMULATED = -lwasi-emulated-mman -lwasi-emulated-process-clocks -lwasi-emulated-signal
WASM_CFLAGS = -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_PROCESS_CLOCKS -dynamic ${OPT}
all: node_modules deps ${DIST}/.built kernel ${DIST}/termcap ${BIN}/cowasm
include ../build/Makefile-rules
${DIST}/termcap: ${SRC}/termcap
mkdir -p ${DIST}
cp $< $@
${DIST}/.built: node_modules
npx tsc
touch ${DIST}/.built
.PHONY: test
test: all test-misc test-posix
# no jest tests yet
#pnpm run test
strip: node_modules
pnpm run strip
###
# The CoWasm Kernel
###
KERNEL_WASM_SOURCES = \
${POSIX_SOURCES} \
src/kernel/interface.zig \
src/kernel/cowasm.zig \
$(shell find src/wasm/posix/*.zig -type f)
# TODO: I think libedit and libtermcap should probably be dynamic
# libraries that get loaded when needed.
${DIST}/kernel/kernel.wasm: node_modules ${KERNEL_WASM_SOURCES} ${CWD}/src/wasm/posix/stdlib.c
cd ../build && make zig
cd src && zig build-lib \
${WASM_CFLAGS} \
${ZIG_PKG} \
-rdynamic \
-target wasm32-wasi \
--import-memory \
--import-table \
-L${DYLINK_WASM}/ -ldylink -lc -lm ${WASI_EMULATED} \
-I. -I${POSIX_WASM} \
${POSIX_WASM}/libposix.a ${CWD}/src/wasm/posix/stdlib.c \
kernel/interface.zig
mkdir -p ${DIST}/cowasm
rm -f src/interface.wasm.o
mv src/interface.wasm ${DIST}/kernel/kernel.wasm
.PHONY: kernel
kernel: ${DIST}/kernel/kernel.wasm
${BIN}/cowasm:
ln -sf `pwd`/bin/cowasm ${BIN}/cowasm
touch ${BIN}/cowasm
# Using wasm-opt when I put this in shrinks:
# - the non-zip size of the wasm by 10%. (715kb to 645kb)
# - the zip'd size by 3%. (339kb to 329kb)
# Note that this could change if kernel.wasm, llvm, zig, etc., changes over
# time, of course.
.PHONY: opt
opt: ${DIST}/kernel/kernel.wasm
${BIN}/cowasm-opt ${DIST}
###
# Testing
###
# There isn't much using zig testing yet, but should be.
TEST = POSIX_WASM="$(shell cowasm-package-path @cowasm/posix-wasm)" ./test-zig.sh
test-posix:
cd src && \
${TEST} wasm/posix/unistd.zig ${OPT} && \
${TEST} wasm/posix/stdio.zig ${OPT} && \
${TEST} wasm/posix/string.zig ${OPT} && \
${TEST} wasm/posix/stdlib.zig wasm/posix/stdlib.c ${OPT}
${BUILD}/test/hello.wasm: ${SRC}/test/hello.c
mkdir -p ${BUILD}/test/
${BIN}/cowasm-cc -v -fvisibility-main -Oz ${SRC}/test/hello.c -o ${BUILD}/test/hello.wasm
run-hello.wasm: ${BUILD}/test/hello.wasm
${CWD}/bin/cowasm ${CWD}/build/test/hello.wasm | grep "Hello from CoWasm!"
.PHONY: run-hello.wasm
${BUILD}/test/cowsay.wasm: ${SRC}/test/cowsay.c
mkdir -p ${BUILD}/test/
${BIN}/cowasm-cc -fvisibility-main -Oz ${SRC}/test/cowsay.c -o ${BUILD}/test/cowsay.wasm
run-cowsay.wasm: ${BUILD}/test/cowsay.wasm
${CWD}/bin/cowasm ${CWD}/build/test/cowsay.wasm "CoWasm -> CowAsm -> Cow Assembly -----> Make a WebAssembly Cow!"
.PHONY: run-cowsay.wasm
${BUILD}/test/misc.wasm: ${SRC}/test/misc.c
mkdir -p ${BUILD}/test/
${BIN}/cowasm-cc -v -fvisibility-main -Oz ${SRC}/test/misc.c -o ${BUILD}/test/misc.wasm
run-misc.wasm: ${BUILD}/test/misc.wasm
${CWD}/bin/cowasm ${CWD}/build/test/misc.wasm
.PHONY: run-misc.wasm
${BUILD}/test/misc.exe: ${SRC}/test/misc.c
cd ../build && make zig
mkdir -p ${BUILD}/test/
zig cc -Oz ${SRC}/test/misc.c -o ${BUILD}/test/misc.exe
run-misc.exe: ${BUILD}/test/misc.exe
${BUILD}/test/misc.exe
.PHONY: run-misc.exe
test-misc: run-misc.wasm run-cowsay.wasm run-hello.wasm
.PHONY: test-misc