cmake_minimum_required(VERSION 2.8)

if(POLICY CMP0060)
  cmake_policy(SET CMP0060 NEW)
endif(POLICY CMP0060)
if(POLICY CMP0065)
  cmake_policy(SET CMP0065 NEW)
endif(POLICY CMP0065)

project(model_neuron)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

include(CheckCXXCompilerFlag)
set(MY_CXX_FLAGS -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable)
foreach(FLAG ${MY_CXX_FLAGS})
    unset(CUR_FLAG_SUPPORTED CACHE)
    CHECK_CXX_COMPILER_FLAG(${FLAG} CUR_FLAG_SUPPORTED)
    if(${CUR_FLAG_SUPPORTED})
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
    endif()
endforeach(FLAG)

find_package(Amici HINTS ${CMAKE_CURRENT_LIST_DIR}/../../build)

set(MODEL_DIR ${CMAKE_CURRENT_LIST_DIR})

set(SRC_LIST_LIB ${MODEL_DIR}/model_neuron_J.cpp
${MODEL_DIR}/model_neuron_JB.cpp
${MODEL_DIR}/model_neuron_JDiag.cpp
${MODEL_DIR}/model_neuron_JSparse.cpp
${MODEL_DIR}/model_neuron_JSparseB.cpp
${MODEL_DIR}/model_neuron_Jrz.cpp
${MODEL_DIR}/model_neuron_Jy.cpp
${MODEL_DIR}/model_neuron_Jz.cpp
${MODEL_DIR}/model_neuron_dJrzdsigma.cpp
${MODEL_DIR}/model_neuron_dJrzdz.cpp
${MODEL_DIR}/model_neuron_dJydsigma.cpp
${MODEL_DIR}/model_neuron_dJydy.cpp
${MODEL_DIR}/model_neuron_dJzdsigma.cpp
${MODEL_DIR}/model_neuron_dJzdz.cpp
${MODEL_DIR}/model_neuron_deltaqB.cpp
${MODEL_DIR}/model_neuron_deltasx.cpp
${MODEL_DIR}/model_neuron_deltax.cpp
${MODEL_DIR}/model_neuron_deltaxB.cpp
${MODEL_DIR}/model_neuron_drzdx.cpp
${MODEL_DIR}/model_neuron_dxdotdp.cpp
${MODEL_DIR}/model_neuron_dydx.cpp
${MODEL_DIR}/model_neuron_dzdx.cpp
${MODEL_DIR}/model_neuron_root.cpp
${MODEL_DIR}/model_neuron_rz.cpp
${MODEL_DIR}/model_neuron_sigmay.cpp
${MODEL_DIR}/model_neuron_sigmaz.cpp
${MODEL_DIR}/model_neuron_srz.cpp
${MODEL_DIR}/model_neuron_stau.cpp
${MODEL_DIR}/model_neuron_sx0.cpp
${MODEL_DIR}/model_neuron_sz.cpp
${MODEL_DIR}/model_neuron_x0.cpp
${MODEL_DIR}/model_neuron_xdot.cpp
${MODEL_DIR}/model_neuron_y.cpp
${MODEL_DIR}/model_neuron_z.cpp

${MODEL_DIR}/wrapfunctions.cpp
)

add_library(${PROJECT_NAME} ${SRC_LIST_LIB})
add_library(model ALIAS ${PROJECT_NAME})

target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")

target_link_libraries(${PROJECT_NAME}
    PUBLIC Upstream::amici
)

set(SRC_LIST_EXE main.cpp)

add_executable(simulate_${PROJECT_NAME} ${SRC_LIST_EXE})

target_link_libraries(simulate_${PROJECT_NAME} ${PROJECT_NAME})

if($ENV{ENABLE_GCOV_COVERAGE})
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 --coverage")
endif()

## SWIG
option(ENABLE_SWIG "Build swig/python library?" ON)
if(ENABLE_SWIG)
    if(NOT(${CMAKE_VERSION} VERSION_LESS 3.8))
        add_subdirectory(swig)
    else()
        message(WARNING "Unable to build SWIG interface, upgrade CMake to >=3.8.")
    endif()
endif()


# <Export cmake configuration>
include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
    ARCHIVE  DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY  DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME  DESTINATION ${CMAKE_INSTALL_BINDIR}
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
export(EXPORT ${PROJECT_NAME}Targets FILE ${PROJECT_NAME}Config.cmake
    NAMESPACE Upstream::
    )
# </Export cmake configuration>

