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")