cmake_minimum_required (VERSION 3.8)
include(CheckLanguage)

project (CCMpred)
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}/libconjugrad/CMakeLists.txt")
	message(FATAL_ERROR "CCMpred is missing the libconjugrad 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(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}/libconjugrad")

# 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 ccmpred.c sequence.c util.c io.c evaluate_cpu.c parseopt.c reweighting.c numdif.c )


# 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 evaluate_cpu_omp.c)
	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 evaluate_cuda.c evaluate_cuda_kernels.cu)
endif(WITH_CUDA)

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

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

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

if(UNIX)
	target_link_libraries(ccmpred m)
endif(UNIX)


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

# compile libConjuGrad
add_subdirectory(libconjugrad)
target_link_libraries(ccmpred conjugrad)


install(TARGETS ccmpred 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  "ccmpred ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "ccmpred-${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/ccmpred")
	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)

