xref: /sqlite-3.40.0/ext/wasm/wasmfs.make (revision ef9cd12e)
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
10sqlite3-wasmfs.js     := sqlite3-wasmfs.js
11sqlite3-wasmfs.wasm   := sqlite3-wasmfs.wasm
12sqlite3-wasmfs.wasm.c := $(dir.api)/sqlite3-wasm.c
13
14CLEAN_FILES += $(sqlite3-wasmfs.js) $(sqlite3-wasmfs.wasm) \
15    $(subst .js,.worker.js,$(sqlite3-wasmfs.js))
16
17########################################################################
18# emcc flags for .c/.o/.wasm.
19sqlite3-wasmfs.flags =
20#sqlite3-wasmfs.flags += -v # _very_ loud but also informative about what it's doing
21
22########################################################################
23# emcc flags for .c/.o.
24sqlite3-wasmfs.cflags :=
25sqlite3-wasmfs.cflags += -std=c99 -fPIC
26sqlite3-wasmfs.cflags += -pthread
27sqlite3-wasmfs.cflags += -I. -I.. -I$(dir.top)
28sqlite3-wasmfs.cflags += $(SQLITE_OPT) -DSQLITE_WASM_WASMFS
29
30sqlite3-wasmfs.extra.c :=
31ifeq (1,1)
32  # To get testing1.js to run with $(sqlite3-wasmfs.js) we need...
33  sqlite3-wasmfs.extra.c += $(jaccwabyt_test.c)
34endif
35
36########################################################################
37# emcc flags specific to building the final .js/.wasm file...
38sqlite3-wasmfs.jsflags := -fPIC
39sqlite3-wasmfs.jsflags += --no-entry
40sqlite3-wasmfs.jsflags += --minify 0
41sqlite3-wasmfs.jsflags += -sMODULARIZE
42sqlite3-wasmfs.jsflags += -sSTRICT_JS
43sqlite3-wasmfs.jsflags += -sDYNAMIC_EXECUTION=0
44sqlite3-wasmfs.jsflags += -sNO_POLYFILL
45ifeq (,$(sqlite3-wasmfs.extra.c))
46  sqlite3-wasmfs.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.api)/EXPORTED_FUNCTIONS.sqlite3-api
47else
48  # need more exports for jaccwabyt test code...
49  sqlite3-wasmfs.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.api
50endif
51sqlite3-wasmfs.jsflags += -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory,allocateUTF8OnStack
52                                            # wasmMemory ==> for -sIMPORTED_MEMORY
53                                            # allocateUTF8OnStack ==> wasmfs internals
54sqlite3-wasmfs.jsflags += -sUSE_CLOSURE_COMPILER=0
55sqlite3-wasmfs.jsflags += -sIMPORTED_MEMORY
56#sqlite3-wasmfs.jsflags += -sINITIAL_MEMORY=13107200
57#sqlite3-wasmfs.jsflags += -sTOTAL_STACK=4194304
58sqlite3-wasmfs.jsflags += -sEXPORT_NAME=$(sqlite3.js.init-func)
59sqlite3-wasmfs.jsflags += -sGLOBAL_BASE=4096 # HYPOTHETICALLY keep func table indexes from overlapping w/ heap addr.
60#sqlite3-wasmfs.jsflags += -sFILESYSTEM=0 # only for experimentation. sqlite3 needs the FS API
61#                                Perhaps the wasmfs build doesn't?
62#sqlite3-wasmfs.jsflags += -sABORTING_MALLOC
63sqlite3-wasmfs.jsflags += -sALLOW_TABLE_GROWTH
64sqlite3-wasmfs.jsflags += -Wno-limited-postlink-optimizations
65# ^^^^^ it likes to warn when we have "limited optimizations" via the -g3 flag.
66sqlite3-wasmfs.jsflags += -sERROR_ON_UNDEFINED_SYMBOLS=0
67sqlite3-wasmfs.jsflags += -sLLD_REPORT_UNDEFINED
68#sqlite3-wasmfs.jsflags += --import-undefined
69sqlite3-wasmfs.jsflags += -sMEMORY64=0
70sqlite3-wasmfs.jsflags += -sINITIAL_MEMORY=128450560
71sqlite3-wasmfs.fsflags := -pthread -sWASMFS -sPTHREAD_POOL_SIZE=2 -sENVIRONMENT=web,worker
72# -sPTHREAD_POOL_SIZE values of 2 or higher trigger that bug.
73sqlite3-wasmfs.jsflags += $(sqlite3-wasmfs.fsflags)
74#sqlite3-wasmfs.jsflags += -sALLOW_MEMORY_GROWTH
75#^^^ using ALLOW_MEMORY_GROWTH produces a warning from emcc:
76#   USE_PTHREADS + ALLOW_MEMORY_GROWTH may run non-wasm code slowly,
77#   see https://github.com/WebAssembly/design/issues/1271 [-Wpthreads-mem-growth]
78sqlite3-wasmfs.jsflags += -sWASM_BIGINT=$(emcc_enable_bigint)
79$(eval $(call call-make-pre-js,sqlite3-wasmfs))
80sqlite3-wasmfs.jsflags += $(pre-post-common.flags) $(pre-post-sqlite3-wasmfs.flags)
81$(sqlite3-wasmfs.js): $(sqlite3-wasmfs.wasm.c) $(sqlite3-wasm.c) $(sqlite3-wasmfs.extra.c) \
82    EXPORTED_FUNCTIONS.api $(MAKEFILE) $(MAKEFILE.wasmfs) \
83    $(pre-post-sqlite3-wasmfs.deps)
84	@echo "Building $@ ..."
85	$(emcc.bin) -o $@ $(emcc_opt_full) $(emcc.flags) \
86      $(sqlite3-wasmfs.cflags) $(sqlite3-wasmfs.jsflags) \
87     $(sqlite3-wasmfs.wasm.c) $(sqlite3-wasmfs.extra.c)
88	chmod -x $(sqlite3-wasmfs.wasm)
89	$(maybe-wasm-strip) $(sqlite3-wasmfs.wasm)
90	@ls -la $@ $(sqlite3-wasmfs.wasm)
91
92wasmfs: $(sqlite3-wasmfs.js)
93all: wasmfs
94
95########################################################################
96# speedtest1 for wasmfs. Re. sqlite3-wasm.o vs sqlite3-wasm.c:
97# building against the latter (predictably) results in a slightly
98# faster binary.
99speedtest1-wasmfs.js := speedtest1-wasmfs.js
100speedtest1-wasmfs.wasm := $(subst .js,.wasm,$(speedtest1-wasmfs.js))
101speedtest1-wasmfs.eflags := $(sqlite3-wasmfs.fsflags)
102speedtest1-wasmfs.eflags += $(SQLITE_OPT) -DSQLITE_WASM_WASMFS
103$(eval $(call call-make-pre-js,speedtest1-wasmfs))
104$(speedtest1-wasmfs.js): $(speedtest1.cs) $(sqlite3-wasmfs.js) \
105  $(MAKEFILE) $(MAKEFILE.wasmfs) \
106  $(pre-post-speedtest1-wasmfs.deps) \
107  EXPORTED_FUNCTIONS.speedtest1
108	@echo "Building $@ ..."
109	$(emcc.bin) \
110        $(speedtest1-wasmfs.eflags) $(speedtest1-common.eflags) \
111        $(pre-post-speedtest1-wasmfs.flags) \
112        $(speedtest1.cflags) \
113        $(sqlite3-wasmfs.cflags) \
114        -o $@ $(speedtest1.cs) -lm
115	$(maybe-wasm-strip) $(speedtest1-wasmfs.wasm)
116	ls -la $@ $(speedtest1-wasmfs.wasm)
117
118speedtest1: $(speedtest1-wasmfs.js)
119CLEAN_FILES += $(speedtest1-wasmfs.js) $(speedtest1-wasmfs.wasm) \
120     $(subst .js,.worker.js,$(speedtest1-wasmfs.js))
121# end speedtest1.js
122########################################################################
123