#basic makefile for nsm
objects=nsm.o ConsoleColor.o DateTimeInfo.o Directory.o Expr.o ExprtkFns.o Filename.o FileSystem.o Getline.o GitInfo.o HashTk.o Lolcat.o LuaFns.o Lua.o NumFns.o Pagination.o Parser.o Path.o ProjectInfo.o Quoted.o StrFns.o SystemInfo.o Title.o TrackedInfo.o Variables.o WatchList.o
cppfiles=nsm.cpp ConsoleColor.cpp DateTimeInfo.cpp Directory.cpp Expr.cpp ExprtkFns.cpp Filename.cpp FileSystem.cpp Getline.cpp GitInfo.cpp hashtk/HashTk.cpp Lolcat.cpp LuaFns.cpp Lua.cpp NumFns.cpp Pagination.cpp Parser.cpp Path.cpp ProjectInfo.cpp Quoted.cpp StrFns.cpp SystemInfo.cpp Title.cpp TrackedInfo.cpp Variables.cpp WatchList.cpp

DESTDIR?=
PREFIX?=/usr/local
BINDIR=${DESTDIR}${PREFIX}/bin
LIBDIR=${DESTDIR}${PREFIX}/lib

CXX?=g++
CXXFLAGS+=-std=c++11 -Wall -Wextra -pedantic -O3 -Dexprtk_disable_caseinsensitivity
#CXXFLAGS=-std=c++11 -Wall -Wextra -Werror -pedantic -O3
LDFLAGS+=-pthread

ifeq ($(OS),Windows_NT) 
	detected_OS := Windows
else
	detected_OS := $(shell sh -c 'uname 2>/dev/null || echo Unknown')
endif

ifeq ($(CXX),clang)
	ifeq ($(OS),FreeBSD) 
	else
		CXXFLAGS+= -Qunused-arguments -lstdc++
		LDFLAGS+= -lm
	endif
endif

ifeq ($(detected_OS),Darwin)        # Mac OSX
	CXXFLAGS+= -pagezero_size 10000 -image_base 10000000 -Qunused-arguments
else ifeq ($(detected_OS),Windows)  # Windows
	#use these flags for a smaller binary
	CXXFLAGS+= -s -Wa,-mbig-obj -Wno-cast-function-type -Wno-error=cast-function-type
	#flags to use when compiling for Chocolatey & Releases
	#this likely causes problems with lua throwing errors
	#CXXFLAGS+= -s -Wa,-mbig-obj -static-libgcc -static-libstdc++ -Wno-cast-function-type -Wno-error=cast-function-type
else ifeq ($(detected_OS),FreeBSD)  # FreeBSD
	CXX=clang
	CXXFLAGS+= -s -Qunused-arguments -lstdc++
else                                # *nix
	#use these flags for a smaller binary
	CXXFLAGS+= -s
	#flags to use when compiling for Netlify & Releases
	#this does not work well with lua throwing errors!
	#CXXFLAGS+= -s -static-libgcc -static-libstdc++
	#CXXFLAGS+= -s -unwind-tables -funwind-tables -fexceptions -static-libgcc -static-libstdc++
endif

ifeq ($(VERCEL),1)
	CXXFLAGS+= -D__NO_CLEAR_LINES__ -D__NO_COLOUR__ -D__NO_PROGRESS__
else
	ifeq ($(NO_CLEAR_LINES),1)
		CXXFLAGS+= -D__NO_CLEAR_LINES__
	endif

	ifeq ($(NO_COLOR),1)
		CXXFLAGS+= -D__NO_COLOUR__
	else ifeq ($(NO_COLOUR),1)
		CXXFLAGS+= -D__NO_COLOUR__
	endif

	ifeq ($(NO_PROGRESS),1)
		CXXFLAGS+= -D__NO_PROGRESS__
	endif
endif

