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