cmake_minimum_required (VERSION 3.8)
include(CheckLanguage)

project (Dca)
set(CCMPRED_MAJOR_VERSION 0)
set(CCMPRED_MINOR_VERSION 3)
set(CCMPRED_PATCH_VERSION 3)

set(CCMPRED_VERSION ${CCMPRED_MAJOR_VERSION}.${CCMPRED_MINOR_VERSION}.${CCMPRED_PATCH_VERSION})

if(CMAKE_VERSION VERSION_GREATER 2.8.11)
#       cmake_policy(SET CMP0022 OLD)
        cmake_policy(SET CMP0104 NEW)   # AFN: 12/16/2021
endif(CMAKE_VERSION VERSION_GREATER 2.8.11)

if(NOT EXISTS "${PROJECT_SOURCE_DIR}/libcjgd/CMakeLists.txt")
	message(FATAL_ERROR "CCMpred is missing the libcjgd submodule! Please make sure to clone CCMpred according to the instructions in the README at \n https://github.com/soedinglab/CCMpred/blob/master/README.md#downloading")
endif()

# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake_lib/")

set(CMAKE_C_FLAGS "-std=c99 -O3 -fno-strict-aliasing -g -shared -fPIC -fopenmp ")
set(CMAKE_CXX_FLAGS "-std=c99 -O3 -fno-strict-aliasing -g -shared -fPIC -fopenmp ")
#set(CMAKE_C_FLAGS "-std=c99 -O3 -fno-strict-aliasing -g -static -fPIC -fopenmp ")
#set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -no-pie")

include_directories("${PROJECT_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}/libcjgd")

# OpenMP is on by default. You can disable compiling with OpenMP by using cmake -DWITH_OMP=OFF
if(NOT DEFINED WITH_OMP)
	set(WITH_OMP ON)
endif(NOT DEFINED WITH_OMP)

# CUDA is on by default. You can disable compiling with cuda by using cmake -DWITH_CUDA=OFF
if(NOT DEFINED WITH_CUDA)
	set(WITH_CUDA ON)
endif(NOT DEFINED WITH_CUDA)

# generate padded code by default. You can disable padding by using cmake -DWITH_PADDING=OFF
if(NOT DEFINED WITH_PADDING)
	set(WITH_PADDING ON)
endif(NOT DEFINED WITH_PADDING)

if(NOT DEFINED CONJUGRAD_FLOAT)
	set(CONJUGRAD_FLOAT 32)
endif(NOT DEFINED CONJUGRAD_FLOAT)

add_definitions("-D_DEFAULT_SOURCE")
add_definitions("-D_GNU_SOURCE")
add_definitions("-DCONJUGRAD_FLOAT=${CONJUGRAD_FLOAT}")
add_definitions('-D__VERSION="${CCMPRED_VERSION}"')
add_definitions("-DBIG_ALIGN=0")

set(SOURCES dca_cpu.cc dca_io.cc dca_opt.cc dca_run.cc dca_seq.cc dca_util.cc dca_wts.cc )

# Compile with padding if set
if(WITH_PADDING)
	add_definitions(-DPADDING)
endif(WITH_PADDING)


# Compile with OpenMP if available
if(WITH_OMP)
	find_package(OpenMP REQUIRED)
endif(WITH_OMP)
if(OPENMP_FOUND)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
#    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
	list(APPEND SOURCES dca_omp.cc)
	add_definitions("-DOPENMP")
endif(OPENMP_FOUND)


# Compile with CUDA if we can find the SDK
if(WITH_CUDA)
	check_language(CUDA)
	enable_language(CUDA)

	add_definitions(-DCUDA)

	include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})

	list(APPEND SOURCES dca_cuda.cc evaluate_cuda_kernels.cu)
endif(WITH_CUDA)

#add_executable(dca_typ ${SOURCES})
add_library(dca_typ ${SOURCES})

if(OPENMP_FOUND)
	target_link_libraries(dca_typ OpenMP::OpenMP_CXX)
endif(OPENMP_FOUND)

if(WITH_CUDA)
	set_target_properties(dca_typ PROPERTIES CUDA_SEPERABLE_COMPILATION ON)
endif(WITH_CUDA)

if(UNIX)
	target_link_libraries(dca_typ m)
endif(UNIX)


set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(dca_typ Threads::Threads)

# compile libConjuGrad
add_subdirectory(libcjgd)
target_link_libraries(dca_typ cjgd)


install(TARGETS dca_typ DESTINATION bin)

# package creation
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Protein residue-residue contacts from correlated mutations predicted accurately and quickly")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
SET(CPACK_PACKAGE_VENDOR "AG Soeding")
set(CPACK_PACKAGE_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_PACKAGE_VERSION_MAJOR "${CCMPRED_MAJOR_VERSION}")
set(CPACK_PACKAGE_VERSION_MINOR "${CCMPRED_MINOR_VERSION}")
set(CPACK_PACKAGE_VERSION_PATCH "${CCMPRED_PATCH_VERSION}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY  "dca_typ ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "dca_typ-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
if(WIN32 AND NOT UNIX)
	SET(CPACK_GENERATOR NSIS ZIP)
else(WIN32 AND NOT UNIX)
	SET(CPACK_STRIP_FILES "bin/dca_typ")
	SET(CPACK_SOURCE_STRIP_FILES "")

	SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Stefan Seemayer")
	SET(CPACK_DEBIAN_PACKAGE_SECTION "science")

	SET(CPACK_RPM_PACKAGE_LICENSE "GPLv3+")
	SET(CPACK_RPM_PACKAGE_GROUP "Application/Engineering")

	SET(CPACK_GENERATOR DEB RPM)
	SET(CPACK_SOURCE_GENERATOR TGZ)

	SET(CPACK_SOURCE_IGNORE_FILES "_CPack_Packages" ".git" ".mat" "bin" "CMakeFiles" ".zip" ".tar.gz" ".rpm" ".deb" ".swp" "CMakeCache.txt" "CPackSourceConfig.cmake" "CPackConfig.cmake" "cmake_install.cmake" "install_manifest.txt" ".pyc")
endif(WIN32 AND NOT UNIX)
set(CPACK_PACKAGE_EXECUTABLES "CCMpred" "CCMpred")
include(CPack)

