MAKEFLAGS += --no-builtin-rules --no-builtin-variables --warn-undefined-variables
.ONESHELL:

# configurables

CC ?= cc
CC := $(CC)

CFLAGS ?=
LDFLAGS ?=
DESTDIR ?=
LIBDIR ?= ex_zstd/priv

# end configurables

ERLANG_PATH= $(shell erl -eval 'io:format("~s", [code:root_dir()]),halt()' -noshell)

BASE_CFLAGS := \
	-std=c11 \
	-isystem$(ERLANG_PATH)/usr/include \
	-O2 \
	-fno-unwind-tables -fno-asynchronous-unwind-tables \
	-fno-plt \
	-fPIC

WARNING_CFLAGS := \
	-Wall -Wextra -Wvla -Wpedantic -Wconversion -Winline

BASE_LDFLAGS := \
	-shared \
	-L$(ERLANG_PATH)/usr/lib \
	-lzstd \
	-lei

DEPFLAGS = -MT $@ -MMD -MF c_out/$*.d

SOURCES := $(wildcard c_src/*.c)
HEADERS := $(wildcard c_src/*.h)
OBJECTS := $(SOURCES:%.c=c_out/%.o)
DEPFILES := $(SOURCES:%.c=c_out/%.d)

ALL_OBJECTS := $(OBJECTS)

all: c_out/ex_zstd_nif.so

c_out/ex_zstd_nif.so: $(ALL_OBJECTS)
	mkdir -p $(@D)
	$(CC) $(ALL_OBJECTS) $(BASE_LDFLAGS) $(DEPFLAGS) $(LDFLAGS) -o $@

c_out/c_src/%.o: c_src/%.c
	mkdir -p $(@D)
	$(CC) $< $(BASE_CFLAGS) $(WARNING_CFLAGS) $(DEPFLAGS) $(CFLAGS) -c -o $@

-include $(DEPFILES)

.PHONY: install
install:
	mkdir -p $(DESTDIR)$(LIBDIR)
	cp c_out/ex_zstd_nif.so $(DESTDIR)$(LIBDIR)

.PHONY: format
format:
	clang-format --style=file -i $(SOURCES) $(HEADERS)

.PHONY: lint
lint:
	clang-tidy --fix $(SOURCES)

.PHONY: clean
clean:
	rm -rf c_out

compile_commands.json:
	bear -- $(MAKE) \
		CC="$(CC)" \
		CFLAGS="$(BASE_CFLAGS) $(WARNING_CFLAGS) $(CFLAGS)" \
		LDFLAGS="$(BASE_LDFLAGS) $(LDFLAGS)" \
		$(OBJECTS)
