#######################################################################
##
## This Makefile must be run from the top-level integration directory:
##   make -f luprex/Makefile all
##
#######################################################################

ifeq (,$(wildcard luprex/Makefile))
  $(error This Makefile must be run from the top-level integration directory: make -f luprex/Makefile all)
endif

#######################################################################
##
## Auto detect Operating System
##
#######################################################################

ifneq "" "$(findstring -linux-,$(MAKE_HOST))"
	OS:=Linux
else ifneq "" "$(VSINSTALLDIR)"
	OS:=Windows
else
	OS:=""
endif

ifeq "$(OS)" ""
  $(error Cannot figure out which OS to build for."
endif
$(info Building for $(OS)...)


#######################################################################
##
## Make rules for linux
##
#######################################################################

ifeq "$(OS)" "Linux"
	OPT:=-g -O0
	LUPREX_EXE:=luprex
	LUPREXLIB_DLL:=luprexlib.so
	LUPREXSTATIC_EXE:=luprexstatic
	COMPILE:=g++ -Wall $(OPT) -std=c++20 -fvisibility=hidden -c -MMD -MP -fPIC -o
	LINKDLL:=g++ -Wall $(OPT) -std=c++20 -export-dynamic -Wl,--no-allow-shlib-undefined -Wl,-z,defs -shared -o
	LINKEXE:=g++ -Wall $(OPT) -std=c++20 -export-dynamic -o
	MAKEDEPS:=true
	LIBS:=-Lluprex/ext/openssl-3.0.1/lib/linux -lssl -lcrypto -ldl

	FLAGS_ERIS:=-DLUA_USE_APICHECK -DLUA_USE_POSIX
	FLAGS_CORE:=-Iluprex/ext/eris-master/src -Iluprex/cpp/wrap -Iluprex/cpp/core -Iluprex/ext
	FLAGS_DRV:=-Iluprex/ext/openssl-3.1.0/inc -Iluprex/cpp/drv -Iluprex/ext
endif

#######################################################################
##
## Make rules for visual
##
#######################################################################

ifeq "$(OS)" "Windows"
	ifeq "" "$(VSINSTALLDIR)"
		$(error You must use vcvars64.bat to set up the visual studio environment variables)
	endif
	OPT:=/Od /Zi
	LUPREX_EXE:=luprex.exe
	LUPREXLIB_DLL:=luprexlib.dll
	LUPREXSTATIC_EXE:=luprexstatic.exe
	COMPILE:=CL $(OPT) /std:c++20 /EHsc /nologo /MD /TP /c /Fo:
	LINKDLL:=CL $(OPT) /std:c++20 /EHsc /nologo /LDd /Fe:
	LINKEXE:=CL $(OPT) /std:c++20 /EHsc /nologo /Fe:
	MAKEDEPS:=g++ -Wall -std=c++20 -MMD -E -o
	LIBS:=luprex/ext/openssl-3.1.0/lib/visual/libcrypto.lib luprex/ext/openssl-3.1.0/lib/visual/libssl.lib ws2_32.lib crypt32.lib cryptui.lib user32.lib advapi32.lib

	FLAGS_ERIS:=-DLUA_USE_APICHECK -DLUA_COMPAT_ALL
	FLAGS_CORE:=-Iluprex/ext/eris-master/src -Iluprex/cpp/wrap -Iluprex/cpp/core -Iluprex/ext
	FLAGS_DRV:=-Iluprex/ext/openssl-3.1.0/inc -Iluprex/cpp/drv -Iluprex/ext
endif

#######################################################################
##
## List of all source files
##
#######################################################################

BASE_ERIS := \
	lapi lcode lctype ldebug ldo ldump lfunc lgc llex lmem lobject lopcodes \
	lparser lstate lstring ltable ltm lundump lvm lzio \
	lauxlib lbaselib lbitlib lcorolib ldblib liolib lmathlib loslib \
	lstrlib ltablib loadlib linit eris

BASE_CORE := \
	invocation spookyv2 eng-malloc debugcollector drivenengine util luastack \
	traceback planemap pprint luavector idalloc sched http \
	json table luasnap animqueue streambuffer source keywords world-core world-accessor \
	world-difftab world-diffxmit world-pairtab world-testing lpxserver lpxclient \
	unit-testing printbuffer serializelua

BASE_DRV := driver drvutil sslutil readline

#######################################################################
##
## Generate lists of OBJ files.
##
#######################################################################

OBJ_ERIS := $(patsubst %,luprex/build/$(OS)/eris/%.obj,$(BASE_ERIS))
OBJ_CORE := $(patsubst %,luprex/build/$(OS)/core/%.obj,$(BASE_CORE))
OBJ_DRV := $(patsubst %,luprex/build/$(OS)/drv/%.obj,$(BASE_DRV))

#######################################################################
##
## Make Rules
##
#######################################################################

all: luprex/build/$(OS)/$(LUPREX_EXE) luprex/build/$(OS)/$(LUPREXSTATIC_EXE) luprex/build/$(OS)/$(LUPREXLIB_DLL)

luprex/build/$(OS)/DIRECTORY:
	mkdir -p luprex/build/$(OS)/core luprex/build/$(OS)/eris luprex/build/$(OS)/drv
	touch luprex/build/$(OS)/DIRECTORY

luprex/build/$(OS)/$(LUPREX_EXE): luprex/build/$(OS)/$(LUPREXLIB_DLL) $(OBJ_DRV)
	$(LINKEXE) $@ $(OBJ_DRV) $(LIBS)

luprex/build/$(OS)/$(LUPREXSTATIC_EXE): $(OBJ_DRV) $(OBJ_ERIS) $(OBJ_CORE)
	$(LINKEXE) $@ $^ $(LIBS)

luprex/build/$(OS)/$(LUPREXLIB_DLL): $(OBJ_ERIS) $(OBJ_CORE)
	$(LINKDLL) $@ $^

luprex/build/$(OS)/eris/%.obj: luprex/ext/eris-master/src/%.c luprex/build/$(OS)/DIRECTORY
	$(MAKEDEPS) $@d $(FLAGS_ERIS) $<
	$(COMPILE) $@ $(FLAGS_ERIS) $<

luprex/build/$(OS)/core/%.obj: luprex/cpp/core/%.cpp luprex/build/$(OS)/DIRECTORY
	$(MAKEDEPS) $@d $(FLAGS_CORE) $<
	$(COMPILE) $@ $(FLAGS_CORE) $<

luprex/build/$(OS)/drv/%.obj: luprex/cpp/drv/%.cpp luprex/build/$(OS)/DIRECTORY
	$(MAKEDEPS) $@d $(FLAGS_DRV) $<
	$(COMPILE) $@ $(FLAGS_DRV) $<


clean:
	rm -f luprex/*.pdb
	rm -rf luprex/build

clean-os:
	rm -f luprex/*.pdb luprex/build/$(OS)/* luprex/build/$(OS)/*/*

#######################################################################
##
## Automatically generated Make Dependencies
##
#######################################################################

-include $(OBJ_ERIS:%.obj=%.d)
-include $(OBJ_CORE:%.obj=%.d)
-include $(OBJ_DRV:%.obj=%.d)
