# Makefile for biscuit PostgreSQL extension

EXTENSION = biscuit
EXTVERSION = 2.2.3

MODULE_big = biscuit

# Automatically compile all source files in src/
OBJS = $(patsubst %.c,%.o,$(wildcard src/*.c))

# Versioned install script (IMPORTANT: must match EXTENSION versioning scheme)
DATA = sql/biscuit--$(EXTVERSION).sql

PGFILEDESC = "Wildcard pattern matching through bitmap indexing"

# PostgreSQL build system
PG_CONFIG ?= pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)

# Detect OS
UNAME_S := $(shell uname -s)
UNAME_M := $(shell uname -m)

# Try to detect CRoaring library (optional)
ROARING_CFLAGS := $(shell pkg-config --cflags roaring 2>/dev/null)
ROARING_LIBS := $(shell pkg-config --libs roaring 2>/dev/null)

# Fallback include search
ifeq ($(ROARING_CFLAGS),)

ROARING_INCLUDE := $(shell \
	for dir in /usr/include /usr/local/include /opt/homebrew/include /opt/local/include; do \
		if [ -f $$dir/roaring/roaring.h ]; then \
			echo "-I$$dir"; \
			break; \
		fi; \
	done)

ifneq ($(ROARING_INCLUDE),)
ROARING_CFLAGS := $(ROARING_INCLUDE)
endif
endif

# Fallback library search
ifeq ($(ROARING_LIBS),)

ifeq ($(UNAME_S),Darwin)
ROARING_LIBDIR := $(shell \
	for dir in /usr/local/lib /opt/homebrew/lib /opt/local/lib; do \
		if [ -f $$dir/libroaring.dylib ] || [ -f $$dir/libroaring.a ]; then \
			echo "$$dir"; \
			break; \
		fi; \
	done)

else ifeq ($(UNAME_S),Linux)
ROARING_LIBDIR := $(shell \
	for dir in \
		/usr/lib/$(shell gcc -print-multiarch 2>/dev/null) \
		/usr/lib64 \
		/usr/lib \
		/usr/local/lib \
		/usr/local/lib64; do \
		if [ -f $$dir/libroaring.so ] || [ -f $$dir/libroaring.a ]; then \
			echo "$$dir"; \
			break; \
		fi; \
	done)
else
ROARING_LIBDIR := $(shell \
	for dir in /usr/local/lib /usr/lib /opt/local/lib; do \
		if [ -f $$dir/libroaring.so ] || [ -f $$dir/libroaring.a ]; then \
			echo "$$dir"; \
			break; \
		fi; \
	done)
endif

ifneq ($(ROARING_LIBDIR),)
ROARING_LIBS := -L$(ROARING_LIBDIR) -lroaring
endif
endif

# Apply CRoaring flags only if found
ifneq ($(ROARING_CFLAGS),)
ifneq ($(ROARING_LIBS),)

PG_CPPFLAGS += -DHAVE_ROARING $(ROARING_CFLAGS)
SHLIB_LINK += $(ROARING_LIBS)

ROARING_FOUND = yes

ifneq ($(UNAME_S),Darwin)
SHLIB_LINK += -Wl,-rpath,'$$ORIGIN'

ifneq ($(ROARING_LIBDIR),)
SHLIB_LINK += -Wl,-rpath,$(ROARING_LIBDIR)
endif

endif
endif
endif

include $(PGXS)

# Compiler flags
override CFLAGS += \
	-Wall \
	-Wextra \
	-Wmissing-prototypes \
	-Wpointer-arith \
	-Werror=vla \
	-Wendif-labels \
	-fPIC

# =========================
# Build targets
# =========================

all: sql/biscuit--$(EXTVERSION).sql

sql/biscuit--$(EXTVERSION).sql: sql/biscuit.sql
	@mkdir -p sql
	cp $< $@

# Install handled by PGXS using DATA

.PHONY: check-deps
check-deps:
	@echo "Checking dependencies..."
	@command -v $(PG_CONFIG) >/dev/null 2>&1 || { \
		echo "PostgreSQL pg_config not found."; exit 1; }
	@echo "PostgreSQL version: $$($(PG_CONFIG) --version)"

ifeq ($(ROARING_FOUND),yes)
	@echo "CRoaring library: FOUND"
	@echo "  CFLAGS: $(ROARING_CFLAGS)"
	@echo "  LIBS: $(ROARING_LIBS)"
else
	@echo "CRoaring library: NOT FOUND (fallback enabled)"
endif

.PHONY: clean
clean:
	rm -f src/*.o
	rm -f src/*.bc
	rm -f biscuit.so
	rm -f sql/biscuit--$(EXTVERSION).sql

.PHONY: dist
dist:
	@echo "Creating distribution archive for version $(EXTVERSION)..."
	@rm -rf dist
	@mkdir dist
	@cp -r $$(ls | grep -v -E '^(dist|.*\.zip)$$') dist/
	@cd dist && zip -r ../$(EXTENSION)-$(EXTVERSION).zip .
	@rm -rf dist
	@echo "Created $(EXTENSION)-$(EXTVERSION).zip"

.PHONY: help
help:
	@echo "Biscuit PostgreSQL Extension v$(EXTVERSION)"
	@echo "Targets:"
	@echo "  make / make all"
	@echo "  make install"
	@echo "  make clean"
	@echo "  make dist"
	@echo "  make check-deps"
