INCLUDE := -Idep -Iluajit -Iluajit/src -Ishd
CXXFLAGS := -fpermissive -std=c++11
FRAMEWORKS := -framework OpenGL -framework Metal -framework Cocoa -framework MetalKit	\
	-framework Quartz -framework AudioToolbox -framework CoreAudio -framework IOkit
CFLAGS := -rdynamic -pthread 
LDFLAGS := -pthread luajit/src/libluajit.a 
WINDRES ?= windres

ifeq ($(OS),Windows_NT)
	SHDC = ./sokol-shdc.exe
	RM = del /Q /F
else
	SHDC = ./sokol-shdc
	RM = rm -rf
	ifeq ($(shell uname),Darwin)	
	endif
endif

ifeq ($(DEBUG),1)
 CFLAGS += -g -DEBUG_BUILD -DSOKOL_DEBUG -O0 -fsanitize=address,undefined,bounds
 LDFLAGS += -glldb -fsanitize=address,undefined,bounds
 CFLAGS += -DTHREAD
#  XCFLAGS:= -DLUAJIT_USE_SYSMALLOC -DLUA_USE_APICHECK -DLUA_USE_ASSERT
#  export $(XCFLAGS)
else
	CFLAGS += -Oz
	CFLAGS += -DTHREAD -DNDEBUG
endif

default: 
	@echo use make [target]
	@echo targets: 
	@echo "  mac_x86 \n  mac_arm \n  win_x86 \n  win_arm \n  nix_x86 "
	@echo "  you can also use make bundle_app to create .app on mac os"

all: 
	$(MAKE) clean && $(MAKE) mac_arm && $(MAKE) clean && $(MAKE) mac_x86
	$(MAKE) clean && $(MAKE) win_x86 && $(MAKE) clean

# PREP
ifneq ("$(wildcard $(SHDC))","")
SHDRS	=	$(wildcard shd/*.glsl)
else 
SHDRS	=	
endif 

SHADERS=$(patsubst shd/%.glsl,shd/%.glsl.h,$(SHDRS))

$(SHADERS): shd/%.glsl.h: shd/%.glsl
	$(SHDC) -i $< -o $@ -l hlsl4:metal_macos:glsl330 

shaders: $(SHADERS)

luajit/src/luajit:
	$(MAKE) -C luajit	amalg	\
		CC=$(CC)	BUILDMODE=static \
		MACOSX_DEPLOYMENT_TARGET=10.13

core/resource.h: luajit/src/luajit core/main.h
	luajit/src/luajit dep/pack.lua	$(wildcard dep/lua/*.lua)	\
	$(wildcard dep/lua/cpml/*.lua) $(wildcard core/*.lua)	\
	$(wildcard editor/*.lua)	\
	$(wildcard res/*.ttf)	$(wildcard res/*.png)	\
	$(SHADERS)

CLIBS=$(wildcard dep/*.c) 
CPPLIBS=$(wildcard dep/*.cpp) 
LIB_OBJS:=$(CPPLIBS:.cpp=.o)
LIB_OBJS+=$(EXTRA:.m=.o)
LIB_OBJS+=$(CLIBS:.c=.o)
clibs: $(LIB_OBJS)

SRCS=$(wildcard core/*.c)
SRC_OBJS=$(SRCS:.c=.o)
source: $(SRC_OBJS) 

# ARCH ################################################################
mac_x86: NAME = bin/mac_x86
mac_x86: CC = arch -x86_64 $(CC)
mac_x86: CFLAGS += -mmacosx-version-min=10.13 
mac_x86: mac_osx

mac_arm: NAME = bin/mac_arm
mac_arm: CC = cc
mac_arm: mac_osx

win_x86: NAME = bin/win_x86.exe
win_x86: LDFLAGS += dep/luajit_win.a
win_x86: CC = zig cc -target x86_64-windows-gnu -Wl,--subsystem=windows
win_x86: windows

win_arm: NAME = bin/win_arm.exe
win_arm: CC = zig cc -target aarch64-windows-gnu -Wl,--subsystem=windows
win_arm: windows

# OS ###################################################################
bundle_app:
	mkdir -p ./bin/Umoupen/Contents/{MacOS,Resources}
	cp $(NAME) ./bin/Umoupen/Contents/MacOS/main
	cp ./res/Info.plist ./bin/Umoupen/Contents
	cp ./res/icon.icns ./bin/Umoupen/Contents/Resources/icon.icns
	cp ./res/file.icns ./bin/Umoupen/Contents/Resources/file.icns
	echo "APPSUMOU" > ./bin/Umoupen/Contents/PkgInfo
	mv ./bin/Umoupen ./bin/Umoupen.app 
	touch ./bin/Umoupen.app

mac_osx: STRIP = strip $(NAME) 
mac_osx: CFLAGS += $(INCLUDE) -DSOKOL_METAL -ObjC 
mac_osx: LDFLAGS += $(FRAMEWORKS) -Wl
# mac_osx: EXTRA := $(wildcard dep/*.m) 
mac_osx: binary

windows: STRIP = x86_64-w64-mingw32-strip $(NAME)
windows: CFLAGS += $(INCLUDE) -DSOKOL_D3D11 -DWIN32 -mwindows 
windows: LDFLAGS += -lkernel32 -luser32 -lshell32 -ldxgi -ld3d11	\
											-lole32 -lgdi32 -lwinmm -static
windows: binary
	$(STRIP) 

# BUILD ###############################################################
binary:  shaders clibs core/resource.h source
	$(CXX) -o $(NAME) -w $(LIB_OBJS) $(SRC_OBJS) $(LDFLAGS)


GARBAGE:= $(wildcard */*.o) $(wildcard */*/*.o)	\
	$(wildcard shd/*.h) $(wildcard bin/*) core/resource.h

clean: 
	@echo clean options: 
	@echo "  fullclean \n  semiclean (exclude luajit) \n  miniclean"
fullclean:
	-$(RM) $(GARBAGE)
	$(MAKE) -C luajit clean
semiclean:
	-$(RM) $(GARBAGE) 
miniclean:
	-$(RM) $(wildcard shd/*.h) core/resource.h core/main.o core/vector.o