include ../build/Makefile-vars
# See https://sqlite.org/src/doc/trunk/README.md
# https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release
# NOTE: I've got "The server load is currently too high. Please try again later." for extended periods of
# time, so getting sqlite source from sqlite.org is NOT dependable at all. Also, they aren't versioned.
# hence we use github instead (noting https://stackoverflow.com/questions/46060010/download-github-release-with-curl).
#
# See https://github.com/sqlite/sqlite/tags for versions.
#
VERSION = 3.39.4
URL = https://github.com/sqlite/sqlite/archive/refs/tags/version-${VERSION}.tar.gz
TARBALL = ${UPSTREAM}/sqlite-${VERSION}.tar.gz
POSIX_WASM = $(shell cowasm-package-path @cowasm/posix-wasm)
LIBEDIT_WASM = $(shell cowasm-package-path @cowasm/libedit)
ZLIB_WASM = $(shell cowasm-package-path @cowasm/zlib)
TERMCAP_WASM = $(shell cowasm-package-path @cowasm/termcap)
all: deps wasm ${BIN}/sqlite3-wasm
include ../build/Makefile-rules
${BUILD_WASM}/.patched: ${BUILD_WASM}/.build
cp ${SRC}/config.site ${BUILD_WASM}
cd ${BUILD_WASM} && cat ${SRC}/patches/00-syscall.patch | patch -p1
cd ${BUILD_WASM} && cat ${SRC}/patches/01-shell.patch | patch -p1
touch ${BUILD_WASM}/.patched
# Notes on flags below.
# - ?? MAYBE ?? Without -Oz (optimize for size rather than speed), we get 'Function addresses
# with offsets not supported' from LLVM during final link.
# I put the -Oz flag into CFLAGS upon studying what the emscripten port uses.
# - We play some tricks with sqlite3.h below to ensure some things get defined (this is needed for clang15).
# - BCC is the compiler used to build code that then gets compiled to WebAssembly.
# - mmap doesn't really work with WASM, so we disable it below as explained
# at https://www.sqlite.org/compile.html However, this doesn't work yet to get
# using a file to work yet. .read works but not sqlite3-wasm a.sql
${DIST_WASM}/.built: node_modules ${BUILD_WASM}/.patched
cd ../build && make zig
cd ${BUILD_WASM} && \
CC="cowasm-cc" \
BCC="zig cc ${ZIG_NATIVE_CFLAGS_GNU}" \
RANLIB="zig ranlib" \
AR="zig ar" \
CFLAGS="-Oz -fvisibility-main -I${ZLIB_WASM}/include -I${LIBEDIT_WASM}/include -I${POSIX_WASM} -DSQLITE_DEFAULT_MMAP_SIZE=0" \
LDFLAGS="-L${ZLIB_WASM}/lib -lz -L${LIBEDIT_WASM}/lib -ledit -L${TERMCAP_WASM}/lib -ltermcap" \
./configure --host=none --prefix="${DIST_WASM}" \
--cache-file=config.site \
--disable-load-extension \
--disable-threadsafe \
--disable-largefile \
--disable-libtool-lock \
--disable-tcl \
--disable-shared \
&& echo '#include "posix-wasm.h"' >> config.h \
&& make BCC="zig cc ${ZIG_NATIVE_CFLAGS_GNU}" sqlite3.h \
&& echo '#include "posix-wasm.h"' >> sqlite3.h \
&& echo 'int sqlite3_fileio_init(sqlite3 *,char **,const sqlite3_api_routines *);' >> sqlite3.h \
&& make BCC="zig cc ${ZIG_NATIVE_CFLAGS_GNU}" -j8 \
&& make BCC="zig cc ${ZIG_NATIVE_CFLAGS_GNU}" install
touch ${DIST_WASM}/.built
${BIN}/sqlite3-wasm: ${DIST_WASM}/.built ${CWD}/bin/sqlite3-wasm
ln -sf ${CWD}/bin/sqlite3-wasm ${BIN}/sqlite3-wasm
test: ${BIN}/sqlite3-wasm
# really wimpy test, and it doesn't do anything with non-interactive stdin yet.
echo "" | sqlite3-wasm | grep SQLite
# TODO: This is a better test but requires implementing in python-wasm/src/wasm/posix/termios.ts
echo "SELECT 389*5077" | sqlite3-wasm | grep 1974953