INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}")

IF(COMMAND cmake_policy)
	CMAKE_POLICY(SET CMP0003 NEW)
ENDIF(COMMAND cmake_policy)

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 REQUIRED)
INCLUDE_DIRECTORIES(${METEOIO_INCLUDE_DIR})
FIND_PACKAGE(Libsnowpack REQUIRED)
INCLUDE_DIRECTORIES(${LIBSNOWPACK_INCLUDE_DIR})

IF(PETSC)
	FIND_PACKAGE(PETSc REQUIRED)
	INCLUDE_DIRECTORIES(${PETSC_INCLUDES}})
ENDIF(PETSC)
IF(MPI)
	FIND_PACKAGE(MPI REQUIRED)
	INCLUDE_DIRECTORIES(${MPI_INCLUDE_PATH})
ENDIF(MPI)

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

#shared library.
IF(BUILD_SHARED_LIBS)
	SET(LIB_DEST "lib")
	IF(WIN32)
		SET(LIB_DEST "bin") #since for Windows, dlls have to be alongside the exe
	ENDIF(WIN32)
	SET(SHAREDNAME ${PROJECT_NAME})
	ADD_LIBRARY(${SHAREDNAME} ${a3d_sources})
	TARGET_LINK_LIBRARIES(${SHAREDNAME} ${LIBSNOWPACK_LIBRARIES} ${METEOIO_LIBRARIES} ${MPI_CXX_LIBRARIES} ${PETSC_LIBRARIES})
	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 libraries
		LIBRARY DESTINATION ${LIB_DEST} COMPONENT libraries
		ARCHIVE DESTINATION ${LIB_DEST} COMPONENT libraries
	)
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} ${LIBSNOWPACK_LIBRARIES} ${METEOIO_LIBRARIES} ${MPI_CXX_LIBRARIES} ${PETSC_LIBRARIES})
	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
	)
	
	SET(A3D_LINKS "alpine3d")
	LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
	LIST(APPEND A3D_LINKS ${LIBSNOWPACK_LIBRARIES} ${METEOIO_LIBRARIES} ${MPI_CXX_LIBRARIES} ${PETSC_LIBRARIES})
	IF(APPLE)
		#this is necessary for GUI exceptions
		LIST(APPEND SN_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} ${A3D_LINKS})

	SET_TARGET_PROPERTIES(${BINARY} PROPERTIES
		MACOSX_RPATH TRUE
		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)
