CURDIR := $(shell pwd)

CC = clang
FASTORE=./fastore
SRCDIR=./c_src
ERLANG_PATH = $(shell erl -eval 'io:format("~s", [lists:concat([code:root_dir(), "/erts-", erlang:system_info(version), "/include"])])' -s init stop -noshell)
INCPATHS = -I/usr/include -I/usr/include/malloc -I/usr/local/opt/openssl@1.1/include -I$(ERLANG_PATH) -I$(FASTORE)
LDLIBS = -lgmp -lssl -lcrypto
LDPATH = -L/usr/lib -L/usr/local/opt/openssl@1.1/lib

CFLAGS += -pthread -O3 -Wall -maes -g -I$(INCPATHS)
SO_LDFLAGS := -Wl,-soname,libargon2.so.0

KERNEL_NAME := $(shell uname -s)

ifeq ($(KERNEL_NAME), Linux)
	LIB_CFLAGS := -shared -fPIC -fvisibility=hidden
	#SO_LDFLAGS := -Wl,-soname TODO: Is this needed?
endif
ifeq ($(KERNEL_NAME), Darwin)
	LIB_CFLAGS := -dynamiclib -undefined dynamic_lookup
endif
ifeq ($(KERNEL_NAME), $(filter $(KERNEL_NAME),OpenBSD FreeBSD NetBSD))
	LIB_CFLAGS := -shared -fPIC
endif

BUILD = _build
TESTS = tests
SRC = $(FASTORE)/crypto.c $(FASTORE)/ore.c $(FASTORE)/ore_blk.c
OUTPUT = $(SRCDIR)/../priv/liboreblk.so
FASTORE_OBJ = $(patsubst $(FASTORE)/%.c,$(BUILD)/%.o, $(SRC))
OBJPATHS = $(FASTORE_OBJ) $(BUILD)/ore_blk_nif.o

all: $(OBJPATHS) $(OUTPUT)
	@echo $(ERLANG_PATH)

$(BUILD):
	@echo "Creating build dir..."
	mkdir -p $(BUILD)

$(BUILD)/ore_blk_nif.o: $(SRCDIR)/ore_blk_nif.c $(SRCDIR)/debug.h | $(BUILD)
	@echo "Compiling ${$<}"
	$(CC) $(LIB_CFLAGS) $(CFLAGS) -o $@ -c $<

$(BUILD)/%.o: | $(BUILD)
	$(CC) $(LIB_CFLAGS) $(CFLAGS) -o $@ -c $(FASTORE)/$*.c

$(OUTPUT): $(OBJPATHS)
	$(CC) $(CFLAGS) $(LIB_CFLAGS) -o $(OUTPUT) $(OBJPATHS) $(LDPATH) $(LDLIBS)

clean:
	rm -rf $(BUILD)/*.o $(OUTPUT) $(TESTS) *~
