cmake_minimum_required(VERSION 2.8)
project(libconjugrad)

set(LIBCONJUGRAD_MAJOR_VERSION 0)
set(LIBCONJUGRAD_MINOR_VERSION 0)
set(LIBCONJUGRAD_PATCH_VERSION 3)
set(LIBCONJUGRAD_VERSION ${LIBCONJUGRAD_MAJOR_VERSION}.${LIBCONJUGRAD_MINOR_VERSION}.${LIBCONJUGRAD_PATCH_VERSION})

if(CMAKE_VERSION VERSION_GREATER 2.8.11)
	cmake_policy(SET CMP0022 OLD)
endif(CMAKE_VERSION VERSION_GREATER 2.8.11)

set(CMAKE_C_FLAGS "-std=c99 -O3 -g -lm")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

include_directories("${PROJECT_SOURCE_DIR}/include")

set(SOURCES src/conjugrad.c src/debug.c)

if(NOT DEFINED WITH_SIMD)
	set(WITH_SIMD ansi)
endif(NOT DEFINED WITH_SIMD)

if(NOT DEFINED WITH_CUDA)
	set(WITH_CUDA ON)
endif(NOT DEFINED WITH_CUDA)

if(WITH_SIMD STREQUAL ansi)
	add_definitions(-DCONJUGRAD_SIMD=0)
	list(APPEND SOURCES src/arithmetic_ansi.c)
elseif(WITH_SIMD STREQUAL sse)
	add_definitions(-DCONJUGRAD_SIMD=1)
	list(APPEND SOURCES src/arithmetic_simd.c)
elseif(WITH_SIMD STREQUAL avx)
	add_definitions(-DCONJUGRAD_SIMD=2)
	list(APPEND SOURCES src/arithmetic_simd.c)
endif(WITH_SIMD STREQUAL ansi)

set(BUILD_SHARED_LIBS OFF)

if(WITH_CUDA)
	find_package(CUDA)
endif(WITH_CUDA)
if(CUDA_FOUND)
	#list(APPEND SOURCES src/conjugrad_cuda.c src/help_functions.cu src/conjugrad_kernels.cu)
	list(APPEND SOURCES src/conjugrad_cuda.c src/conjugrad_kernels.cu)
	set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS}; -rdc=true -Xptxas -v -lineinfo)
	include_directories(${CUDA_INCLUDE_DIRS})
	cuda_add_library(conjugrad ${SOURCES})
else(CUDA_FOUND)
	add_library(conjugrad ${SOURCES})
endif(CUDA_FOUND)

#add_library(conjugrad SHARED ${SOURCES})
#add_library(conjugrad ${SOURCES})
install(TARGETS conjugrad DESTINATION lib)

add_executable(rosenbrock EXCLUDE_FROM_ALL samples/rosenbrock.c)
target_link_libraries(rosenbrock conjugrad)

add_executable(polynomial EXCLUDE_FROM_ALL samples/polynomial.c)
target_link_libraries(polynomial conjugrad)

add_executable(sphere EXCLUDE_FROM_ALL samples/sphere.c)
target_link_libraries(sphere conjugrad)
