2023-03-31 10:01:22 -04:00
i f n d e f C I _ G C C
CC := gcc
e l s e
CC := $( CI_GCC)
e n d i f
2023-12-12 09:46:49 -05:00
SHARED_CFLAGS = -DLIBSQL= 1
2023-12-12 09:46:49 -05:00
LOADABLE_CFLAGS = -std= c99 -fPIC -shared -Wall $( SHARED_CFLAGS)
STATIC_CFLAGS = -std= c99 -fPIC -c -Wall $( SHARED_CFLAGS)
2023-12-12 09:46:49 -05:00
libsql_feature = ,libsql
2023-03-31 10:01:22 -04:00
i f e q ( $( shell uname -s ) , D a r w i n )
CONFIG_DARWIN = y
e l s e i f e q ( $( OS ) , W i n d o w s _ N T )
CONFIG_WINDOWS = y
e l s e
CONFIG_LINUX = y
e n d i f
i f d e f C O N F I G _ D A R W I N
LOADABLE_EXTENSION = dylib
2023-10-18 13:46:23 +02:00
# apparently `darwin-x86_64` also works on arm macs and is the proper host arch for ndk builds.
NDK_HOSTARCH = darwin-x86_64
2023-03-31 10:01:22 -04:00
e n d i f
i f d e f C O N F I G _ L I N U X
LOADABLE_EXTENSION = so
2023-10-18 13:46:23 +02:00
NDK_HOSTARCH = linux-x86_64
2023-03-31 10:01:22 -04:00
e n d i f
i f d e f C O N F I G _ W I N D O W S
LOADABLE_EXTENSION = dll
e n d i f
2023-12-12 09:46:49 -05:00
i f e q ( $( CI_MAYBE_TARGET ) , i 6 8 6 - p c - w i n d o w s - g n u )
C_TARGET =
LOADABLE_EXTENSION = dll
rs_build_flags = -Zbuild-std
e n d i f
i f e q ( $( CI_MAYBE_TARGET ) , x 8 6 _ 6 4 - p c - w i n d o w s - g n u )
C_TARGET =
LOADABLE_EXTENSION = dll
rs_build_flags = -Zbuild-std
e n d i f
2023-10-18 13:46:23 +02:00
i f d e f I O S _ T A R G E T
CI_MAYBE_TARGET = $( IOS_TARGET)
rs_build_flags = -Zbuild-std
ifeq ( $( or $( findstring sim,$( CI_MAYBE_TARGET) ) ,$( findstring x86_64,$( CI_MAYBE_TARGET) ) ) ,)
# todo: run the xcode command to find this
sysroot_option = -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
else
sysroot_option = -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
endif
e n d i f
# aarch64-linux-android
# https://github.com/marketplace/actions/setup-android-ndk
i f d e f A N D R O I D _ T A R G E T
CI_MAYBE_TARGET = $( ANDROID_TARGET)
NDK = $( ANDROID_NDK_HOME)
LOADABLE_EXTENSION = so
CC = $( NDK) /toolchains/llvm/prebuilt/$( NDK_HOSTARCH) /bin/clang
rs_ndk = ndk -t $( ANDROID_TARGET)
ANDROID_API_VERSION = 33
rs_build_flags = -Zbuild-std
sysroot_option = --sysroot= $( NDK) /toolchains/llvm/prebuilt/$( NDK_HOSTARCH) /sysroot
e n d i f
2023-03-31 10:01:22 -04:00
prefix = ./dist
dbg_prefix = ./dbg
2023-12-12 09:46:49 -05:00
bundle = bundle_static
valgrind : bundle = integration_check
test : bundle = integration_check
2023-03-31 10:01:22 -04:00
TARGET_LOADABLE = $( prefix) /crsqlite.$( LOADABLE_EXTENSION)
TARGET_DBG_LOADABLE = $( dbg_prefix) /crsqlite.$( LOADABLE_EXTENSION)
TARGET_SQLITE3_EXTRA_C = $( prefix) /sqlite3-extra.c
TARGET_SQLITE3 = $( prefix) /sqlite3
TARGET_SQLITE3_VANILLA = $( prefix) /vanilla-sqlite3
2023-10-18 13:46:23 +02:00
TARGET_STATIC = $( prefix) /crsqlite.a
2023-03-31 10:01:22 -04:00
TARGET_TEST = $( prefix) /test
TARGET_FUZZ = $( prefix) /fuzz
TARGET_TEST_ASAN = $( prefix) /test-asan
# js/browser/wa-sqlite/Makefile, deps/sqlite/GNUMakefile, core/binding.gyp, core/Makefile
ext_files = src/crsqlite.c \
src/changes-vtab.c \
2023-12-12 09:46:49 -05:00
src/ext-data.c
2023-03-31 10:01:22 -04:00
ext_headers = src/crsqlite.h \
src/util.h \
src/changes-vtab.h \
2023-04-20 12:06:16 -04:00
src/ext-data.h
2023-03-31 10:01:22 -04:00
$(prefix) :
mkdir -p $( prefix)
$(dbg_prefix) :
mkdir -p $( dbg_prefix)
clean :
rm -rf $( prefix)
rm -rf $( dbg_prefix)
2023-04-20 12:06:16 -04:00
cd rs/bundle && cargo clean
2023-12-12 09:46:49 -05:00
cd rs/integration_check && cargo clean
2023-03-31 10:01:22 -04:00
FORMAT_FILES = $( ext_files) $( ext_headers) ./src/core_init.c
format : $( FORMAT_FILES )
clang-format -i $( FORMAT_FILES)
loadable : $( TARGET_LOADABLE )
loadable_dbg : $( TARGET_DBG_LOADABLE )
sqlite3 : $( TARGET_SQLITE 3)
vanilla : $( TARGET_SQLITE 3_VANILLA )
2023-10-18 13:46:23 +02:00
static : $( TARGET_STATIC )
2023-03-31 10:01:22 -04:00
test : $( TARGET_TEST )
$( prefix) /test
# ASAN_OPTIONS=detect_leaks=1
asan : CC =clang
asan : $( TARGET_TEST_ASAN )
$( TARGET_TEST_ASAN)
correctness : $( TARGET_LOADABLE ) FORCE
cd ../py/correctness && pytest
valgrind : $( TARGET_TEST )
valgrind $( prefix) /test
analyzer :
scan-build $( MAKE) clean loadable
ubsan : CC =clang
ubsan : LDLIBS += -lubsan
ubsan : clean $( TARGET_TEST )
$( prefix) /test
fuzz : $( TARGET_FUZZ )
$( prefix) /fuzz
2023-12-12 09:46:49 -05:00
sqlite_src = src/sqlite/
2023-10-18 13:46:23 +02:00
shell.c = $( sqlite_src) shell.c
sqlite3.c = $( sqlite_src) sqlite3.c
2023-12-12 09:46:49 -05:00
rs_lib_static = ./rs/$( bundle) /target/release/libcrsql_$( bundle) .a
rs_lib_static_cpy = ./dist/libcrsql_$( bundle) -static.a
2023-03-31 10:17:06 -04:00
2023-12-12 09:46:49 -05:00
rs_lib_dbg_static = ./rs/$( bundle) /target/debug/libcrsql_$( bundle) .a
rs_lib_dbg_static_cpy = ./dbg/libcrsql_$( bundle) -dbg-static.a
2023-03-31 10:01:22 -04:00
2023-12-12 09:46:49 -05:00
rs_lib_loadable = ./rs/$( bundle) /target/release/libcrsql_$( bundle) .a
rs_lib_loadable_cpy = ./dist/libcrsql_$( bundle) -loadable.a
2023-03-31 10:01:22 -04:00
2023-12-12 09:46:49 -05:00
rs_lib_dbg_loadable = ./rs/$( bundle) /target/debug/libcrsql_$( bundle) .a
rs_lib_dbg_loadable_cpy = ./dbg/libcrsql_$( bundle) -dbg-loadable.a
2023-03-31 10:01:22 -04:00
i f d e f C I _ M A Y B E _ T A R G E T
2023-12-12 09:46:49 -05:00
rs_lib_dbg_static = ./rs/$( bundle) /target/$( CI_MAYBE_TARGET) /debug/libcrsql_$( bundle) .a
rs_lib_loadable = ./rs/$( bundle) /target/$( CI_MAYBE_TARGET) /release/libcrsql_$( bundle) .a
rs_lib_dbg_loadable = ./rs/$( bundle) /target/$( CI_MAYBE_TARGET) /debug/libcrsql_$( bundle) .a
rs_lib_static = ./rs/$( bundle) /target/$( CI_MAYBE_TARGET) /release/libcrsql_$( bundle) .a
2023-03-31 10:01:22 -04:00
RS_TARGET = --target= $( CI_MAYBE_TARGET)
ifndef CI_GCC
2023-10-18 13:46:23 +02:00
# clang has a different target triple than Rust for ios simuators
ifeq ( $( findstring sim,$( CI_MAYBE_TARGET) ) ,)
C_TARGET = --target= $( CI_MAYBE_TARGET) $( ANDROID_API_VERSION)
else
C_TARGET = --target= $( CI_MAYBE_TARGET) ulator
endif
2023-03-31 10:01:22 -04:00
endif
e n d i f
2023-03-31 10:17:06 -04:00
$(shell.c) :
cd $( sqlite_src) && make shell.c
$(sqlite3.c) :
2023-12-12 09:46:49 -05:00
cd $( sqlite_src) && ./configure && make sqlite3.c
2023-03-31 10:17:06 -04:00
2023-10-18 13:46:23 +02:00
$(rs_lib_dbg_static_cpy) : FORCE $( dbg_prefix )
2023-12-12 09:46:49 -05:00
cd ./rs/$( bundle) && cargo rustc $( RS_TARGET) --features static,omit_load_extension$( libsql_feature) $( rs_build_flags)
2023-10-18 13:46:23 +02:00
cp $( rs_lib_dbg_static) $( rs_lib_dbg_static_cpy)
$(rs_lib_static_cpy) : FORCE $( prefix )
2023-12-12 09:46:49 -05:00
cd ./rs/$( bundle) && cargo rustc $( RS_TARGET) --release --features static,omit_load_extension$( libsql_feature) $( rs_build_flags)
2023-10-18 13:46:23 +02:00
cp $( rs_lib_static) $( rs_lib_static_cpy)
$(rs_lib_loadable_cpy) : FORCE $( prefix )
2023-12-12 09:46:49 -05:00
cd ./rs/$( bundle) && cargo $( rs_ndk) build $( RS_TARGET) --release --features loadable_extension$( libsql_feature) $( rs_build_flags)
2023-10-18 13:46:23 +02:00
cp $( rs_lib_loadable) $( rs_lib_loadable_cpy)
$(rs_lib_dbg_loadable_cpy) : FORCE $( dbg_prefix )
2023-12-12 09:46:49 -05:00
cd ./rs/$( bundle) && cargo rustc $( RS_TARGET) --features loadable_extension$( libsql_feature) $( rs_build_flags)
2023-10-18 13:46:23 +02:00
cp $( rs_lib_dbg_loadable) $( rs_lib_dbg_loadable_cpy)
2023-03-31 10:01:22 -04:00
# Build the loadable extension.
2023-10-18 13:46:23 +02:00
$(TARGET_LOADABLE) : $( prefix ) $( ext_files ) $( sqlite 3.c ) $( rs_lib_loadable_cpy )
2023-03-31 10:17:06 -04:00
$( CC) -O2 -I./src/ -I$( sqlite_src) \
2023-03-31 10:01:22 -04:00
$( LOADABLE_CFLAGS) \
$( C_TARGET) \
2023-10-18 13:46:23 +02:00
$( sysroot_option) \
2023-03-31 10:01:22 -04:00
$( ext_files) $( rs_lib_loadable_cpy) -o $@
2023-10-18 13:46:23 +02:00
$(TARGET_DBG_LOADABLE) : $( dbg_prefix ) $( ext_files ) $( sqlite 3.c ) $( rs_lib_dbg_loadable_cpy )
2023-03-31 10:17:06 -04:00
$( CC) -g -I./src/ -I$( sqlite_src) \
2023-03-31 10:01:22 -04:00
$( LOADABLE_CFLAGS) \
2023-10-18 13:46:23 +02:00
$( C_TARGET) \
$( sysroot_option) \
2023-03-31 10:01:22 -04:00
$( ext_files) $( rs_lib_dbg_loadable_cpy) -o $@
# Build a SQLite CLI that pre-loads cr-sqlite.
# Useful for debugging.
2023-03-31 10:17:06 -04:00
$(TARGET_SQLITE3) : $( prefix ) $( TARGET_SQLITE 3_EXTRA_C ) $( rs_lib_dbg_static_cpy ) $( shell .c ) $( ext_files )
2023-03-31 10:01:22 -04:00
$( CC) -g \
-DSQLITE_THREADSAFE= 0 \
-DSQLITE_OMIT_LOAD_EXTENSION= 1 \
-DSQLITE_EXTRA_INIT= core_init \
2023-10-18 13:46:23 +02:00
-DSQLITE_ENABLE_BYTECODE_VTAB \
2023-03-31 10:17:06 -04:00
-I./src/ -I$( sqlite_src) \
$( TARGET_SQLITE3_EXTRA_C) $( shell.c) $( ext_files) $( rs_lib_dbg_static_cpy) \
2023-03-31 10:01:22 -04:00
$( LDLIBS) -o $@
2023-10-18 13:46:23 +02:00
# Build the SQLite library w/ cr-sqlite statically linked in
$(TARGET_STATIC) : $( prefix ) $( ext_files ) $( sqlite 3.c ) $( rs_lib_static_cpy )
$( CC) -g \
-DHAVE_GETHOSTUUID= 0 \
-I./src/ -I$( sqlite_src) \
$( STATIC_CFLAGS) \
$( C_TARGET) \
$( sysroot_option) \
$( ext_files)
mkdir -p $( prefix) /temp
rm -f $( prefix) /temp/*
mv *.o $( prefix) /temp
2023-12-12 09:46:49 -05:00
cd $( prefix) /temp && ar -x ../libcrsql_$( bundle) -static.a && ar -rc crsqlite.a *.o && mv crsqlite.a ../crsqlite-$( CI_MAYBE_TARGET) .a
2023-10-18 13:46:23 +02:00
2023-03-31 10:01:22 -04:00
# Build a normal SQLite CLI that does not include cr-sqlite.
# cr-sqlite can be laoded in via the `.load` pragma.
# Useful for debugging.
2023-12-12 09:46:49 -05:00
$(TARGET_SQLITE3_VANILLA) : $( prefix ) $( shell .c ) $( sqlite 3.c )
2023-03-31 10:01:22 -04:00
$( CC) -g \
$( DEFINE_SQLITE_PATH) \
-DSQLITE_THREADSAFE= 0 \
2023-03-31 10:17:06 -04:00
-I./src/ -I$( sqlite_src) \
$( sqlite3.c) $( shell.c) \
2023-03-31 10:01:22 -04:00
-o $@
2023-12-12 09:46:49 -05:00
$(TARGET_SQLITE3_EXTRA_C) : $( prefix ) $( sqlite 3.c ) src /core_init .c
2023-03-31 10:17:06 -04:00
cat $( sqlite3.c) src/core_init.c > $@
2023-03-31 10:01:22 -04:00
# run tests
$(TARGET_TEST) : $( prefix ) $( TARGET_SQLITE 3_EXTRA_C ) src /tests .c src /*.test .c $( ext_files ) $( rs_lib_dbg_static_cpy )
$( CC) -g -Wall \
-DSQLITE_THREADSAFE= 0 \
-DSQLITE_OMIT_LOAD_EXTENSION= 1 \
-DSQLITE_EXTRA_INIT= core_init \
-DUNIT_TEST= 1 \
2023-03-31 10:17:06 -04:00
-I./src/ -I$( sqlite_src) \
2023-03-31 10:01:22 -04:00
$( TARGET_SQLITE3_EXTRA_C) src/tests.c src/*.test.c $( ext_files) $( rs_lib_dbg_static_cpy) \
$( LDLIBS) -o $@
$(TARGET_TEST_ASAN) : $( prefix ) $( TARGET_SQLITE 3_EXTRA_C ) src /tests .c src /*.test .c $( ext_files )
$( CC) -fsanitize= address -g -fno-omit-frame-pointer -Wall \
-DSQLITE_THREADSAFE= 0 \
-DSQLITE_OMIT_LOAD_EXTENSION= 1 \
-DSQLITE_EXTRA_INIT= core_init \
-DUNIT_TEST= 1 \
2023-03-31 10:17:06 -04:00
-I./src/ -I$( sqlite_src) \
2023-03-31 10:01:22 -04:00
$( TARGET_SQLITE3_EXTRA_C) src/tests.c src/*.test.c $( ext_files) $( rs_lib_dbg_static_cpy) \
$( LDLIBS) -o $@
$(TARGET_FUZZ) : $( prefix ) $( TARGET_SQLITE 3_EXTRA_C ) src /fuzzer .cc $( ext_files )
clang -fsanitize= fuzzer \
-DSQLITE_THREADSAFE= 0 \
-DSQLITE_OMIT_LOAD_EXTENSION= 1 \
-DSQLITE_EXTRA_INIT= core_init \
2023-03-31 10:17:06 -04:00
-I./src/ -I$( sqlite_src) \
2023-03-31 10:01:22 -04:00
$( TARGET_SQLITE3_EXTRA_C) src/fuzzer.cc $( ext_files) $( rs_lib_dbg_static_cpy) \
$( LDLIBS) -o $@
.PHONY : all clean format \
test \
loadable \
loadable_dbg \
sqlite3 \
correctness \
valgrind \
2023-10-18 13:46:23 +02:00
ubsan analyzer fuzz asan static
2023-03-31 10:01:22 -04:00
2023-10-18 13:46:23 +02:00
FORCE : ;