summaryrefslogtreecommitdiffstats
path: root/ext/wasm/wasmfs.make
diff options
context:
space:
mode:
Diffstat (limited to 'ext/wasm/wasmfs.make')
-rw-r--r--ext/wasm/wasmfs.make115
1 files changed, 115 insertions, 0 deletions
diff --git a/ext/wasm/wasmfs.make b/ext/wasm/wasmfs.make
new file mode 100644
index 0000000..71c0fe7
--- /dev/null
+++ b/ext/wasm/wasmfs.make
@@ -0,0 +1,115 @@
+#!/usr/bin/make
+#^^^^ help emacs select makefile mode
+#
+# This is a sub-make for building a standalone wasmfs-based
+# sqlite3.wasm. It is intended to be "include"d from the main
+# GNUMakefile.
+########################################################################
+MAKEFILE.wasmfs := $(lastword $(MAKEFILE_LIST))
+$(warning The WASMFS build is currently incomplete.)
+
+#dir.wasmfs := $(dir.wasm)
+dir.wasmfs := $(dir.dout)
+sqlite3-wasmfs.js := $(dir.wasmfs)/sqlite3-wasmfs.js
+sqlite3-wasmfs.mjs := $(dir.wasmfs)/sqlite3-wasmfs.mjs
+sqlite3-wasmfs.wasm := $(dir.wasmfs)/sqlite3-wasmfs.wasm
+
+CLEAN_FILES += $(sqlite3-wasmfs.js) $(sqlite3-wasmfs.wasm) \
+ $(subst .js,.worker.js,$(sqlite3-wasmfs.js)) \
+ $(sqlite3-wasmfs.mjs) \
+ $(subst .mjs,.worker.mjs,$(sqlite3-wasmfs.mjs))
+
+########################################################################
+# emcc flags for .c/.o.
+cflags.sqlite3-wasmfs :=
+cflags.sqlite3-wasmfs += -std=c99 -fPIC
+cflags.sqlite3-wasmfs += -pthread
+cflags.sqlite3-wasmfs += -DSQLITE_ENABLE_WASMFS
+
+########################################################################
+# emcc flags specific to building the final .js/.wasm file...
+emcc.flags.sqlite3-wasmfs :=
+emcc.flags.sqlite3-wasmfs += \
+ -sEXPORTED_RUNTIME_METHODS=wasmMemory,allocateUTF8OnStack,stringToUTF8OnStack
+ # wasmMemory ==> for -sIMPORTED_MEMORY
+ # *OnStack ==> wasmfs internals (leaky abstraction)
+emcc.flags.sqlite3-wasmfs += -sUSE_CLOSURE_COMPILER=0
+emcc.flags.sqlite3-wasmfs += -Wno-limited-postlink-optimizations
+# ^^^^^ it likes to warn when we have "limited optimizations" via the -g3 flag.
+emcc.flags.sqlite3-wasmfs += -sMEMORY64=0
+emcc.flags.sqlite3-wasmfs += -sINITIAL_MEMORY=$(emcc.INITIAL_MEMORY.128)
+# ^^^^ 64MB is not enough for WASMFS/OPFS test runs using batch-runner.js
+sqlite3-wasmfs.fsflags := -pthread -sWASMFS \
+ -sPTHREAD_POOL_SIZE=1 \
+ -sERROR_ON_UNDEFINED_SYMBOLS=0 -sLLD_REPORT_UNDEFINED
+# ^^^^^ why undefined symbols are necessary for the wasmfs build is anyone's guess.
+emcc.flags.sqlite3-wasmfs += $(sqlite3-wasmfs.fsflags)
+emcc.flags.sqlite3-wasmfs += -sALLOW_MEMORY_GROWTH=0
+#^^^ using ALLOW_MEMORY_GROWTH produces a warning from emcc:
+# USE_PTHREADS + ALLOW_MEMORY_GROWTH may run non-wasm code slowly,
+# see https://github.com/WebAssembly/design/issues/1271 [-Wpthreads-mem-growth]
+# And, indeed, it runs slowly if memory is permitted to grow.
+#emcc.flags.sqlite3-wasmfs.vanilla :=
+#emcc.flags.sqlite3-wasmfs.esm := -sEXPORT_ES6 -sUSE_ES6_IMPORT_META
+sqlite3-api.mjs.wasmfs := $(dir.tmp)/sqlite3-api-wasmfs.mjs
+$(eval $(call SETUP_LIB_BUILD_MODE,sqlite3-wasmfs,esm,1,\
+ $(sqlite3-api.mjs.wasmfs), $(sqlite3-wasmfs.mjs),\
+ $(c-pp.D.sqlite3-bundler-friendly) -Dwasmfs,\
+ -sEXPORT_ES6 -sUSE_ES6_IMPORT_META\
+))
+$(sqlite3-wasmfs.js) $(sqlite3-wasmfs.mjs): $(MAKEFILE.wasmfs)
+########################################################################
+# Build quirk: we cannot build BOTH .js and .mjs with our current
+# build infrastructure because the supplemental *.worker.js files get
+# generated with the name of the main module file
+# ($(sqlite3-wasmfs.{js,mjs})) hard-coded in them. Thus the last one
+# to get built gets the *.worker.js files mapped to it. In order to
+# build both modes they would need to have distinct base names or
+# output directories. "The problem" with giving them distinct base
+# names is that it means that the corresponding .wasm file is also
+# built/saved multiple times.
+#
+wasmfs.build.ext := mjs
+$(sqlite3-wasmfs.js) $(sqlite3-wasmfs.mjs): $(SOAP.js.bld)
+ifeq (js,$(wasmfs.build.ext))
+ $(sqlite3-wasmfs.wasm): $(sqlite3-wasmfs.js)
+ wasmfs: $(sqlite3-wasmfs.js)
+else
+ $(sqlite3-wasmfs.wasm): $(sqlite3-wasmfs.mjs)
+ wasmfs: $(sqlite3-wasmfs.mjs)
+endif
+#all: wasmfs
+
+########################################################################
+# speedtest1 for wasmfs.
+speedtest1-wasmfs.mjs := $(dir.wasmfs)/speedtest1-wasmfs.mjs
+speedtest1-wasmfs.wasm := $(subst .mjs,.wasm,$(speedtest1-wasmfs.mjs))
+emcc.flags.speedtest1-wasmfs := $(sqlite3-wasmfs.fsflags)
+emcc.flags.speedtest1-wasmfs += $(SQLITE_OPT)
+emcc.flags.speedtest1-wasmfs += -sALLOW_MEMORY_GROWTH=0
+emcc.flags.speedtest1-wasmfs += -sINITIAL_MEMORY=$(emcc.INITIAL_MEMORY.128)
+#$(eval $(call call-make-pre-js,speedtest1-wasmfs,ems))
+$(speedtest1-wasmfs.mjs): $(speedtest1.cfiles) $(sqlite3-wasmfs.js) \
+ $(MAKEFILE) $(MAKEFILE.wasmfs) \
+ $(pre-post-sqlite3-wasmfs-esm.deps) \
+ $(EXPORTED_FUNCTIONS.speedtest1)
+ @echo "Building $@ ..."
+ $(emcc.bin) \
+ $(pre-post-sqlite3-wasmfs-esm.flags) \
+ $(cflags.common) \
+ $(cflags.sqlite3-wasmfs) \
+ $(emcc.speedtest1.common) \
+ $(emcc.flags.speedtest1-vanilla) \
+ $(emcc.flags.sqlite3-wasmfs) \
+ $(emcc.flags.speedtest1-wasmfs) \
+ -o $@ $(speedtest1.cfiles) -lm
+ @$(call SQLITE3.xJS.ESM-EXPORT-DEFAULT,1)
+ $(maybe-wasm-strip) $(speedtest1-wasmfs.wasm)
+ chmod -x $(speedtest1-wasmfs.wasm)
+ ls -la $@ $(speedtest1-wasmfs.wasm)
+
+wasmfs: $(speedtest1-wasmfs.mjs)
+CLEAN_FILES += $(speedtest1-wasmfs.mjs) $(speedtest1-wasmfs.wasm) \
+ $(subst .js,.worker.js,$(speedtest1-wasmfs.mjs))
+# end speedtest1.js
+########################################################################