cmake_minimum_required(VERSION 3.16)
project(GraphCore VERSION 0.2.0 LANGUAGES CXX)
option(GRAPHCORE_BUILD_TESTS "Build tests" ON)
option(GRAPHCORE_BUILD_EXAMPLES "Build examples" ON)
option(GRAPHCORE_BUILD_PYTHON "Build C ABI shared library for Python" ON)
set(GRAPHCORE_PYTHON_PACKAGE_DIR "" CACHE STRING "Install the shared library inside this Python package directory")
add_library(graphcore STATIC src/graphcore.cpp)
add_library(GraphCore::graphcore ALIAS graphcore)
target_compile_features(graphcore PUBLIC cxx_std_17)
target_include_directories(graphcore PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>)
set_target_properties(graphcore PROPERTIES POSITION_INDEPENDENT_CODE ON)
if(GRAPHCORE_BUILD_PYTHON)
  add_library(graphcore_shared SHARED src/c_api.cpp)
  target_link_libraries(graphcore_shared PRIVATE graphcore)
  target_compile_definitions(graphcore_shared PRIVATE GRAPHCORE_BUILD_SHARED)
  set_target_properties(graphcore_shared PROPERTIES OUTPUT_NAME graphcore ARCHIVE_OUTPUT_NAME graphcore_c)
endif()
if(GRAPHCORE_BUILD_EXAMPLES)
  add_executable(graphcore_demo examples/approval.cpp)
  target_link_libraries(graphcore_demo PRIVATE graphcore)
endif()
if(GRAPHCORE_BUILD_TESTS)
  enable_testing()
  add_executable(graphcore_tests tests/core_tests.cpp)
  target_link_libraries(graphcore_tests PRIVATE graphcore)
  add_test(NAME core COMMAND graphcore_tests)
  if(GRAPHCORE_BUILD_PYTHON)
    find_package(Python3 COMPONENTS Interpreter QUIET)
    if(Python3_FOUND)
      add_test(NAME python COMMAND ${CMAKE_COMMAND} -E env
        "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/python"
        "GRAPHCORE_LIBRARY=$<TARGET_FILE:graphcore_shared>"
        ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_python.py)
    endif()
  endif()
endif()
include(GNUInstallDirs)
install(TARGETS graphcore EXPORT GraphCoreTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
if(GRAPHCORE_BUILD_PYTHON)
  if(GRAPHCORE_PYTHON_PACKAGE_DIR)
    set(GRAPHCORE_SHARED_INSTALL_DIR ${GRAPHCORE_PYTHON_PACKAGE_DIR})
  else()
    set(GRAPHCORE_SHARED_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR})
  endif()
  install(TARGETS graphcore_shared
    LIBRARY DESTINATION ${GRAPHCORE_SHARED_INSTALL_DIR}
    RUNTIME DESTINATION ${GRAPHCORE_SHARED_INSTALL_DIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT GraphCoreTargets NAMESPACE GraphCore:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GraphCore)
include(CMakePackageConfigHelpers)
configure_package_config_file(cmake/GraphCoreConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/GraphCoreConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GraphCore)
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/GraphCoreConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/GraphCoreConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/GraphCoreConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GraphCore)
