cmake_minimum_required(VERSION 2.8)

project(Minerva)

message(STATUS "cmake generator: ${CMAKE_GENERATOR}")
message(STATUS "cmake build tool: ${CMAKE_BUILD_TOOL}")
message(STATUS "cmake build type: ${CMAKE_BUILD_TYPE}")

set(COMPILER_FLAGS "-Wall -g -pthread -m64 -fPIC")
set(GENERAL_FLAGS_DEBUG "${COMPILER_FLAGS} -O0 -march=native")
set(GENERAL_FLAGS_RELEASE "${COMPILER_FLAGS} -O2 -march=native -mtune=native -mssse3 -ftree-vectorize -funswitch-loops -ftree-vectorizer-verbose=0 -DNDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "${GENERAL_FLAGS_DEBUG} -std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "${GENERAL_FLAGS_RELEASE} -std=c++11")

string(REPLACE "," ";" EXTERNAL_LIB_PATH "${EXTERN_LIB_PATH}")
string(REPLACE "," ";" EXTERNAL_INCLUDE_PATH "${EXTERN_INCLUDE_PATH}")

set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT})

if (NOT DISABLE_CUDA)
  find_package(CUDA)
  if (CUDA_FOUND)
    message(STATUS "Compiling with CUDA support")
    if (CUDA_VERSION_MAJOR LESS 6)
      message(FATAL_ERROR "Need CUDA 6 for uniform addressing")
    endif (CUDA_VERSION_MAJOR LESS 6)
    include_directories(SYSTEM ${CUDA_INCLUDE_DIRS})
    add_definitions(-DHAS_CUDA)
    string(REPLACE " " "\\\",\\\"" CUDA_CONCAT_DEBUG "${GENERAL_FLAGS_DEBUG}")
    string(REPLACE " " "\\\",\\\"" CUDA_CONCAT_RELEASE "${GENERAL_FLAGS_RELEASE}")
    set(CUDA_PROPAGATE_HOST_FLAGS OFF)
    set(CUDA_NVCC_FLAGS_DEBUG "-G -Xcompiler \\\"${CUDA_CONCAT_DEBUG}\\\"")
    set(CUDA_NVCC_FLAGS_RELEASE "-Xcompiler \\\"${CUDA_CONCAT_RELEASE}\\\"")
    set(CUDA_NVCC_FLAGS "-arch sm_35")
  endif (CUDA_FOUND)
else ()
  message(STATUS "CUDA disabled by user")
endif()

if (NOT DISABLE_PS)
  message(STATUS "Compiling with PS support")
  add_definitions(-DHAS_PS)
else (NOT DISABLE_PS)
  message(STATUS "PS support disabled")
endif (NOT DISABLE_PS)

include_directories(
  SYSTEM ${EXTERNAL_INCLUDE_PATH}
)

link_directories(
  ${LIBRARY_OUTPUT_PATH}
  ${EXTERNAL_LIB_PATH}
)

include(ExternalProject)

add_subdirectory(minerva)
add_subdirectory(apps)
add_subdirectory(owl)
add_subdirectory(tests)