INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/")

INCLUDE("${PROJECT_SOURCE_DIR}/alpine3d/ebalance/CMakeLists.txt")
INCLUDE("${PROJECT_SOURCE_DIR}/alpine3d/runoff/CMakeLists.txt")
INCLUDE("${PROJECT_SOURCE_DIR}/alpine3d/snowdrift/CMakeLists.txt")

FIND_PACKAGE(MeteoIO)
FIND_PACKAGE(Libsnowpack)
INCLUDE_DIRECTORIES(${LIBSNOWPACK_INCLUDE_DIR} ${METEOIO_INCLUDE_DIR})
SET(extra_libs ${extra_libs} ${LIBSNOWPACK_LIBRARY} ${METEOIO_LIBRARIES})

IF(MPI)
	FIND_PACKAGE(MPI REQUIRED)
	INCLUDE_DIRECTORIES(${MPI_INCLUDE_PATH})
	SET(extra_libs ${extra_libs} ${MPI_CXX_LIBRARIES})
ENDIF(MPI)

SET(a3d_sources
	${ebalance_sources}
	${runoff_sources}
	${snowdrift_sources}
	SnowpackInterfaceWorker.cc
	SnowpackInterface.cc
	Glaciers.cc
	TechSnowA3D.cc
	DataAssimilation.cc
	MeteoObj.cc
	MPIControl.cc
	OMPControl.cc
)

#shared library
IF(BUILD_SHARED_LIBS)
	SET(SHAREDNAME ${PROJECT_NAME})
	ADD_LIBRARY(${SHAREDNAME} ${a3d_sources})
	TARGET_LINK_LIBRARIES(${SHAREDNAME} ${extra_libs})
	SET_TARGET_PROPERTIES(${SHAREDNAME} PROPERTIES
		MACOSX_RPATH TRUE
		PREFIX "${LIBPREFIX}"
		LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/${LIB_DEST}"
		ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/${LIB_DEST}"
		RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/${LIB_DEST}"
		CLEAN_DIRECT_OUTPUT 1
		VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
		SOVERSION "${VERSION_MAJOR}"
	)
	INSTALL(TARGETS ${SHAREDNAME}
		RUNTIME DESTINATION "${LIB_DEST}" COMPONENT exe
		LIBRARY DESTINATION "${LIB_DEST}" COMPONENT exe
		ARCHIVE DESTINATION "${LIB_DEST}" COMPONENT exe
	)
ENDIF(BUILD_SHARED_LIBS)

#static library. Please keep in mind that for Windows, a dll is a runtime
IF(BUILD_STATIC_LIBS)
	SET(STATICNAME ${PROJECT_NAME}_STATIC)
	SET(STATICLIBNAME ${PROJECT_NAME})
	ADD_LIBRARY(${STATICNAME} STATIC ${a3d_sources})
	TARGET_LINK_LIBRARIES(${STATICNAME} ${extra_libs})
	SET_TARGET_PROPERTIES(${STATICNAME} PROPERTIES
		MACOSX_RPATH TRUE
		PREFIX "${LIBPREFIX}"
		LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/lib"
		ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/lib"
		RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/lib"
		CLEAN_DIRECT_OUTPUT 1
		OUTPUT_NAME ${STATICLIBNAME}
	)
	INSTALL(TARGETS ${STATICNAME}
		RUNTIME DESTINATION bin COMPONENT libraries
		LIBRARY DESTINATION lib COMPONENT libraries
		ARCHIVE DESTINATION lib COMPONENT libraries
	)
ENDIF(BUILD_STATIC_LIBS)

#################################################################################
# And now, build the binary

IF(ALPINE3D_STANDALONE)
	SET(a3d_main
		AlpineControl.cc
		AlpineMain.cc
	)

	#get the proper Snowpack library
	IF(BUILD_SHARED_LIBS)
		SET(LIBALPINE3D_LIBRARY ${PROJECT_NAME})
	ELSE(BUILD_SHARED_LIBS)
		IF(BUILD_STATIC_LIBS)
			SET(LIBALPINE3D_LIBRARY "${PROJECT_NAME}_STATIC")
		ELSE(BUILD_STATIC_LIBS)
			MESSAGE(SEND_ERROR "Not building Alpine3D, the standalone application won't be able to build")
		ENDIF(BUILD_STATIC_LIBS)
	ENDIF(BUILD_SHARED_LIBS)

	#LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
	SET(A3D_LINKS ${extra_libs})
	IF(APPLE)
		#this is necessary for GUI exceptions
		LIST(APPEND A3D_LINKS "-framework CoreServices")
	ENDIF(APPLE)
	IF(UNIX)
		LIST(APPEND A3D_LINKS "dl;pthread")
	ENDIF(UNIX)

	#Prepare executable
	SET(BINARY "alpine3d.app")
	ADD_EXECUTABLE(${BINARY} ${a3d_main})
	TARGET_LINK_LIBRARIES(${BINARY} ${LIBALPINE3D_LIBRARY} ${A3D_LINKS})

IF(PROFILING)
	TARGET_LINK_LIBRARIES(${BINARY} debug profiler)
ENDIF(PROFILING)

	SET_TARGET_PROPERTIES(${BINARY} PROPERTIES
		RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin"
		CLEAN_DIRECT_OUTPUT 1
		OUTPUT_NAME "alpine3d"
	)

	INSTALL(TARGETS ${BINARY}
		RUNTIME DESTINATION bin
		COMPONENT exe
	)
ENDIF(ALPINE3D_STANDALONE)
