# ------------------------------------------------------------------------------
#       File: aidge_core/CMakeLists.txt
# ------------------------------------------------------------------------------
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
  message(FATAL_ERROR "In-source builds are not allowed")
endif()

cmake_minimum_required(VERSION 3.22)

file(STRINGS "project_name.txt" _name)
project(${_name}
        DESCRIPTION "An Aidge's export."
        HOMEPAGE_URL "https://gitlab.eclipse.org/eclipse/aidge/aidge"
        LANGUAGES CXX)


option(BUILD_STANDALONE "Build a standalone executable" ${PROJECT_IS_TOP_LEVEL})


# ------------------------------------------------------------------------------
#       SCRIPT VARIABLES
# ------------------------------------------------------------------------------
set(AIDGE_MODULE_NAME 		export)


# ------------------------------------------------------------------------------
#       Aidge - CMake Kit
# ------------------------------------------------------------------------------
include(cmake/ack.cmake)
aidge_setup_options() 
aidge_setup_project() # Set: C++14, project's version from version.txt, etc.


# ------------------------------------------------------------------------------
#       C++ TARGET
# ------------------------------------------------------------------------------
file(GLOB_RECURSE public_headers CONFIGURE_DEPENDS "include/*.hpp")
file(GLOB_RECURSE source_files   CONFIGURE_DEPENDS "src/*.cpp")

add_library(${AIDGE_TARGET_CPP} ${source_files} ${public_headers})
add_library(${AIDGE_NAMESPACE_NAME}::${AIDGE_MODULE_NAME} ALIAS ${AIDGE_TARGET_CPP})

target_link_libraries(${AIDGE_TARGET_CPP} PRIVATE $<BUILD_INTERFACE:ack::vars>)
target_link_libraries(${AIDGE_TARGET_CPP} PRIVATE $<BUILD_INTERFACE:Aidge::warnings>)
# $<BUILD_INTERFACE> is used for these targets as they don't need to be installed.

target_include_directories(${AIDGE_TARGET_CPP} ${AIDGE_WARNING_GUARD} PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include/${AIDGE_TARGET_CPP}>
)

set_target_properties(${AIDGE_TARGET_CPP} PROPERTIES POSITION_INDEPENDENT_CODE ON)

aidge_sanitize_target(${AIDGE_TARGET_CPP})


# ------------------------------------------------------------------------------
#       PYTHON TARGET
# ------------------------------------------------------------------------------
if (AIDGE_BUILD_PYTHON)
  aidge_python_binding()
endif()


# ------------------------------------------------------------------------------
#       C++ DEPENDENCIES (/!\ specific to core)
# ------------------------------------------------------------------------------
find_package(aidge_core REQUIRED)
list(APPEND AIDGE_MODULE_DEPS aidge_core)
target_link_libraries(${AIDGE_TARGET_CPP} PUBLIC Aidge::core)

# Example if you want to add aidge_backend_cpu as dependency to your export
# find_package(aidge_backend_cpu REQUIRED)
# list(APPEND AIDGE_MODULE_DEPS aidge_backend_cpu)
# target_link_libraries(${AIDGE_TARGET_CPP} PUBLIC Aidge::backend_cpu)


# ------------------------------------------------------------------------------
#       INSTALLATION
# ------------------------------------------------------------------------------
if(NOT CMAKE_SKIP_INSTALL_RULES)
  install(TARGETS ${AIDGE_TARGET_CPP} EXPORT ${AIDGE_MODULE_NAME}-targets)

  # Install export set (*-target*.cmake)
  install(
        EXPORT ${AIDGE_MODULE_NAME}-targets
        NAMESPACE Export::
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
  )

  install(
      DIRECTORY 
        "${CMAKE_CURRENT_SOURCE_DIR}/include/" # Public headers
      DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${AIDGE_TARGET_CPP}"
  )

  # Set a variable called `ACK_FIND_DEPENDENCIES`.
  # Put this inside your `-config.cmake.in` to inject required `find_dependency(...)` calls.
  ack_set_config_vars(DEPENDENCIES "${AIDGE_MODULE_DEPS}")

  configure_package_config_file(
        "${CMAKE_CURRENT_SOURCE_DIR}/config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
        INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
        NO_CHECK_REQUIRED_COMPONENTS_MACRO # No components
  )

  write_basic_package_version_file(
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
        VERSION ${PROJECT_VERSION}
        COMPATIBILITY AnyNewerVersion
  )

  install(
        FILES 
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
  )

  # Install python shared object
  if(TARGET ${AIDGE_TARGET_PYTHON})
    install(TARGETS ${AIDGE_TARGET_PYTHON} DESTINATION ${PROJECT_NAME})
  endif()
endif()


if(BUILD_STANDALONE)
  add_executable(main main.cpp)
  target_link_libraries(main PRIVATE ${AIDGE_TARGET_CPP})

  if(AIDGE_BUILD_PYTHON)
    target_link_libraries(main PRIVATE pybind11::embed)
  endif()
endif()

