# m2SQLITE — GNU Modula-2 bindings for SQLite
GM2      ?= gm2
# Prefer pkg-config when the dev package exists, else fall back to the
# runtime library path (no header needed: the binding links by symbol).
PKGLIBS  := $(shell pkg-config --libs sqlite3 2>/dev/null)
ifeq ($(strip $(PKGLIBS)),)
  ifneq ($(wildcard /usr/lib/x86_64-linux-gnu/libsqlite3.so.0),)
    SQLITELIBS := /usr/lib/x86_64-linux-gnu/libsqlite3.so.0
  else
    SQLITELIBS := -lsqlite3
  endif
else
  SQLITELIBS := $(PKGLIBS)
endif
SQLITECFLAGS := $(shell pkg-config --cflags sqlite3 2>/dev/null)
GM2FLAGS ?=

SRC_DIR := src
LIB_DIR := lib
BLD     := build
OBJDIR  := $(BLD)/objs
OBJS    := $(OBJDIR)/SQLiteUtils.o

INCLUDES := -I$(SRC_DIR) -I$(LIB_DIR)

TESTS    := test_version test_open test_exec test_prepare test_func test_blob test_codes
EXAMPLES := version hello_db
SHOWCASES := showcase_all

.PHONY: all tests examples showcases clean check local-sqlite

all: tests examples showcases

$(OBJDIR):
	mkdir -p $(OBJDIR)

$(BLD)/tests:
	mkdir -p $(BLD)/tests

$(BLD)/examples:
	mkdir -p $(BLD)/examples

$(OBJDIR)/SQLiteUtils.o: $(LIB_DIR)/SQLiteUtils.mod $(LIB_DIR)/SQLiteUtils.def $(SRC_DIR)/SQLite.def | $(OBJDIR)
	$(GM2) $(INCLUDES) $(GM2FLAGS) -c $< -o $@

tests: $(BLD)/tests $(OBJS) $(addprefix $(BLD)/tests/,$(TESTS))

$(BLD)/tests/%: tests/%.mod $(OBJS) | $(BLD)/tests
	$(GM2) $(INCLUDES) $(GM2FLAGS) $(SQLITECFLAGS) $< $(OBJS) -o $@ $(SQLITELIBS)

examples: $(BLD)/examples $(OBJS) $(addprefix $(BLD)/examples/,$(EXAMPLES))

$(BLD)/examples/%: examples/%.mod $(OBJS) | $(BLD)/examples
	$(GM2) $(INCLUDES) $(GM2FLAGS) $(SQLITECFLAGS) $< $(OBJS) -o $@ $(SQLITELIBS)

$(BLD)/showcases:
	mkdir -p $(BLD)/showcases

showcases: $(BLD)/showcases $(OBJS) $(addprefix $(BLD)/showcases/,$(SHOWCASES))

$(BLD)/showcases/%: showcases/%.mod $(OBJS) | $(BLD)/showcases
	$(GM2) $(INCLUDES) $(GM2FLAGS) $(SQLITECFLAGS) $< $(OBJS) -o $@ $(SQLITELIBS)

check: tests
	./tests/run_tests.sh

clean:
	rm -rf $(BLD)

# Optional: build a local amalgamation from the (git-ignored)
# sqlite-master/ reference tree into build/. Requires tclsh (present)
# and a C compiler; takes a few minutes. After this, link with:
#   gm2 ... build/sqlite3.o -lpthread -ldl -lm
local-sqlite:
	mkdir -p $(BLD)/sqlite
	cd sqlite-master && ./configure --disable-tcl && make sqlite3.c
	cp sqlite-master/sqlite3.c sqlite-master/sqlite3.h $(BLD)/sqlite/
	rm -f sqlite-master/sqlite3.c sqlite-master/sqlite3.h
	cc -O2 -DSQLITE_THREADSAFE=1 -c $(BLD)/sqlite/sqlite3.c -o $(BLD)/sqlite/sqlite3.o
