HELPER_MK_FILE := ../MakefileHelpers/common.mk
include ${HELPER_MK_FILE}

DEBUG_TARGET := bin/Debug/SparseReconstructionViewer
RELEASE_TARGET := bin/Release/SparseReconstructionViewer

DEBUG_OBJ_DIR := obj/Debug/
RELEASE_OBJ_DIR := obj/Release/

DEBUG_DEP_DIR := dep/Debug/
RELEASE_DEP_DIR := dep/Release/


CFLAGS := ${CUDA_CFLAGS} ${IMAGE_MAGICK_CFLAGS} ${BOOST_CFLAGS} ${COMMON_FLAGS} -I../SFMBackend/source -I../Engine/source -I../SFMUtilities/source
LFLAGS := -lrt ${CUDA_LFLAGS} ${IMAGE_MAGICK_LFLAGS} ${BOOST_LFLAGS} ${TINYXML_LFLAGS} ${COMMON_FLAGS} -lX11 -lGLEW -lGL -lGLU

DEBUG_CFLAGS := ${CFLAGS} ${DEBUG_CFLAG_ADDITIONS}
RELEASE_CFLAGS := ${CFLAGS} ${RELEASE_CFLAG_ADDITIONS}

DEBUG_LFLAGS := -L../Engine/bin/Debug/ -lEngine -L../SFMBackend/bin/Debug/ -lSFMBackend -L../SFMUtilities/bin/Debug/ -lSFMUtilities ${LFLAGS} ${DEBUG_LFLAG_ADDITIONS}
RELEASE_LFLAGS := -L../Engine/bin/Release/ -lEngine -L../SFMBackend/bin/Release/ -lSFMBackend -L../SFMUtilities/bin/Release/ -lSFMUtilities ${LFLAGS} ${RELEASE_LFLAG_ADDITIONS}

SRCS := \
	main.cpp

DEBUG_OBJS    := $(addprefix ${DEBUG_OBJ_DIR}, ${SRCS:.cpp=.o} )
DEBUG_DEPS    := $(addprefix ${DEBUG_DEP_DIR}, ${SRCS:.cpp=.dep} )
DEBUG_XDEPS   := $(wildcard ${DEBUG_DEPS}) 

RELEASE_OBJS    := $(addprefix ${RELEASE_OBJ_DIR}, ${SRCS:.cpp=.o} )
RELEASE_DEPS    := $(addprefix ${RELEASE_DEP_DIR}, ${SRCS:.cpp=.dep} )
RELEASE_XDEPS   := $(wildcard ${RELEASE_DEPS}) 


.PHONY: all debug release clean build_dependent_debug_libs build_dependent_release_libs
all:: ${RELEASE_TARGET} ${DEBUG_TARGET}

debug:: ${DEBUG_TARGET}

release:: ${RELEASE_TARGET}


build_dependent_debug_libs::
	@echo -e ${bash_red}Building SFM kernels${bash_nocolor}
	@cd ../SFMBackend && $(MAKE) kernels ${MAKEFLAGS}
	@echo -e ${bash_red}Building SFM debug lib${bash_nocolor}
	@cd ../SFMBackend && $(MAKE) debug ${MAKEFLAGS}
	@echo -e ${bash_red}Building engine debug lib${bash_nocolor}
	@cd ../Engine && $(MAKE) debug ${MAKEFLAGS}
	@echo -e ${bash_red}Building SFMUtilities debug lib${bash_nocolor}
	@cd ../SFMUtilities && $(MAKE) debug ${MAKEFLAGS}

build_dependent_release_libs::
	@echo -e ${bash_red}Building SFM kernels${bash_nocolor}
	@cd ../SFMBackend && $(MAKE) kernels ${MAKEFLAGS}
	@echo -e ${bash_red}Building SFM release lib${bash_nocolor}
	@cd ../SFMBackend && $(MAKE) release ${MAKEFLAGS}
	@echo -e ${bash_red}Building engine release lib${bash_nocolor}
	@cd ../Engine && $(MAKE) release ${MAKEFLAGS}
	@echo -e ${bash_red}Building SFMUtilities release lib${bash_nocolor}
	@cd ../SFMUtilities && $(MAKE) release ${MAKEFLAGS}

print_config:
	@echo "Cuda installation located in ${CUDA_BASE_DIR}"
	@echo "Cuda cflags ${CUDA_CFLAGS}"
	@echo "Cuda nvcc cflags ${CUDA_NVCC_CFLAGS}"
	@echo "Image magick cflags ${IMAGE_MAGICK_CFLAGS}"
	@echo "Image magick lflags ${IMAGE_MAGICK_LFLAGS}"


ifneq (${RELEASE_XDEPS},) 
include ${RELEASE_XDEPS} 
endif 

ifneq (${DEBUG_XDEPS},) 
include ${DEBUG_XDEPS} 
endif 

${DEBUG_TARGET}: ${DEBUG_OBJS} build_dependent_debug_libs
	@echo -e ${bash_green}Building binary executable${bash_nocolor}
	@mkdir -p $(dir $@)
	@${CC} -o $@ ${DEBUG_OBJS} ${DEBUG_LFLAGS}

${DEBUG_OBJS}: ${DEBUG_OBJ_DIR}%.o: %.cpp ${DEBUG_DEP_DIR}%.dep 
	@echo -e ${bash_green}Compiling $<${bash_nocolor}
	@mkdir -p $(dir $@)
	@${CC} -o $@ -c $< ${DEBUG_CFLAGS}

${DEBUG_DEPS}: ${DEBUG_DEP_DIR}%.dep: %.cpp Makefile ${HELPER_MK_FILE}
	@echo -e ${bash_green}Building deps for $<${bash_nocolor}
	@mkdir -p $(dir $@)
	@${CC} ${DEBUG_CFLAGS} -MM $< > $@ 



${RELEASE_TARGET}: ${RELEASE_OBJS} build_dependent_release_libs
	@echo -e ${bash_green}Building binary executable${bash_nocolor}
	@mkdir -p $(dir $@)
	@${CC} -o $@ ${RELEASE_OBJS} ${RELEASE_LFLAGS}

${RELEASE_OBJS}: ${RELEASE_OBJ_DIR}%.o: %.cpp ${RELEASE_DEP_DIR}%.dep 
	@echo -e ${bash_green}Compiling $<${bash_nocolor}
	@mkdir -p $(dir $@)
	@${CC} -o $@ -c $< ${RELEASE_CFLAGS}

${RELEASE_DEPS}: ${RELEASE_DEP_DIR}%.dep: %.cpp Makefile ${HELPER_MK_FILE}
	@echo -e ${bash_green}Building deps for $<${bash_nocolor}
	@mkdir -p $(dir $@)
	@${CC} ${RELEASE_CFLAGS} -MM $< > $@ 

clean::
	rm -f ${DEBUG_OBJS} ${DEBUG_DEPS} ${DEBUG_TARGET}
	rm -f ${RELEASE_OBJS} ${RELEASE_DEPS} ${RELEASE_TARGET}