ifeq ($(BUNDLED),0)
	_BUNDLED_=0
	ifeq ($(detected_OS),Windows)  # Windows
		_BUNDLED_=1
		WAS_UNBUNDLED=1
		ifneq ($(LUA_VERSION),)
			CXXFLAGS+= -D__BUNDLED__ -D__LUA_VERSION_5_3__
			LDFLAGS+= -LLua-5.3/src -llua
		else
			CXXFLAGS+= -D__BUNDLED__ -D__LUAJIT_VERSION_2_1__
			LDFLAGS+= -LLuaJIT/src -llua51
		endif
	else ifeq ($(LUA_VERSION),x) 
		ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			CXXFLAGS+= -D__LUA_VERSION_x__
			LDFLAGS+= -L/usr/local/lib -llua -lm -ldl  
		else                                # *nix
			CXXFLAGS+= -D__LUA_VERSION_x__
			LDFLAGS+= -L/usr/local/lib -llua -ldl
		endif
	else ifeq ($(LUA_VERSION),5.4) 
		ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			CXXFLAGS+= -D__LUA_VERSION_5_4__
			LDFLAGS+= -L/usr/local/lib -llua-5.4 -lm -ldl  
		else                                # *nix
			CXXFLAGS+= -D__LUA_VERSION_5_4__
			LDFLAGS+= -L/usr/local/lib -llua-5.4 -ldl
		endif
	else ifeq ($(LUA_VERSION),5.3) 
		ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			CXXFLAGS+= -D__LUA_VERSION_5_3__
			LDFLAGS+= -L/usr/local/lib -llua-5.3 -lm -ldl  
		else                                # *nix
			CXXFLAGS+= -D__LUA_VERSION_5_3__
			LDFLAGS+= -L/usr/local/lib -llua-5.3 -ldl
		endif
	else ifeq ($(LUA_VERSION),5.2) 
		ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			CXXFLAGS+= -D__LUA_VERSION_5_2__
			LDFLAGS+= -L/usr/local/lib -llua-5.2 -lm -ldl  
		else                                # *nix
			CXXFLAGS+= -D__LUA_VERSION_5_2__
			LDFLAGS+= -L/usr/local/lib -llua-5.2 -ldl
		endif
	else ifeq ($(LUA_VERSION),5.1) 
		ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			CXXFLAGS+= -D__LUA_VERSION_5_1__
			LDFLAGS+= -L/usr/local/lib -llua-5.1 -lm -ldl  
		else                                # *nix
			CXXFLAGS+= -D__LUA_VERSION_5_1__
			LDFLAGS+= -L/usr/local/lib -llua-5.1 -ldl
		endif
	else ifeq ($(LUAJIT_VERSION),2.0)
		ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			CXXFLAGS+= -D__LUAJIT_VERSION_2_0__
			LDFLAGS+= -ldl -lm -L/usr/local/lib -lluajit-5.1  
		else                                # *nix
			CXXFLAGS+= -D__LUAJIT_VERSION_2_0__
			LDFLAGS+= -ldl -L/usr/local/lib -lluajit-5.1 
		endif
	else
		ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			CXXFLAGS+= -D__LUAJIT_VERSION_2_1__
			LDFLAGS+= -ldl -lm -L/usr/local/lib -lluajit-5.1  
		else                                # *nix
			CXXFLAGS+= -D__LUAJIT_VERSION_2_1__
			LDFLAGS+= -ldl -L/usr/local/lib -lluajit-5.1 
		endif
	endif
else
	_BUNDLED_=1
	ifeq ($(LUA_VERSION),5.3) 
		CXXFLAGS+= -D__BUNDLED__ -D__LUA_VERSION_5_3__
		ifeq ($(detected_OS),Windows)  # Windows
			LDFLAGS+= -LLua-5.3/src -llua
			#LDFLAGS+= -LLua-5.3/src -llua
		else ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			LDFLAGS+= -LLua-5.3/src -llua -ldl -lm
		else                                # *nix/Vercel
			LDFLAGS+= -LLua-5.3/src -llua -ldl
		endif
	else
		CXXFLAGS+= -D__BUNDLED__ -D__LUAJIT_VERSION_2_1__
		ifeq ($(detected_OS),Windows)  # Windows
			LDFLAGS+= -LLuaJIT/src -llua51
			#LDFLAGS+= -L. -llua51
		else ifeq ($(detected_OS),FreeBSD)  # FreeBSD
			LDFLAGS+= ./LuaJIT/src/libluajit.a -ldl -lm
			#LDFLAGS+= -ldl -lm -LLuaJIT/src -lluajit
		else                                # *nix/Vercel
			LDFLAGS+= ./LuaJIT/src/libluajit.a -ldl
			#LDFLAGS+= -ldl -LLuaJIT/src -lluajit
		endif
	endif
