CXX := clang++
CC := clang

INCLUDES := include src thirdparty/luajit/src thirdparty/uniproc/include
LIBRARY_DIRECTORIES := thirdparty/luajit/src
LINKER_INPUTS := lua51 luajit

DEBUG_DEFINES :=
DEFINES :=

CXX_FLAGS := -std=c11 -std=c++20 -g -O0
CXX_DEBUG_FLAGS :=
LNK_FLAGS := -g -O0
LNK_DEBUG_FLAGS :=

LUAJUT_BUILD_CMD := call msvcbuild.bat

.PHONY: all clean
all: build_deps link_lbs

# From https://stackoverflow.com/a/18258352/8617429
rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
define \n

endef
ifeq ($(OS), Windows_NT)
	PLATFORM_SEPERATOR := &
	touch = type nul > $(1)
	rm = rmdir /S /Q $(1) > nul || (exit 0)
	RM = del
	mkdir = mkdir $(subst /,\,$(1)) > nul 2>&1 || (exit 0)
	OUTPUT_NAME := lbs.exe
else
	PLATFORM_SEPERATOR := &&
	touch = touch $(1)
	rm = rm -rf $(1)
	RM = rm -f
	mkdir = mkdir -p $(1)
	OUTPUT_NAME := lbs
endif

clean:
	$(call RM,$(call rwildcard, obj,*.o) build/$(OUTPUT_NAME))

SOURCE_FILES := $(call rwildcard,src,*.cpp,*.hpp) $(call rwildcard,thirdparty/uniproc/src,*.cpp,*.hpp)
OBJECT_FILES := $(foreach d,$(addsuffix .o,$(SOURCE_FILES)), obj/$(d))

obj/thirdparty/uniproc/%.c.o: thirdparty/uniproc/src/%.c
	$(CC) -c $(CXX_FLAGS) $(foreach inc,$(INCLUDES),-I$(inc)) $(foreach def,$(DEFINES),-D$(def)) $< -o $@
obj/src/%.cpp.o: src/%.cpp
	$(CXX) -c $(CXX_FLAGS) $(foreach inc,$(INCLUDES),-I$(inc)) $(foreach def,$(DEFINES),-D$(def)) $< -o $@
obj/src/%.hpp.o: src/%.hpp

link_lbs: $(OBJECT_FILES)
	$(CXX) $(LNK_FLAGS) $(LNK_FLAGS) $(foreach lib,$(LIBRARY_DIRECTORIES),-L$(lib)) $(foreach lnk,$(LINKER_INPUTS),-l$(lnk)) $^ -o build/$(OUTPUT_NAME)

build_deps: .make/thirdparty_luajit

.make/thirdparty_luajit:
	git submodule update --init --recursive
	cd thirdparty/luajit/src $(PLATFORM_SEPERATOR) $(LUAJUT_BUILD_CMD)
	$(call touch,".make/thirdparty_luajit")