SUBDIR = triangle
NAME = triangle
CFLAGS = -std=c++17 --sysroot="$(SYSROOT)" -Wall
LDFLAGS = -lvulkan -lpng

ifeq ($(target), cheza)
	CXX = /usr/bin/armv7a-cros-linux-gnueabihf-clang++
	CC = /usr/bin/armv7a-cros-linux-gnueabihf-clang
	SYSROOT = /build/cheza
	SSH_DUT = cheza
	TARGET = cheza
else ifeq ($(target), atlas)
	CXX = /usr/bin/x86_64-cros-linux-gnu-clang++
	CC = /usr/bin/x86_64-cros-linux-gnu-clang
	SYSROOT = /build/atlas
	SSH_DUT = atlas
	TARGET = atlas
else ifeq ($(target), android)
	ANDROID_ROOT = ~/android
	SSH_DUT = android
	TRACE = False
	TARGET = android
else ifeq ($(target), android-trace)
	ANDROID_ROOT = ~/android
	SSH_DUT = android
	TRACE = True
	TARGET = android
else ifeq ($(target), local)
	CXX = clang++
	CC = clang
	TARGET = local
else
	CXX = INVALID
	CC = INVALID
	TARGET = INVALID
endif

all: shaders build deploy run

build: check
	@echo Building...
ifeq ($(TARGET), android)
	@NDK_PROJECT_PATH=. \
	 NDK_ROOT=${ANDROID_ROOT}/ndk/ \
	 TARGET_NAME=${NAME} \
	 COMPILE_ROOT=${ANDROID_ROOT}/compile \
		${ANDROID_ROOT}/ndk/ndk-build NDK_APPLICATION_MK=./Application.mk
else
	@$(CXX) $(CFLAGS) -o ${NAME} ${NAME}.cc $(LDFLAGS)
endif

deploy: check
	@echo Deploying to $(SSH_DUT)...
ifeq ($(TARGET), android)
	@adb push ${NAME}.vert.spv /data/vulkan/${SUBDIR}/${NAME}.vert.spv
	@adb push ${NAME}.frag.spv /data/vulkan/${SUBDIR}/${NAME}.frag.spv
	@adb push libs/arm64-v8a/${NAME} /data/vulkan/${SUBDIR}/
else ifneq ($(TARGET), local)
	@scp ${NAME}.vert.spv $(SSH_DUT):~/${SUBDIR}/${NAME}.vert.spv
	@scp ${NAME}.frag.spv $(SSH_DUT):~/${SUBDIR}/${NAME}.frag.spv
	@scp ${NAME} $(SSH_DUT):~/${SUBDIR}/
endif

run: check
ifeq ($(TARGET), android)
	@echo Running on $(SSH_DUT)...
ifeq ($(TRACE), True)
	@adb shell "cd /data/vulkan/${SUBDIR} && LD_PRELOAD=/data/vulkan/libwrap.so ./${NAME}"
	@echo Copying artifacts back to local device...
	@adb pull /data/vulkan/${SUBDIR}/${NAME}.png .
	@adb pull /sdcard/trace.rd .
else
	@adb shell "cd /data/vulkan/${SUBDIR} && ./${NAME}"
	@echo Copying artifacts back to local device...
	@adb pull /data/vulkan/${SUBDIR}/${NAME}.png .
endif
else ifneq ($(TARGET), local)
	@echo Running on $(SSH_DUT)...
	@ssh $(SSH_DUT) 'cd ~/${SUBDIR} && ./${NAME}'
	@echo Copying artifacts back to local device...
	@scp $(SSH_DUT):~/${SUBDIR}/${NAME}.png .
else
	@echo Running locally...
	@./$(NAME)
endif

shaders:
	@glslc -c ${NAME}.vert
	@glslc -c ${NAME}.frag

clean: check
	@rm -f ${NAME}
	@rm -f ${NAME}.png
	@rm -f ${NAME}.vert.spv
	@rm -f ${NAME}.frag.spv
	@rm -f trace.rd
	@rm -rf libs
	@rm -rf obj
ifneq ($(TARGET), local)
ifeq ($(TARGET), android)
	@adb shell rm /data/vulkan/${SUBDIR}/*
else
	@ssh $(SSH_DUT) 'rm -f ~/${SUBDIR}/${NAME} ~/${SUBDIR}/${NAME}.vert.spv \
		~/${SUBDIR}/${NAME}.frag.spv ~/${SUBDIR}/${NAME}.png'
endif
endif

check:
ifeq ($(TARGET), INVALID)
	$(error $$target must be one of [atlas, cheza, android, android-trace, local])
endif
