cmake_minimum_required(VERSION 3.10)
project(sparc)

# control where the static and shared libraries are built so that on windows
# we don't need to tinker with the path to run the executable
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

#find_package(OpenMP)
#if(OpenMP_CXX_FOUND)
#    target_link_libraries(sparc PUBLIC OpenMP::OpenMP_CXX)
#endif()

option(BUILD_SHARED_LIBS "Build using shared libraries" ON)

# the version number.
set(sparc_VERSION_MAJOR 3)
set(sparc_VERSION_MINOR 2)

if(APPLE)
  set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
elseif(UNIX)
  set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
endif()

# configure a header file to pass the version number only
configure_file(
  "${PROJECT_SOURCE_DIR}/sparcConfig.h.in"
  "${PROJECT_BINARY_DIR}/sparcConfig.h"
  )

# Note the use of the variable EXTRA_LIBS to collect up any optional libraries
# to later be linked into the executable. The variable EXTRA_INCLUDES is used
# similarly for optional header files. 
get_filename_component(PARENT_DIR ../ ABSOLUTE)
list(APPEND EXTRA_LIBS Sprs Sarp Starc Omc Chn Vsi Tools Alex Psed Gsmo
	Hat Aln Gsq Blst Tax Pdb Afn Mgs conjugrad ccmpred Darc Sprc dca_typ cjgd)

# Psed Gsmo Hat

list(APPEND EXTRA_INCLUDES 
	"${PARENT_DIR}/lib/libafn"
	"${PARENT_DIR}/lib/libgsq" 
	"${PARENT_DIR}/lib/libaln" 
	"${PARENT_DIR}/lib/libblst" 
	"${PARENT_DIR}/lib/libtax" 
	"${PARENT_DIR}/lib/libhat" 
	"${PARENT_DIR}/lib/libalex" 
	"${PARENT_DIR}/lib/libtools" 
	"${PARENT_DIR}/lib/libpdb" 
	"${PARENT_DIR}/lib/libhpt" 
	"${PARENT_DIR}/lib/libchn" 
	"${PARENT_DIR}/lib/libvsi" 
	"${PARENT_DIR}/lib/libomc" 
	"${PARENT_DIR}/lib/libsarp" 
	"${PARENT_DIR}/lib/libpsed" 
	"${PARENT_DIR}/lib/libstarc" 
	"${PARENT_DIR}/lib/libgsmo" 
	"${PARENT_DIR}/lib/libccmpred" 
	"${PARENT_DIR}/lib/libccmpred/libconjugrad" 
	"${PARENT_DIR}/lib/libsprs" 
	"${PARENT_DIR}/lib/libdarc" 
	"${PARENT_DIR}/lib/libsprc" 
	"${PARENT_DIR}/lib/libdca" 
	"${PARENT_DIR}/lib/libdca/libcjgd" 
	"${PARENT_DIR}/lib/include" 
	)

# add the executable
add_executable(sparc run_sparc.cxx)
target_link_libraries(sparc ${EXTRA_LIBS} )
include_directories(${PARENT_DIR}/lib/include  ${EXTRA_INCLUDES})

# add the binary tree to the search path for include files
# so that we will find sparcConfig.h
#target_include_directories(sparc PRIVATE "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} )
target_include_directories(sparc PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} )

# add the install targets
#install(TARGETS sparc DESTINATION bin)
#install(FILES "${PROJECT_BINARY_DIR}/sparcConfig.h"
#  DESTINATION include
#  )

# Compile with OpenMP if available
if(WITH_OMP)
        find_package(OpenMP)
endif(WITH_OMP)
if(OPENMP_FOUND)
#        list(APPEND SOURCES evaluate_cpu_omp.c)
        add_definitions("-DOPENMP")
endif(OPENMP_FOUND)

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

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

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

# Compile with CUDA if we can find the SDK
if(WITH_CUDA)
	find_package(CUDA)
endif(WITH_CUDA)
if(CUDA_FOUND)
        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)
	set(CMAKE_CUDA_FLAGS ${CMAKE_NVCC_FLAGS} --ccbin $(CMAKE_CXX_COMPILER))
        set_target_properties(sparc PROPERTIES CUDA_SEPERABLE_COMPILATION ON)
endif(CUDA_FOUND)