endif


#ifeq ($(detected_OS),Linux)              # Linux
#else ifeq ($(detected_OS),GNU)           # Debian GNU Hurd
#else ifeq ($(detected_OS),GNU/kFreeBSD)  # Debian kFreeBSD
#else ifeq ($(detected_OS),FreeBSD)       # FreeBSD
#else ifeq ($(detected_OS),NetBSD)        # NetBSD
#else ifeq ($(detected_OS),DragonFly)     # DragonFly
#else ifeq ($(detected_OS),Haiku)         # Haiku
#endif

###

all: bundled-msg make-lua nsm

###

bundled-msg:
ifeq ($(WAS_UNBUNDLED) $(LUA_VERSION),1 5.3)
	@echo "only bundled option is available on Windows"
	@echo "compiling with bundled Lua 5.3"
else ifeq ($(WAS_UNBUNDLED),1)
	@echo "only bundled option is available on Windows"
	@echo "compiling with bundled LuaJIT"
endif

###

make-lua:
ifeq ($(_BUNDLED_),0)
else ifeq ($(LUA_VERSION) $(detected_OS),5.3 FreeBSD)       # FreeBSD 
	cd Lua-5.3 && $(MAKE) freebsd
else ifeq ($(LUA_VERSION) $(detected_OS),5.3 Linux)         # Linux
	cd Lua-5.3 && $(MAKE) linux
else ifeq ($(LUA_VERSION) $(detected_OS),5.3 Darwin)        # Mac OSX
	cd Lua-5.3 && $(MAKE) macosx
else ifeq ($(LUA_VERSION) $(detected_OS),5.3 Windows)       # Windows
	cd Lua-5.3 && $(MAKE) mingw
	copy Lua-5.3\src\lua53.dll .
else ifeq ($(LUA_VERSION) $(POSIX),5.3 1)                   # Posix
	cd Lua-5.3 && $(MAKE) posix
else ifeq ($(LUA_VERSION),5.3)                              # Generic
	cd Lua-5.3 && $(MAKE) generic
else ifeq ($(detected_OS),Darwin)        # Mac OSX
	cd LuaJIT && $(MAKE) MACOSX_DEPLOYMENT_TARGET=10.9
else ifeq ($(detected_OS),Windows)       # Windows
	cd LuaJIT && $(MAKE)
	copy LuaJIT\src\lua51.dll .
else                                     # FreeBSD/Linux/Posix/Unix
	cd LuaJIT && $(MAKE)
endif

###

HashTk.o: hashtk/HashTk.cpp hashtk/HashTk.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

###

nsm: $(objects)
ifeq ($(detected_OS),Windows)  # Windows
	$(CXX) $(CXXFLAGS) $(objects) -o nsm $(LDFLAGS)
	copy nsm.exe nift.exe
else
	$(CXX) $(CXXFLAGS) $(objects) -o nsm $(LDFLAGS)
	cp nsm nift
endif

nsm.o: nsm.cpp GitInfo.o ProjectInfo.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

ProjectInfo.o: ProjectInfo.cpp ProjectInfo.h GitInfo.o Parser.o WatchList.o Timer.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

GitInfo.o: GitInfo.cpp GitInfo.h ConsoleColor.o FileSystem.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Parser.o: Parser.cpp Parser.h DateTimeInfo.o Expr.o ExprtkFns.o Getline.o HashTk.o LuaFns.o Lua.o Pagination.o SystemInfo.o TrackedInfo.o Variables.o 
	$(CXX) $(CXXFLAGS) -c -o $@ $<

WatchList.o: WatchList.cpp WatchList.h FileSystem.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Getline.o: Getline.cpp Getline.h ConsoleColor.o FileSystem.o Lolcat.o StrFns.o Consts.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Lolcat.o: Lolcat.cpp Lolcat.h FileSystem.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

