cmake_minimum_required(VERSION 3.16)
project(DeriWeaveConsumer LANGUAGES CXX)

# La cible DeriWeave doit transmettre C++20 et toutes ses dependances.
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(CTest)
option(DERIWEAVE_CONSUMER_CHECK_HEADERS "Compile each public header in isolation" ON)
set(DERIWEAVE_REQUIRED_VERSION "0.1.0" CACHE STRING "Required installed DeriWeave version")

if(DERIWEAVE_SOURCE_DIR)
    add_subdirectory("${DERIWEAVE_SOURCE_DIR}" deriweave-build)
    if(TARGET quick_start OR TARGET pricer_tests OR TARGET heston_reference)
        message(FATAL_ERROR "Embedding DeriWeave must not build development targets by default")
    endif()
    set(DeriWeave_INCLUDE_DIR "${DERIWEAVE_SOURCE_DIR}/include")
else()
    find_package(DeriWeave ${DERIWEAVE_REQUIRED_VERSION} EXACT CONFIG REQUIRED)
endif()

add_library(consumer_shared SHARED shared.cpp)
target_link_libraries(consumer_shared PRIVATE DeriWeave::deriweave_core)
set_target_properties(consumer_shared PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
add_executable(consumer main.cpp)
target_link_libraries(consumer PRIVATE DeriWeave::deriweave_core consumer_shared)
add_test(NAME consumer_pricing COMMAND consumer)

if(DERIWEAVE_CONSUMER_CHECK_HEADERS)
    file(GLOB_RECURSE _headers RELATIVE "${DeriWeave_INCLUDE_DIR}" "${DeriWeave_INCLUDE_DIR}/*.hpp")
    if(NOT _headers)
        message(FATAL_ERROR "No public DeriWeave headers found")
    endif()
    set(_header_sources)
    foreach(_header IN LISTS _headers)
        string(MAKE_C_IDENTIFIER "${_header}" _name)
        set(_file "${CMAKE_CURRENT_BINARY_DIR}/headers/${_name}.cpp")
        file(WRITE "${_file}" "#include \"${_header}\"\n")
        list(APPEND _header_sources "${_file}")
    endforeach()
    add_library(consumer_public_headers OBJECT ${_header_sources})
    target_link_libraries(consumer_public_headers PRIVATE DeriWeave::deriweave_core)
endif()
