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