ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
NBIS := $(ROOT)nbis
UNAME_S := $(shell uname -s)
BUILD := $(ROOT)build/$(UNAME_S)
LIBDIR := $(ROOT)lib
PKGDIR := $(ROOT)../afis/_native

ifeq ($(UNAME_S),Darwin)
  LIBNAME := libafis_lfs.dylib
  SOFLAGS := -dynamiclib -install_name @rpath/$(LIBNAME)
  NPROC := $(shell sysctl -n hw.ncpu 2>/dev/null || echo 4)
else ifeq ($(UNAME_S),Linux)
  LIBNAME := libafis_lfs.so
  SOFLAGS := -shared -Wl,-soname,$(LIBNAME)
  NPROC := $(shell nproc 2>/dev/null || echo 4)
else
  $(error Native build supports Darwin and Linux only; got $(UNAME_S))
endif

MAKEFLAGS += -j$(NPROC)

CC ?= cc
CFLAGS ?= -O2 -fPIC -DNOVERBOSE -w -D_DEFAULT_SOURCE
INCLUDES := -I$(ROOT) -I$(NBIS)/mindtct/include -I$(NBIS)/bozorth/include -I$(NBIS)/commonbis/include
LIBS := -lm

ifneq ($(shell command -v ccache 2>/dev/null),)
  CC := ccache $(CC)
endif

MINDTCT_SRC := \
  log.c line.c contour.c imgutil.c quality.c block.c loop.c \
  mytime.c minutia.c link.c matchpat.c binar.c morph.c \
  chaincod.c detect.c dft.c free.c globals.c init.c isempty.c \
  remove.c ridges.c shape.c sort.c util.c maps.c xytreps.c getmin.c

BOZORTH_SRC := \
  bozorth3.c bz_alloc.c bz_drvrs.c bz_gbls.c bz_io.c bz_sort.c bozorth_glue.c

MINDTCT_OBJS := $(addprefix $(BUILD)/mindtct/,$(MINDTCT_SRC:.c=.o))
BOZORTH_OBJS := $(addprefix $(BUILD)/bozorth/,$(BOZORTH_SRC:.c=.o))
WRAP_OBJ := $(BUILD)/afis_lfs.o
ALL_OBJS := $(WRAP_OBJ) $(MINDTCT_OBJS) $(BOZORTH_OBJS)

.PHONY: all clean install dirs

all: $(LIBDIR)/$(LIBNAME)

dirs:
	@mkdir -p $(BUILD)/mindtct $(BUILD)/bozorth $(LIBDIR) $(PKGDIR)

install: all
	cp -f $(LIBDIR)/$(LIBNAME) $(PKGDIR)/$(LIBNAME)

$(LIBDIR)/$(LIBNAME): $(ALL_OBJS) | dirs
	$(CC) $(SOFLAGS) -o $@ $(ALL_OBJS) $(LIBS)

$(BUILD)/afis_lfs.o: $(ROOT)afis_lfs.c $(ROOT)afis_lfs.h | dirs
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

$(BUILD)/mindtct/%.o: $(NBIS)/mindtct/src/lib/mindtct/%.c | dirs
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

$(BUILD)/bozorth/%.o: $(NBIS)/bozorth/src/lib/bozorth3/%.c | dirs
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

clean:
	rm -rf $(ROOT)build $(LIBDIR)
