xref: /sqlite-3.40.0/ext/wasm/wasmfs.make (revision de6186e0)
1#!/usr/bin/make
2#^^^^ help emacs select makefile mode
3#
4# This is a sub-make for building a standalone wasmfs-based
5# sqlite3.wasm.  It is intended to be "include"d from the main
6# GNUMakefile.
7########################################################################
8MAKEFILE.wasmfs := $(lastword $(MAKEFILE_LIST))
9
10# Maintenance reminder: these particular files cannot be built into a
11# subdirectory because loading of the auxiliary
12# sqlite3-wasmfs.worker.js file it creates fails if sqlite3-wasmfs.js
13# is loaded from any directory other than the one in which the
14# containing HTML lives. Similarly, they cannot be loaded from a
15# Worker to an Emscripten quirk regarding loading nested Workers.
16dir.wasmfs := $(dir.wasm)
17sqlite3-wasmfs.js     := $(dir.wasmfs)/sqlite3-wasmfs.js
18sqlite3-wasmfs.wasm   := $(dir.wasmfs)/sqlite3-wasmfs.wasm
19
20CLEAN_FILES += $(sqlite3-wasmfs.js) $(sqlite3-wasmfs.wasm) \
21    $(subst .js,.worker.js,$(sqlite3-wasmfs.js))
22
23########################################################################
24# emcc flags for .c/.o.
25sqlite3-wasmfs.cflags :=
26sqlite3-wasmfs.cflags += -std=c99 -fPIC
27sqlite3-wasmfs.cflags += -pthread
28sqlite3-wasmfs.cflags += $(cflags.common)
29sqlite3-wasmfs.cflags += $(SQLITE_OPT) -DSQLITE_ENABLE_WASMFS
30
31########################################################################
32# emcc flags specific to building the final .js/.wasm file...
33sqlite3-wasmfs.jsflags := -fPIC
34sqlite3-wasmfs.jsflags += --no-entry
35sqlite3-wasmfs.jsflags += --minify 0
36sqlite3-wasmfs.jsflags += -sMODULARIZE
37sqlite3-wasmfs.jsflags += -sSTRICT_JS
38sqlite3-wasmfs.jsflags += -sDYNAMIC_EXECUTION=0
39sqlite3-wasmfs.jsflags += -sNO_POLYFILL
40sqlite3-wasmfs.jsflags += -sEXPORTED_FUNCTIONS=@$(abspath $(dir.api)/EXPORTED_FUNCTIONS.sqlite3-api)
41sqlite3-wasmfs.jsflags += -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory,allocateUTF8OnStack
42                                            # wasmMemory ==> for -sIMPORTED_MEMORY
43                                            # allocateUTF8OnStack ==> wasmfs internals
44sqlite3-wasmfs.jsflags += -sUSE_CLOSURE_COMPILER=0
45sqlite3-wasmfs.jsflags += -sIMPORTED_MEMORY
46#sqlite3-wasmfs.jsflags += -sINITIAL_MEMORY=13107200
47#sqlite3-wasmfs.jsflags += -sTOTAL_STACK=4194304
48sqlite3-wasmfs.jsflags += -sEXPORT_NAME=$(sqlite3.js.init-func)
49sqlite3-wasmfs.jsflags += -sGLOBAL_BASE=4096 # HYPOTHETICALLY keep func table indexes from overlapping w/ heap addr.
50#sqlite3-wasmfs.jsflags += -sFILESYSTEM=0 # only for experimentation. sqlite3 needs the FS API
51#                                Perhaps the wasmfs build doesn't?
52#sqlite3-wasmfs.jsflags += -sABORTING_MALLOC
53sqlite3-wasmfs.jsflags += -sALLOW_TABLE_GROWTH
54sqlite3-wasmfs.jsflags += -Wno-limited-postlink-optimizations
55# ^^^^^ it likes to warn when we have "limited optimizations" via the -g3 flag.
56sqlite3-wasmfs.jsflags += -sERROR_ON_UNDEFINED_SYMBOLS=0
57sqlite3-wasmfs.jsflags += -sLLD_REPORT_UNDEFINED
58#sqlite3-wasmfs.jsflags += --import-undefined
59sqlite3-wasmfs.jsflags += -sMEMORY64=0
60sqlite3-wasmfs.jsflags += -sINITIAL_MEMORY=128450560
61# ^^^^ 64MB is not enough for WASMFS/OPFS test runs using batch-runner.js
62sqlite3-wasmfs.fsflags := -pthread -sWASMFS -sPTHREAD_POOL_SIZE=2 -sENVIRONMENT=web,worker
63# -sPTHREAD_POOL_SIZE values of 2 or higher trigger that bug.
64sqlite3-wasmfs.jsflags += $(sqlite3-wasmfs.fsflags)
65#sqlite3-wasmfs.jsflags += -sALLOW_MEMORY_GROWTH
66#^^^ using ALLOW_MEMORY_GROWTH produces a warning from emcc:
67#   USE_PTHREADS + ALLOW_MEMORY_GROWTH may run non-wasm code slowly,
68#   see https://github.com/WebAssembly/design/issues/1271 [-Wpthreads-mem-growth]
69sqlite3-wasmfs.jsflags += -sWASM_BIGINT=$(emcc.WASM_BIGINT)
70$(eval $(call call-make-pre-js,sqlite3-wasmfs))
71sqlite3-wasmfs.jsflags += $(pre-post-common.flags) $(pre-post-sqlite3-wasmfs.flags)
72$(sqlite3-wasmfs.js): $(sqlite3-wasm.c) \
73    $(EXPORTED_FUNCTIONS.api) $(MAKEFILE) $(MAKEFILE.wasmfs) \
74    $(pre-post-sqlite3-wasmfs.deps)
75	@echo "Building $@ ..."
76	$(emcc.bin) -o $@ $(emcc_opt_full) $(emcc.flags) \
77      $(sqlite3-wasmfs.cflags) $(sqlite3-wasmfs.jsflags) \
78     $(sqlite3-wasm.c)
79	chmod -x $(sqlite3-wasmfs.wasm)
80	$(maybe-wasm-strip) $(sqlite3-wasmfs.wasm)
81	@ls -la $@ $(sqlite3-wasmfs.wasm)
82$(sqlite3-wasmfs.wasm): $(sqlite3-wasmfs.js)
83wasmfs: $(sqlite3-wasmfs.js)
84all: wasmfs
85
86########################################################################
87# speedtest1 for wasmfs.
88speedtest1-wasmfs.js := $(dir.wasmfs)/speedtest1-wasmfs.js
89speedtest1-wasmfs.wasm := $(subst .js,.wasm,$(speedtest1-wasmfs.js))
90speedtest1-wasmfs.eflags := $(sqlite3-wasmfs.fsflags)
91speedtest1-wasmfs.eflags += $(SQLITE_OPT) -DSQLITE_ENABLE_WASMFS
92speedtest1-wasmfs.eflags += -sALLOW_MEMORY_GROWTH=0
93speedtest1-wasmfs.eflags += -sINITIAL_MEMORY=$(emcc.INITIAL_MEMORY.128)
94$(eval $(call call-make-pre-js,speedtest1-wasmfs))
95$(speedtest1-wasmfs.js): $(speedtest1.cses) $(sqlite3-wasmfs.js) \
96  $(MAKEFILE) $(MAKEFILE.wasmfs) \
97  $(pre-post-speedtest1-wasmfs.deps) \
98  $(EXPORTED_FUNCTIONS.speedtest1)
99	@echo "Building $@ ..."
100	$(emcc.bin) \
101        $(speedtest1-wasmfs.eflags) $(speedtest1-common.eflags) \
102        $(pre-post-speedtest1-wasmfs.flags) \
103        $(speedtest1.cflags) \
104        $(sqlite3-wasmfs.cflags) \
105        -o $@ $(speedtest1.cses) -lm
106	$(maybe-wasm-strip) $(speedtest1-wasmfs.wasm)
107	ls -la $@ $(speedtest1-wasmfs.wasm)
108
109speedtest1: $(speedtest1-wasmfs.js)
110CLEAN_FILES += $(speedtest1-wasmfs.js) $(speedtest1-wasmfs.wasm) \
111     $(subst .js,.worker.js,$(speedtest1-wasmfs.js))
112# end speedtest1.js
113########################################################################
114