CMAKE_MINIMUM_REQUIRED ( VERSION 3.8 )

PROJECT ( open_iA LANGUAGES CXX )

CMAKE_POLICY(SET CMP0054 NEW)	# suppress warning about variable expansion
IF (CMAKE_MAJOR_VERSION GREATER 3 OR (CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION GREATER 9))
	CMAKE_POLICY(SET CMP0071 NEW)	# will also automoc/autoui autogenerated Qt files (and suppress CMake warnings about them being excluded)
ELSE()	# deprecated for CMake >= 3.10
	# suppress warnings from Qt config (required for Qt versions < 5.10 or so)
	CMAKE_POLICY(SET CMP0053 OLD)
ENDIF()

SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules")

IF (CMAKE_MAJOR_VERSION GREATER 4 OR
	(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION GREATER 15))
	option (openiA_PRECOMPILE  "Whether to use precompiled headers to speed up build. Default: disabled." OFF)
	IF (openiA_PRECOMPILE)
		MESSAGE(STATUS "openiA_PRECOMPILE enabled.")
	ENDIF()
ENDIF()

SET (Toolkit_DIR "${PROJECT_SOURCE_DIR}/Toolkit")

# Prepare empty BUNDLE vars:
SET (BUNDLE_DIRS "")
SET (BUNDLE_LIBS "")

INCLUDE(Common)

IF (CMAKE_COMPILER_IS_GNUCXX)
	IF ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug" OR "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
		SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb3")
		SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ggdb3")
	ENDIF()
ENDIF()
IF (MSVC)
	# Reduce size of .pdb files:
	OPTION (openiA_COMPRESS_PDB "Whether to compress .pdb files to conserve disk space. Default: enabled." ON)
	IF (openiA_COMPRESS_PDB)
		# significantly reduces size of .pdb files (89 -> 28 MB):
		SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS")
		# only slightly decrease build sizes (89 -> 80 MB), and disables incremental linking:
		#SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /OPT:REF /OPT:ICF")
	ENDIF()
ENDIF()

#-------------------------
# Subdirectories
#-------------------------
SET (TEST_DATA_DIR "${CMAKE_SOURCE_DIR}/test/data")
ADD_SUBDIRECTORY(core)