LuaFns.o: LuaFns.cpp LuaFns.h Lua.o ConsoleColor.o ExprtkFns.o FileSystem.o Path.o Quoted.o Variables.o Consts.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Lua.o: Lua.cpp Lua.h StrFns.o LuaJIT/src/lua.hpp Lua-5.3/src/lua.hpp
	$(CXX) $(CXXFLAGS) -c -o $@ $<

ExprtkFns.o: ExprtkFns.cpp ExprtkFns.h Expr.o FileSystem.o Quoted.o Variables.o Consts.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Expr.o: Expr.cpp Expr.h exprtk/exprtk.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

FileSystem.o: FileSystem.cpp FileSystem.h Path.o SystemInfo.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Pagination.o: Pagination.cpp Pagination.h Path.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

DateTimeInfo.o: DateTimeInfo.cpp DateTimeInfo.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

TrackedInfo.o: TrackedInfo.cpp TrackedInfo.h Path.o Title.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Variables.o: Variables.cpp Variables.h NumFns.o Path.o StrFns.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

NumFns.o: NumFns.cpp NumFns.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Path.o: Path.cpp Path.h ConsoleColor.o Directory.o Filename.o SystemInfo.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

StrFns.o: StrFns.cpp StrFns.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Directory.o: Directory.cpp Directory.h Quoted.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Filename.o: Filename.cpp Filename.h Quoted.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

SystemInfo.o: SystemInfo.cpp SystemInfo.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Title.o: Title.cpp Title.h ConsoleColor.o Quoted.o
	$(CXX) $(CXXFLAGS) -c -o $@ $<

ConsoleColor.o: ConsoleColor.cpp ConsoleColor.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

Quoted.o: Quoted.cpp Quoted.h
	$(CXX) $(CXXFLAGS) -c -o $@ $<

###

install:
ifeq ($(detected_OS) $(LUA_VERSION),Windows 5.3) # Windows with Lua 5.3
	@echo "Will need to manually copy/move 'lua53.dll', 'nsm.exe' "
	@echo "and 'nift.exe' to a location searched by your path "
	@echo "variable, for example try 'C:\Windows\System32'"
else ifeq ($(detected_OS),Windows)  # Windows with LuaJIT
	@echo "Will need to manually copy/move 'lua51.dll', 'nsm.exe' "
	@echo "and 'nift.exe' to a location searched by your path "
	@echo "variable, for example try 'C:\Windows\System32'"
else                                # FreeBSD/Linux/OSX/Posix/Unix
	mkdir -p ${BINDIR}
	chmod 755 nsm
	mv nift ${BINDIR}
	mv nsm ${BINDIR}
endif 

uninstall:
ifeq ($(detected_OS) $(LUA_VERSION),Windows 5.3) # Windows with Lua 5.3
	@echo "Will need to manually remove 'lua53.dll', 'nsm.exe' "
	@echo "and 'nift.exe' from install location, typically "
	@echo "'C:\Windows\System32'"
else ifeq ($(detected_OS),Windows)       # Windows
	@echo "Will need to manually remove 'lua51.dll', 'nsm.exe' "
	@echo "and 'nift.exe' from install location, typically "
	@echo "'C:\Windows\System32'"
else                                     # FreeBSD/Linux/OSX/Posix/Unix
	rm ${BINDIR}/nift
	rm ${BINDIR}/nsm
endif 
	
git-bash-install:
	chmod 755 nsm
	mv nift ~/bin
	mv nsm ~/bin

git-bash-uninstall:
	rm ~/bin/nift
	rm ~/bin/nsm

clean:
ifeq ($(detected_OS),Windows)       # Windows
	del $(objects)
	cd Lua-5.3 && $(MAKE) clean
	#cd LuaJIT && $(MAKE) clean     #has been fixed in development version, soon!
else                                # FreeBSD/Linux/OSX/Posix/Unix
	rm -f $(objects)
	cd Lua-5.3 && $(MAKE) clean
	cd LuaJIT && $(MAKE) clean
endif 

clean-all: clean
ifeq ($(detected_OS),Windows)       # Windows
	del nsm.exe nift.exe lua51.dll
else                                # *nix
	rm -f nsm nift
endif 
