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