SET (EXE_NAME "open_iA${CMAKE_EXECUTABLE_SUFFIX}")
IF (MSVC)
	# Set up debugging/running environments	in Visual Studio to point to the correct dll files:
	STRING(REGEX REPLACE "/" "\\\\" VTK_WIN_DIR ${VTK_DIR})
	STRING(REGEX REPLACE "/" "\\\\" ITK_WIN_DIR ${ITK_DIR})
	STRING(REGEX REPLACE "/" "\\\\" Qt5_WIN_DIR ${QT_LIB_DIR})
	SET (RelWithDebInfoLibraryPaths "${VTK_WIN_DIR}\\bin\\RelWithDebInfo;${ITK_WIN_DIR}\\bin\\RelWithDebInfo;${Qt5_WIN_DIR}")
	SET (ReleaseLibraryPaths "${VTK_WIN_DIR}\\bin\\Release;${ITK_WIN_DIR}\\bin\\Release;${Qt5_WIN_DIR}")
	SET (DebugLibraryPaths "${VTK_WIN_DIR}\\bin\\Debug;${ITK_WIN_DIR}\\bin\\Debug;${Qt5_WIN_DIR}")
	SET (MinSizeRelLibraryPaths "${VTK_WIN_DIR}\\bin\\MinSizeRel;${ITK_WIN_DIR}\\bin\\MinSizeRel;${Qt5_WIN_DIR}")

	IF (OPENCL_FOUND)
		IF (EXISTS "${OPENCL_DLL}")
			STRING(REGEX REPLACE "/OpenCL.dll" "" OPENCL_WIN_DIR ${OPENCL_DLL})
			STRING(REGEX REPLACE "/" "\\\\" OPENCL_WIN_DIR ${OPENCL_WIN_DIR})
			SET (RelWithDebInfoLibraryPaths "${OPENCL_WIN_DIR};${RelWithDebInfoLibraryPaths}")
			SET (ReleaseLibraryPaths "${OPENCL_WIN_DIR};${ReleaseLibraryPaths}")
			SET (DebugLibraryPaths "${OPENCL_WIN_DIR};${DebugLibraryPaths}")
			SET (MinSizeRelLibraryPaths "${OPENCL_WIN_DIR};${MinSizeRelLibraryPaths}")
		ENDIF()
	ENDIF()

	IF (CUDA_FOUND)
		STRING(REGEX REPLACE "/" "\\\\" CUDA_WIN_DIR ${CUDA_TOOLKIT_ROOT_DIR})
		SET (RelWithDebInfoLibraryPaths "${CUDA_WIN_DIR}\\bin;${RelWithDebInfoLibraryPaths}")
		SET (ReleaseLibraryPaths "${CUDA_WIN_DIR}\\bin;${ReleaseLibraryPaths}")
		SET (DebugLibraryPaths "${CUDA_WIN_DIR}\\bin;${DebugLibraryPaths}")
		SET (MinSizeRelLibraryPaths "${CUDA_WIN_DIR}\\bin;${MinSizeRelLibraryPaths}")
	ENDIF()

	IF (ITK_USE_SYSTEM_FFTW)
		SET (RelWithDebInfoLibraryPaths "${ITK_FFTW_LIBDIR};${RelWithDebInfoLibraryPaths}")
		SET (ReleaseLibraryPaths "${ITK_FFTW_LIBDIR};${ReleaseLibraryPaths}")
		SET (DebugLibraryPaths "${ITK_FFTW_LIBDIR};${DebugLibraryPaths}")
		SET (MinSizeRelLibraryPaths "${ITK_FFTW_LIBDIR};${MinSizeRelLibraryPaths}")
	ENDIF(ITK_USE_SYSTEM_FFTW)

	IF (ASTRA_TOOLBOX_FOUND)
		IF (ASTRA_TOOLBOX_LIBRARIES_DEBUG)
			STRING(FIND ${ASTRA_TOOLBOX_LIBRARIES_DEBUG} "/" ASTRA_LIB_DEBUG_LASTSLASHPOS REVERSE)
			STRING(SUBSTRING ${ASTRA_TOOLBOX_LIBRARIES_DEBUG} 0 ${ASTRA_LIB_DEBUG_LASTSLASHPOS} ASTRA_LIBRARIES_DEBUG_PATH)
			STRING(REGEX REPLACE "/" "\\\\" ASTRA_LIBRARIES_DEBUG_WIN_PATH ${ASTRA_LIBRARIES_DEBUG_PATH})
			SET (DebugLibraryPaths "${ASTRA_LIBRARIES_DEBUG_WIN_PATH};${DebugLibraryPaths}")
		ENDIF()
		STRING(FIND ${ASTRA_TOOLBOX_LIBRARIES_RELEASE} "/" ASTRA_RELEASE_LIB_LASTSLASHPOS REVERSE)
		STRING(SUBSTRING ${ASTRA_TOOLBOX_LIBRARIES_RELEASE} 0 ${ASTRA_RELEASE_LIB_LASTSLASHPOS} ASTRA_LIBRARIES_RELEASE_PATH)
		STRING(REGEX REPLACE "/" "\\\\" ASTRA_LIBRARIES_RELEASE_WIN_PATH ${ASTRA_LIBRARIES_RELEASE_PATH})
		SET (RelWithDebInfoLibraryPaths "${ASTRA_LIBRARIES_RELEASE_WIN_PATH};${RelWithDebInfoLibraryPaths}")
		SET (ReleaseLibraryPaths "${ASTRA_LIBRARIES_RELEASE_WIN_PATH};${ReleaseLibraryPaths}")
		SET (MinSizeRelLibraryPaths "${ASTRA_LIBRARIES_RELEASE_WIN_PATH};${MinSizeRelLibraryPaths}")
	ENDIF()

	IF (NOT "${ITKZLIB_LIBRARIES}" STREQUAL "itkzlib")
		STRING (FIND "${ITKZLIB_LIBRARIES}" ";" SEMICOLONPOS)
		IF (SEMICOLONPOS EQUAL -1)
			SET(ZLIB_LIBRARY_RELEASE "${ITKZLIB_LIBRARIES}")
			SET(ZLIB_LIBRARY_DEBUG "${ITKZLIB_LIBRARIES}")
		ELSE()
			LIST (GET ITKZLIB_LIBRARIES 1 ZLIB_LIBRARY_RELEASE)
			LIST (GET ITKZLIB_LIBRARIES 3 ZLIB_LIBRARY_DEBUG)
		ENDIF()
		STRING(FIND ${ZLIB_LIBRARY_RELEASE} "/" ZLIBRELLIB_LASTSLASHPOS REVERSE)
		STRING(SUBSTRING ${ZLIB_LIBRARY_RELEASE} 0 ${ZLIBRELLIB_LASTSLASHPOS} ZLIB_REL_LIB_DIR)
		STRING(FIND ${ZLIB_LIBRARY_DEBUG} "/" ZLIBDBGLIB_LASTSLASHPOS REVERSE)
		STRING(SUBSTRING ${ZLIB_LIBRARY_DEBUG} 0 ${ZLIBDBGLIB_LASTSLASHPOS} ZLIB_DBG_LIB_DIR)
		MESSAGE(STATUS "ITK was built with system zlib, adding paths to dll. Release: ${ZLIB_REL_LIB_DIR}, Debug: ${ZLIB_DBG_LIB_DIR}")
		SET (RelWithDebInfoLibraryPaths "${ZLIB_REL_LIB_DIR};${RelWithDebInfoLibraryPaths}")
		SET (ReleaseLibraryPaths "${ZLIB_REL_LIB_DIR};${ReleaseLibraryPaths}")
		SET (DebugLibraryPaths "${ZLIB_DBG_LIB_DIR};${DebugLibraryPaths}")
		SET (MinSizeRelLibraryPaths "${ZLIB_REL_LIB_DIR};${MinSizeRelLibraryPaths}")
	ENDIF()

	IF (HDF5_FOUND)
		STRING(REGEX REPLACE "/cmake/hdf5" "" HDF5_BASE_DIR ${HDF5_DIR})
		STRING(REGEX REPLACE "/" "\\\\" HDF5_BASE_DIR ${HDF5_BASE_DIR})
		IF (EXISTS "${HDF5_BASE_DIR}\\bin\\Release")
			SET (RelWithDebInfoLibraryPaths "${HDF5_BASE_DIR}\\bin\\RelWithDebInfo;${RelWithDebInfoLibraryPaths}")
			SET (ReleaseLibraryPaths "${HDF5_BASE_DIR}\\bin\\Release;${ReleaseLibraryPaths}")
			SET (DebugLibraryPaths "${HDF5_BASE_DIR}\\bin\\Debug;${DebugLibraryPaths}")
			SET (MinSizeRelLibraryPaths "${HDF5_BASE_DIR}\\bin\\MinSizeRel;${MinSizeRelLibraryPaths}")
		ELSE()
			SET (RelWithDebInfoLibraryPaths "${HDF5_BASE_DIR}\\bin;${RelWithDebInfoLibraryPaths}")
			SET (ReleaseLibraryPaths "${HDF5_BASE_DIR}\\bin;${ReleaseLibraryPaths}")
			SET (DebugLibraryPaths "${HDF5_BASE_DIR}\\bin;${DebugLibraryPaths}")
			SET (MinSizeRelLibraryPaths "${HDF5_BASE_DIR}\\bin;${MinSizeRelLibraryPaths}")
		ENDIF()
	ENDIF()

	IF (vtkRenderingOpenVR_LOADED)
		STRING(FIND "${vtkRenderingOpenVR_INCLUDE_DIRS}" ";" semicolonpos REVERSE)
		math(EXPR aftersemicolon "${semicolonpos}+1")
		STRING(SUBSTRING "${vtkRenderingOpenVR_INCLUDE_DIRS}" ${aftersemicolon} -1 OPENVR_PATH_INCLUDE)
		STRING(REGEX REPLACE "/headers" "" OPENVR_PATH ${OPENVR_PATH_INCLUDE})
		STRING(REGEX REPLACE "/" "\\\\" OPENVR_PATH_WIN ${OPENVR_PATH})
		SET (OPENVR_LIB_PATH "${OPENVR_PATH_WIN}\\bin\\win64")
		SET (RelWithDebInfoLibraryPaths "${OPENVR_LIB_PATH};${RelWithDebInfoLibraryPaths}")
		SET (ReleaseLibraryPaths "${OPENVR_LIB_PATH};${ReleaseLibraryPaths}")
		SET (DebugLibraryPaths "${OPENVR_LIB_PATH};${DebugLibraryPaths}")
		SET (MinSizeRelLibraryPaths "${OPENVR_LIB_PATH};${MinSizeRelLibraryPaths}")
	ENDIF()
	
	IF (ELASTIX_LIBRARY_DIRS)
		SET (RelWithDebInfoLibraryPaths "${ELASTIX_LIBRARY_DIRS}/RelWithDebInfo;${RelWithDebInfoLibraryPaths}")
		SET (ReleaseLibraryPaths "${ELASTIX_LIBRARY_DIRS}/Release;${ReleaseLibraryPaths}")
		SET (DebugLibraryPaths "${ELASTIX_LIBRARY_DIRS}/Debug;${DebugLibraryPaths}")
		SET (MinSizeRelLibraryPaths "${ELASTIX_LIBRARY_DIRS}/MinSizeRel;${MinSizeRelLibraryPaths}")
	ENDIF()

	STRING(REGEX REPLACE "/" "\\\\" CMAKE_BINARY_WIN_DIR ${CMAKE_BINARY_DIR})
ENDIF ()

SET (GUI_EXECUTABLE_NAME open_iA)
ADD_SUBDIRECTORY(cmd)     # Sets CMD test runner, used in modules
ADD_SUBDIRECTORY(modules)
ADD_SUBDIRECTORY(gui)

ADD_SUBDIRECTORY(xinst)

#-------------------------
# Installation
#-------------------------
# Text files:
INSTALL(FILES ${CMAKE_SOURCE_DIR}/LICENSE DESTINATION .)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/README.md DESTINATION .)
include (CMakeCPack.cmake)
