cmake_minimum_required(VERSION 3.5)
  
project(cnorxz)

# LIB VERSION

set(V_MAJOR 0)
set(V_MINOR 0)
set(V_PATCH 0)
set(VERSION "${V_MAJOR}.${V_MINOR}.${V_PATCH}")

# OPTIONS

option(SCALAR_BUILD "" OFF)

# INCLUDES

include(cmake/check_avx.cmake)

# GIT VARIABLES

execute_process(COMMAND bash "-c" "git rev-parse HEAD" OUTPUT_VARIABLE GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
execute_process(COMMAND bash "-c" "git rev-parse --abbrev-ref HEAD" OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})

# BUILD VERSION STRING

message(STATUS "git hash = ${GIT_HASH}")
message(STATUS "git branch = ${GIT_BRANCH}")
if(NOT ("${GIT_BRANCH}" EQUAL "release"))
  string(SUBSTRING ${GIT_HASH} 0 7 GIT_HASH_SHORT)
  set(VERSION "${VERSION}-${GIT_BRANCH}-${GIT_HASH_SHORT}")
endif()
message(STATUS "version = ${VERSION}")

# CHECK COMPILER

if(CMAKE_COMPILER_IS_GNUCXX)
  if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.0)
    message(FATAL_ERROR "require gcc version >= 7.0")
  endif()
else()
  message(WARNING "compiler ${CMAKE_CXX_COMPILER_ID} officially not supported")
endif()

# FLAGS

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++17 -Wpedantic -O2 -march=native -faligned-new -funroll-loops -fopenmp")

# TESTING

if(DEFINED ENABLE_TESTS)
  set(ENABLE_TESTS ${ENABLE_hdf5} CACHE BOOL "enable tests")
else()
  set(ENABLE_TESTS TRUE CACHE BOOL "enable tests")
endif()

if(ENABLE_TESTS)
  enable_testing()
endif()

# INSTALL PATH

if(IS_ABSOLUTE "${CMAKE_INSTALL_PREFIX}")
  set(INSTALL_PATH ${CMAKE_INSTALL_PREFIX})
else()
  #set(INSTALL_PATH ${CMAKE_SOURCE_DIR}/install)
  get_filename_component(INSTALL_PATH ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX} ABSOLUTE)
endif()
message(STATUS "found absolute install path '${INSTALL_PATH}'") 

# SCALAR / INTRINSICS

if(NOT ${SCALAR_BUILD})
  message(STATUS "check for intrinsics")
  check_avx()
  if(AVX_AVAIL)
    message(STATUS "AVX available")
    add_definitions("-DCXZ_HAVE_AVX")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx")
  else()
    message(STATUS "AVX not available")
  endif()
endif()

# CHECK LIBRARIES
message(STATUS "check for libraries")

if(ENABLE_TESTS)
  # CHECK LIBRARIES : GTest
  find_package( GTest REQUIRED )
  if(GTest_FOUND)
    include_directories(${GTEST_INCLUDE_DIRS})
  else()
    message(FATAL_ERROR "GTest not found")
  endif()

  # CHECK LIBRARIES : Threads

  find_package(Threads REQUIRED)
  if(Threads_FOUND)
    #include_directories(${Threads_INCLUDE_DIRS})
  else()
    message(FATAL_ERROR "Threads not found")
  endif()
endif()

# CHECK LIBRARIES : hdf5

if(DEFINED ENABLE_hdf5)
  set(ENABLE_hdf5 ${ENABLE_hdf5} CACHE BOOL "enable hdf5")
else()
  set(ENABLE_hdf5 TRUE CACHE BOOL "enable hdf5")
endif()

# CHECK LIBRARIES : cereal

if(DEFINED ENABLE_cereal)
  set(ENABLE_cereal ${ENABLE_cereal} CACHE BOOL "enable cereal")
else()
  set(ENABLE_cereal TRUE CACHE BOOL "enable cereal")
endif()

find_package(cereal QUIET)
if(cereal_FOUND)
  message(STATUS "found cereal")
  if(ENABLE_cereal)
    message(STATUS "enable cereal")
    add_definitions(-DHAVE_CEREAL)
  endif()
else()
  message(STATUS "no cereal")
  if(ENABLE_cereal)
    message(FATAL_ERROR "cereal has been enabled but the cereal library has not been found")
  endif()
endif()

# CHECK LIBRARIES : mpi

if(DEFINED ENABLE_mpi)
  set(ENABLE_mpi ${ENABLE_mpi} CACHE BOOL "enable mpi")
else()
  set(ENABLE_mpi TRUE CACHE BOOL "enable mpi")
endif()

# DEFINES

add_definitions(-DVERSION="${VERSION}")
add_definitions(-DGIT_COMMIT="${GIT_HASH}")
add_definitions(-DCXX_FLAGS="${CMAKE_CXX_FLAGS}")

# CONTINUE WITH SUB-DIRECTORIES

add_subdirectory(src)