xref: /sqlite-3.40.0/ext/wasm/GNUmakefile (revision 0467b01a)
1########################################################################
2# This GNU makefile drives the build of the sqlite3 WASM
3# components. It is not part of the canonical build process.
4########################################################################
5SHELL := $(shell which bash 2>/dev/null)
6MAKEFILE := $(lastword $(MAKEFILE_LIST))
7all:
8release: all
9
10# Emscripten SDK home dir and related binaries...
11EMSDK_HOME ?= $(word 1,$(wildcard $(HOME)/src/emsdk $(HOME)/emsdk))
12emcc.bin ?= $(word 1,$(wildcard $(shell which emcc) $(EMSDK_HOME)/upstream/emscripten/emcc))
13ifeq (,$(emcc.bin))
14  $(error Cannot find emcc.)
15endif
16
17wasm-strip ?= $(shell which wasm-strip 2>/dev/null)
18ifeq (,$(filter clean,$(MAKECMDGOALS)))
19ifeq (,$(wasm-strip))
20  $(info WARNING: *******************************************************************)
21  $(info WARNING: builds using -O2/-O3/-Os/-Oz will minify WASM-exported names,)
22  $(info WARNING: breaking _All The Things_. The workaround for that is to build)
23  $(info WARNING: with -g3 (which explodes the file size) and then strip the debug)
24  $(info WARNING: info after compilation, using wasm-strip, to shrink the wasm file.)
25  $(info WARNING: wasm-strip was not found in the PATH so we cannot strip those.)
26  $(info WARNING: If this build uses any optimization level higher than -O1 then)
27  $(info WARNING: the ***resulting WASM binary WILL NOT BE USABLE***.)
28  $(info WARNING: wasm-strip is part of the wabt package:)
29  $(info WARNING:    https://github.com/WebAssembly/wabt)
30  $(info WARNING: on Ubuntu-like systems it can be installed with:)
31  $(info WARNING:    sudo apt install wabt)
32  $(info WARNING: *******************************************************************)
33endif
34endif # 'make clean' check
35
36ifeq (,$(wasm-strip))
37  maybe-wasm-strip = echo "not wasm-stripping"
38else
39  maybe-wasm-strip = $(wasm-strip)
40endif
41
42dir.top := ../..
43# Reminder: some Emscripten flags require absolute paths
44dir.wasm := $(patsubst %/,%,$(dir $(abspath $(MAKEFILE))))
45dir.api := api
46dir.jacc := jaccwabyt
47dir.common := common
48dir.fiddle := fiddle
49CLEAN_FILES := *~ $(dir.jacc)/*~ $(dir.api)/*~ $(dir.common)/*~
50emcc_enable_bigint ?= 1
51sqlite3.c := $(dir.top)/sqlite3.c
52sqlite3.h := $(dir.top)/sqlite3.h
53SQLITE_OPT = \
54  -DSQLITE_ENABLE_FTS4 \
55  -DSQLITE_ENABLE_RTREE \
56  -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
57  -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION \
58  -DSQLITE_ENABLE_STMTVTAB \
59  -DSQLITE_ENABLE_DBPAGE_VTAB \
60  -DSQLITE_ENABLE_DBSTAT_VTAB \
61  -DSQLITE_ENABLE_BYTECODE_VTAB \
62  -DSQLITE_ENABLE_OFFSET_SQL_FUNC \
63  -DSQLITE_OMIT_LOAD_EXTENSION \
64  -DSQLITE_OMIT_DEPRECATED \
65  -DSQLITE_OMIT_UTF16 \
66  -DSQLITE_OMIT_SHARED_CACHE \
67  -DSQLITE_OMIT_WAL \
68  -DSQLITE_THREADSAFE=0 \
69  -DSQLITE_TEMP_STORE=3 \
70  -DSQLITE_OS_KV_OPTIONAL=1 \
71  '-DSQLITE_DEFAULT_UNIX_VFS="unix-none"' \
72  -DSQLITE_USE_URI=1 \
73  -DSQLITE_WASM_ENABLE_C_TESTS
74# ^^^ most flags are set in sqlite3-wasm.c but we need them
75# made explicit here for building speedtest1.c.
76
77ifneq (,$(filter release,$(MAKECMDGOALS)))
78emcc_opt ?= -Oz -flto
79else
80emcc_opt ?= -O0
81# ^^^^ build times for -O levels higher than 0 are painful at
82# dev-time.
83endif
84# When passing emcc_opt from the CLI, += and re-assignment have no
85# effect, so emcc_opt+=-g3 doesn't work. So...
86emcc_opt_full := $(emcc_opt) -g3
87# ^^^ ALWAYS use -g3. See below for why.
88#
89# ^^^ -flto improves runtime speed at -O0 considerably but doubles
90# build time.
91#
92# ^^^^ -O3, -Oz, -Os minify symbol names and there appears to be no
93# way around that except to use -g3, but -g3 causes the binary file
94# size to absolutely explode (approx. 5x larger). This minification
95# utterly breaks the resulting module, making it unsable except as
96# self-contained/self-referential-only code, as ALL of the exported
97# symbols get minified names.
98#
99# However, we have an option for using -Oz or -Os:
100#
101# Build with (-Os -g3) or (-Oz -g3) then use wasm-strip, from the wabt
102# tools package (https://github.com/WebAssembly/wabt), to strip the
103# debugging symbols. That results in a small build with unmangled
104# symbol names. -Oz gives ever-so-slightly better compression than
105# -Os: not quite 1% in some completely unscientific tests. Runtime
106# speed for the unit tests is all over the place either way so it's
107# difficult to say whether -Os gives any speed benefit over -Oz.
108#
109# (Much later: -O2 consistently gives the best speeds.)
110########################################################################
111
112
113$(sqlite3.c) $(sqlite3.h):
114	$(MAKE) -C $(dir.top) sqlite3.c
115
116clean:
117	-rm -f $(CLEAN_FILES)
118
119ifeq (release,$(filter release,$(MAKECMDGOALS)))
120  ifeq (,$(wasm-strip))
121    $(error Cannot make release-quality binary because wasm-strip is not available. \
122            See notes in the warning above)
123  endif
124else
125  $(info Development build. Use '$(MAKE) release' for a smaller release build.)
126endif
127
128version-info: version-info.c $(sqlite3.c) $(MAKEFILE)
129	$(CC) -O0 -I$(dir.top) -o $@ $(SQLITE_OPT) $< $(sqlite3.c)
130CLEAN_FILES := version-info
131
132EXPORTED_FUNCTIONS.api.in := $(dir.api)/EXPORTED_FUNCTIONS.sqlite3-api
133
134EXPORTED_FUNCTIONS.api: $(EXPORTED_FUNCTIONS.api.in) $(MAKEFILE)
135	cat $(EXPORTED_FUNCTIONS.api.in) > $@
136CLEAN_FILES += EXPORTED_FUNCTIONS.api
137
138sqlite3-license-version.js := sqlite3-license-version.js
139sqlite3-license-version-header.js := $(dir.api)/sqlite3-license-version-header.js
140sqlite3-api-build-version.js := $(dir.api)/sqlite3-api-build-version.js
141sqlite3-api.jses := $(sqlite3-license-version.js)
142sqlite3-api.jses += $(dir.api)/sqlite3-api-prologue.js
143sqlite3-api.jses += $(dir.common)/whwasmutil.js
144sqlite3-api.jses += $(dir.jacc)/jaccwabyt.js
145sqlite3-api.jses += $(dir.api)/sqlite3-api-glue.js
146sqlite3-api.jses += $(sqlite3-api-build-version.js)
147sqlite3-api.jses += $(dir.api)/sqlite3-api-oo1.js
148sqlite3-api.jses += $(dir.api)/sqlite3-api-worker1.js
149sqlite3-api.jses += $(dir.api)/sqlite3-api-opfs.js
150sqlite3-api.jses += $(dir.api)/sqlite3-api-cleanup.js
151
152sqlite3-api.js := sqlite3-api.js
153CLEAN_FILES += $(sqlite3-api.js)
154CLEAN_FILES += $(sqlite3-license-version.js)
155CLEAN_FILES += $(sqlite3-api-build-version.js)
156$(sqlite3-api.js): $(sqlite3-api.jses) $(MAKEFILE)
157	@echo "Making $@..."
158	@for i in $(sqlite3-api.jses); do \
159		echo "/* BEGIN FILE: $$i */"; \
160		cat $$i; \
161		echo "/* END FILE: $$i */"; \
162	done > $@
163
164$(sqlite3-api-build-version.js): version-info
165	@echo "Making $@..."
166	@{ \
167  echo 'self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){'; \
168	echo -n '  sqlite3.version = '; \
169  ./version-info --json; \
170  echo ';'; \
171	echo '});'; \
172  } > $@
173
174########################################################################
175# --post-js and --pre-js are emcc flags we use to append/prepend JS to
176# the generated emscripten module file.
177pre-js.js := $(dir.api)/pre-js.js
178post-js.js := post-js.js
179CLEAN_FILES += $(post-js.js)
180post-jses := \
181  $(dir.api)/post-js-header.js \
182  $(sqlite3-api.js) \
183  $(dir.api)/post-js-footer.js
184$(post-js.js): $(post-jses) $(MAKEFILE)
185	@echo "Making $@..."
186	@for i in $(post-jses); do \
187		echo "/* BEGIN FILE: $$i */"; \
188		cat $$i; \
189		echo "/* END FILE: $$i */"; \
190	done > $@
191extern-post-js.js := $(dir.api)/extern-post-js.js
192extern-pre-js.js := $(dir.api)/extern-pre-js.js
193pre-post-common.flags := \
194  --post-js=$(post-js.js) \
195  --extern-post-js=$(extern-post-js.js) \
196  --extern-pre-js=$(dir.wasm)/$(sqlite3-license-version.js)
197pre-post-jses.deps := $(post-js.js) \
198  $(extern-post-js.js) $(extern-pre-js.js) $(sqlite3-license-version.js)
199$(sqlite3-license-version.js): $(sqlite3.h) $(sqlite3-license-version-header.js) $(MAKEFILE)
200	@echo "Making $@..."; { \
201    cat $(sqlite3-license-version-header.js); \
202    echo '/*'; \
203    echo '** This code was built from sqlite3 version...'; \
204    echo "** "; \
205    awk -e '/define SQLITE_VERSION/{$$1=""; print "**" $$0}' \
206        -e '/define SQLITE_SOURCE_ID/{$$1=""; print "**" $$0}' $(sqlite3.h); \
207    echo '*/'; \
208   } > $@
209
210########################################################################
211# call-make-pre-js creates rules for pre-js-$(1).js. $1 = the base
212# name of the JS file on whose behalf this pre-js is for.
213define call-make-pre-js
214pre-post-$(1).flags ?=
215pre-js-$(1).js: $$(pre-js.js) $$(MAKEFILE)
216	cp $$(pre-js.js) $$@
217	echo "Module[xInstantiateWasm].uri = '$(1).wasm';" >> $$@
218CLEAN_FILES += pre-js-$(1).js
219pre-post-$(1).deps := $$(pre-post-jses.deps) pre-js-$(1).js
220pre-post-$(1).flags += --pre-js=pre-js-$(1).js
221endef
222#$(error $(call call-make-pre-js,sqlite3-wasmfs))
223# /post-js and pre-js
224########################################################################
225
226########################################################################
227# emcc flags for .c/.o/.wasm/.js.
228emcc.flags =
229#emcc.flags += -v # _very_ loud but also informative about what it's doing
230# -g is needed to keep -O2 and higher from creating broken JS via
231# minification.
232
233########################################################################
234# emcc flags for .c/.o.
235emcc.cflags :=
236emcc.cflags += -std=c99 -fPIC
237# -------------^^^^^^^^ we currently need c99 for WASM-specific sqlite3 APIs.
238emcc.cflags += -I. -I$(dir.top)
239
240########################################################################
241# emcc flags specific to building the final .js/.wasm file...
242emcc.jsflags := -fPIC
243emcc.jsflags += --minify 0
244emcc.jsflags += --no-entry
245emcc.jsflags += -sMODULARIZE
246emcc.jsflags += -sSTRICT_JS
247emcc.jsflags += -sDYNAMIC_EXECUTION=0
248emcc.jsflags += -sNO_POLYFILL
249emcc.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.api
250emcc.exportedRuntimeMethods := \
251    -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory,allocateUTF8OnStack
252    # FS ==> stdio/POSIX I/O proxies
253    # wasmMemory ==> required by our code for use with -sIMPORTED_MEMORY
254    # allocateUTF8OnStack => for kvvfs internals
255emcc.jsflags += $(emcc.exportedRuntimeMethods)
256emcc.jsflags += -sUSE_CLOSURE_COMPILER=0
257emcc.jsflags += -sIMPORTED_MEMORY
258emcc.environment := -sENVIRONMENT=web,worker
259emcc.jsflags += -sALLOW_MEMORY_GROWTH
260# emcc: warning: USE_PTHREADS + ALLOW_MEMORY_GROWTH may run non-wasm code
261#       slowly, see https://github.com/WebAssembly/design/issues/1271
262#       [-Wpthreads-mem-growth]
263emcc.jsflags += -sINITIAL_MEMORY=13107200
264#emcc.jsflags += -sINITIAL_MEMORY=64225280
265# ^^^^ 64MB is not enough for WASMFS/OPFS test runs using batch-runner.js
266emcc.jsflags += $(emcc.environment)
267#emcc.jsflags += -sTOTAL_STACK=4194304
268
269sqlite3.js.init-func := sqlite3InitModule
270# ^^^^ $(sqlite3.js.init-func) symbol name is hard-coded in $(extern-post-js.js)
271
272emcc.jsflags += -sEXPORT_NAME=$(sqlite3.js.init-func)
273emcc.jsflags += -sGLOBAL_BASE=4096 # HYPOTHETICALLY keep func table indexes from overlapping w/ heap addr.
274#emcc.jsflags += -sSTRICT # fails due to missing __syscall_...()
275#emcc.jsflags += -sALLOW_UNIMPLEMENTED_SYSCALLS
276#emcc.jsflags += -sFILESYSTEM=0 # only for experimentation. sqlite3 needs the FS API
277#emcc.jsflags += -sABORTING_MALLOC
278emcc.jsflags += -sALLOW_TABLE_GROWTH
279emcc.jsflags += -Wno-limited-postlink-optimizations
280# ^^^^^ it likes to warn when we have "limited optimizations" via the -g3 flag.
281#emcc.jsflags += -sSTANDALONE_WASM # causes OOM errors, not sure why
282# https://lld.llvm.org/WebAssembly.html
283emcc.jsflags += -sERROR_ON_UNDEFINED_SYMBOLS=0
284emcc.jsflags += -sLLD_REPORT_UNDEFINED
285#emcc.jsflags += --allow-undefined
286emcc.jsflags += --import-undefined
287#emcc.jsflags += --unresolved-symbols=import-dynamic --experimental-pic
288#emcc.jsflags += --experimental-pic --unresolved-symbols=ingore-all --import-undefined
289#emcc.jsflags += --unresolved-symbols=ignore-all
290emcc.jsflags += -sWASM_BIGINT=$(emcc_enable_bigint)
291# ^^^^ MEMORY64=1 fails to load, erroring with:
292#  invalid memory limits flags 0x5
293#    (enable via --experimental-wasm-memory64)
294#
295# ^^^^ MEMORY64=2 builds and loads but dies when we do things like:
296#
297#  new Uint8Array(heapWrappers().HEAP8U.buffer, ptr, n)
298#
299# because ptr is now a BigInt, so is invalid for passing to arguments
300# which have strict must-be-a-Number requirements.
301########################################################################
302
303
304########################################################################
305# -sSINGLE_FILE:
306# https://github.com/emscripten-core/emscripten/blob/main/src/settings.js#L1704
307# -sSINGLE_FILE=1 would be really nice but we have to build with -g
308# for -O2 and higher to work (else minification breaks the code) and
309# cannot wasm-strip the binary before it gets encoded into the JS
310# file. The result is that the generated JS file is, because of the -g
311# debugging info, _huge_.
312########################################################################
313
314########################################################################
315# Maintenance reminder: the output .js and .wasm files of emcc must be
316# in _this_ dir, rather than a subdir, or else parts of the generated
317# code get confused and cannot load property (namely, the
318# sqlite3.worker.js generated in conjunction with -sWASMFS).
319sqlite3.js := sqlite3.js
320sqlite3.wasm := sqlite3.wasm
321sqlite3-wasm.o := $(dir.api)/sqlite3-wasm.o
322$(sqlite3-wasm.o): emcc.cflags += $(SQLITE_OPT)
323$(sqlite3-wasm.o): $(dir.top)/sqlite3.c
324sqlite3-wasm.c := $(dir.api)/sqlite3-wasm.c
325########################################################################
326# call-wasm-c-compile sets up build rules
327# for $1.o. $1 must be the name of a C file (with extension).
328define call-wasm-c-compile
329$(1).o := $$(subst .c,.o,$(1))
330sqlite3.wasm.obj += $$($(1).o)
331$$($(1).o): $$(MAKEFILE) $(1)
332	$$(emcc.bin) $$(emcc_opt_full) $$(emcc.flags) $$(emcc.cflags) -c $(1) -o $$@
333CLEAN_FILES += $$($(1).o)
334endef
335$(foreach c,$(sqlite3-wasm.c),$(eval $(call call-wasm-c-compile,$(c))))
336$(eval $(call call-make-pre-js,sqlite3))
337$(sqlite3.js): $(MAKEFILE) $(sqlite3.wasm.obj) \
338    EXPORTED_FUNCTIONS.api \
339    $(pre-post-sqlite3.deps)
340	@echo "Building $@ ..."
341	$(emcc.bin) -o $@ $(emcc_opt_full) $(emcc.flags) \
342    $(emcc.jsflags) $(pre-post-common.flags) $(pre-post-sqlite3.flags) \
343    $(sqlite3.wasm.obj)
344	chmod -x $(sqlite3.wasm)
345	$(maybe-wasm-strip) $(sqlite3.wasm)
346	@ls -la $@ $(sqlite3.wasm)
347
348CLEAN_FILES += $(sqlite3.js) $(sqlite3.wasm)
349all: $(sqlite3.js)
350wasm: $(sqlite3.js)
351# End main Emscripten-based module build
352########################################################################
353
354########################################################################
355# batch-runner.js...
356dir.sql := sql
357speedtest1 := ../../speedtest1
358speedtest1.c := ../../test/speedtest1.c
359speedtest1.sql := $(dir.sql)/speedtest1.sql
360speedtest1.cliflags := --size 25 --big-transactions
361$(speedtest1):
362	$(MAKE) -C ../.. speedtest1
363$(speedtest1.sql): $(speedtest1) $(MAKEFILE)
364	$(speedtest1) $(speedtest1.cliflags) --script $@
365batch-runner.list: $(MAKEFILE) $(speedtest1.sql) $(dir.sql)/000-mandelbrot.sql
366	bash split-speedtest1-script.sh $(dir.sql)/speedtest1.sql
367	ls -1 $(dir.sql)/*.sql | grep -v speedtest1.sql | sort > $@
368clean-batch:
369	rm -f batch-runner.list $(dir.sql)/speedtest1*.sql
370# ^^^ we don't do this along with 'clean' because we clean/rebuild on
371# a regular basis with different -Ox flags and rebuilding the batch
372# pieces each time is an unnecessary time sink.
373batch: batch-runner.list
374all: batch
375# end batch-runner.js
376########################################################################
377# speedtest1.js...
378# speedtest1-common.eflags = emcc flags used by multiple builds of speedtest1
379# speedtest1.eflags = emcc flags used by main build of speedtest1
380speedtest1-common.eflags := $(emcc_opt_full)
381speedtest1.eflags :=
382speedtest1.eflags += -sENVIRONMENT=web
383speedtest1-common.eflags += -sINVOKE_RUN=0
384speedtest1-common.eflags += --no-entry
385#speedtest1-common.eflags += -flto
386speedtest1-common.eflags += -sABORTING_MALLOC
387speedtest1-common.eflags += -sINITIAL_MEMORY=128450560
388speedtest1-common.eflags += -sSTRICT_JS
389speedtest1-common.eflags += -sMODULARIZE
390speedtest1-common.eflags += -Wno-limited-postlink-optimizations
391speedtest1-common.eflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.speedtest1
392speedtest1-common.eflags += $(emcc.exportedRuntimeMethods)
393speedtest1-common.eflags += -sALLOW_TABLE_GROWTH
394speedtest1-common.eflags += -sDYNAMIC_EXECUTION=0
395speedtest1-common.eflags += --minify 0
396speedtest1-common.eflags += -sEXPORT_NAME=$(sqlite3.js.init-func)
397speedtest1-common.eflags += -sWASM_BIGINT=$(emcc_enable_bigint)
398speedtest1-common.eflags += $(pre-post-common.flags)
399speedtest1.exit-runtime0 := -sEXIT_RUNTIME=0
400speedtest1.exit-runtime1 := -sEXIT_RUNTIME=1
401# Re -sEXIT_RUNTIME=1 vs 0: if it's 1 and speedtest1 crashes, we get
402# this error from emscripten:
403#
404# > native function `free` called after runtime exit (use
405# NO_EXIT_RUNTIME to keep it alive after main() exits))
406#
407# If it's 0 and it crashes, we get:
408#
409# > stdio streams had content in them that was not flushed. you should
410# set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline
411# when you printf etc.
412#
413# and pending output is not flushed because it didn't end with a
414# newline (by design). The lesser of the two evils seems to be
415# -sEXIT_RUNTIME=1 but we need EXIT_RUNTIME=0 for the worker-based app
416# which runs speedtest1 multiple times.
417
418EXPORTED_FUNCTIONS.speedtest1: EXPORTED_FUNCTIONS.api
419	{ echo _wasm_main; cat EXPORTED_FUNCTIONS.api; } > $@
420CLEAN_FILES += EXPORTED_FUNCTIONS.speedtest1
421speedtest1.js := speedtest1.js
422speedtest1.wasm := $(subst .js,.wasm,$(speedtest1.js))
423speedtest1.cflags := \
424  -I. -I.. -I$(dir.top) \
425  -DSQLITE_SPEEDTEST1_WASM
426speedtest1.cs := $(speedtest1.c) $(sqlite3-wasm.c)
427$(speedtest1.js): emcc.cflags+=
428# speedtest1 notes re. sqlite3-wasm.o vs sqlite3-wasm.c: building against
429# the latter (predictably) results in a slightly faster binary, but we're
430# close enough to the target speed requirements that the 500ms makes a
431# difference.
432$(eval $(call call-make-pre-js,speedtest1))
433$(speedtest1.js): $(MAKEFILE) $(speedtest1.cs) \
434    $(pre-post-speedtest1.deps) \
435    EXPORTED_FUNCTIONS.speedtest1
436	@echo "Building $@ ..."
437	$(emcc.bin) \
438        $(speedtest1.eflags) $(speedtest1-common.eflags) $(speedtest1.cflags) \
439        $(pre-post-speedtest1.flags) \
440        $(SQLITE_OPT) \
441        $(speedtest1.exit-runtime0) \
442        -o $@ $(speedtest1.cs) -lm
443	$(maybe-wasm-strip) $(speedtest1.wasm)
444	ls -la $@ $(speedtest1.wasm)
445
446speedtest1: $(speedtest1.js)
447all: speedtest1
448CLEAN_FILES += $(speedtest1.js) $(speedtest1.wasm)
449# end speedtest1.js
450########################################################################
451
452########################################################################
453# fiddle_remote is the remote destination for the fiddle app. It
454# must be a [user@]HOST:/path for rsync.
455# Note that the target "should probably" contain a symlink of
456# index.html -> fiddle.html.
457fiddle_remote ?=
458ifeq (,$(fiddle_remote))
459ifneq (,$(wildcard /home/stephan))
460  fiddle_remote = wh:www/wh/sqlite3/.
461else ifneq (,$(wildcard /home/drh))
462  #fiddle_remote = if appropriate, add that user@host:/path here
463endif
464endif
465$(fiddle_files): default
466push-fiddle: $(fiddle_files)
467	@if [ x = "x$(fiddle_remote)" ]; then \
468		echo "fiddle_remote must be a [user@]HOST:/path for rsync"; \
469		exit 1; \
470	fi
471	rsync -va fiddle/ $(fiddle_remote)
472# end fiddle remote push
473########################################################################
474
475########################################################################
476# Convenience rules to rebuild with various -Ox levels. Much
477# experimentation shows -O2 to be the clear winner in terms of speed.
478# Note that build times with anything higher than -O0 are somewhat
479# painful.
480
481.PHONY: o0 o1 o2 o3 os oz
482o-xtra := -g3
483# ^^^ -g3 is important to keep higher -O levels from mangling (via
484# minification), or outright removing, otherwise working code.
485
486o-xtra += -flto
487# ^^^^ -flto can have a considerably performance boost at -O0 but
488# doubles the build time and seems to have negligible effect on
489# higher optimization levels.
490o0: clean
491	$(MAKE) -e "emcc_opt=-O0 $(o-xtra)"
492o1: clean
493	$(MAKE) -e "emcc_opt=-O1 $(o-xtra)"
494o2: clean
495	$(MAKE) -e "emcc_opt=-O2 $(o-xtra)"
496o3: clean
497	$(MAKE) -e "emcc_opt=-O3 $(o-xtra)"
498os: clean
499	@echo "WARNING: -Os can result in a build with mysteriously missing pieces!"
500	$(MAKE) -e "emcc_opt=-Os $(o-xtra)"
501oz: clean
502	$(MAKE) -e "emcc_opt=-Oz $(o-xtra)"
503
504########################################################################
505# Sub-makes...
506
507include fiddle.make
508
509########################################################################
510# Some platforms do not support the WASMFS build. Raspberry Pi OS is one
511# of them. As such platforms are discovered, add their (uname -m) name
512# to PLATFORMS_WITH_NO_WASMFS to exclude the wasmfs build parts.
513PLATFORMS_WITH_NO_WASMFS := aarch64 # add any others here
514THIS_ARCH := $(shell /usr/bin/uname -m)
515ifneq (,$(filter $(THIS_ARCH),$(PLATFORMS_WITH_NO_WASMFS)))
516$(info This platform does not support the WASMFS build.)
517else
518include wasmfs.make
519endif
520
521########################################################################
522# Create deliverables: TODO
523#ifneq (,$(filter dist,$(MAKECMDGOALS)))
524#include dist.make
525#endif
526
527########################################################################
528# Push files to public wasm-testing.sqlite.org server
529wasm-testing.include = *.wasm *.js *.html \
530    batch-runner.list sql common fiddle jaccwabyt
531wasm-testing.exclude = sql/speedtest1.sql
532wasm-testing.dir     = /jail/sites/wasm-testing
533wasm-testing.dest   ?= wasm-testing:$(wasm-testing.dir)
534# ---------------------^^^^^^^^^^^^ ssh alias
535push:
536	rsync -z -e ssh --ignore-times --chown=stephan:www-data --group -r \
537    $(patsubst %,--exclude=%,$(wasm-testing.exclude)) \
538    $(wasm-testing.include) $(wasm-testing.dest)
539	ssh wasm-testing 'cd $(wasm-testing.dir) && bash .gzip' || \
540    echo "SSH failed: it's likely that stale content will be served via old gzip files."
541
542