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