file(GLOB_RECURSE _oscar_demo_sources "*.cpp")
list(FILTER _oscar_demo_sources EXCLUDE REGEX "tests")
add_library(oscar_demos STATIC ${_oscar_demo_sources})
unset(_oscar_demo_sources)

target_compile_features(oscar_demos PUBLIC cxx_std_23)
set_target_properties(oscar_demos PROPERTIES
    CXX_STANDARD_REQUIRED     ON
    CXX_EXTENSIONS            OFF
)
if(OPYN_BUILD_PYTHON_BINDINGS)
    set_target_properties(oscar_demos PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif()
if(OPYN_USE_STRICT_COMPILER_FLAGS)
    include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/opynsim_strict_compiler_options.cmake)
    opyn_add_strict_compiler_options_to(oscar_demos)
endif()
target_include_directories(oscar_demos PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>  # so that `#include "liboscar-demos/HEADER.h"` works
    $<INSTALL_INTERFACE:include>                       # because all headers are installed into `liboscar-demos/`
)
target_link_libraries(oscar_demos PUBLIC oscar)

if(BUILD_TESTING)
    add_subdirectory(tests)
endif()

# Handle installation
if(TRUE)
    include(GNUInstallDirs)             # `CMAKE_INSTALL_LIBDIR`, `CMAKE_INSTALL_INCLUDEDIR`
    include(CMakePackageConfigHelpers)  # `configure_package_config_file`

    # Install resources to the runtime resources directory
    install(
        DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/resources/oscar_demos"
        DESTINATION "resources"
        COMPONENT opynsim-cpp
    )

    # Install all of `liboscar-demos`'s header files to `include/liboscar-demos`
    install(
        DIRECTORY   "${CMAKE_CURRENT_SOURCE_DIR}/"
        DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/liboscar-demos"
        COMPONENT   opynsim-cpp
        FILES_MATCHING PATTERN "*.h"
        PATTERN "tests" EXCLUDE
    )

    # Install `liboscar-demos` target
    install(
        TARGETS oscar_demos
        EXPORT oscar_demosTargets
        COMPONENT opynsim-cpp
    )
    install(
        EXPORT oscar_demosTargets
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/oscar_demos"
        COMPONENT opynsim-cpp
    )

    # Generate + install an `oscarConfig.cmake` file (it's what `find_package` looks for)
    configure_package_config_file(
        "${CMAKE_CURRENT_SOURCE_DIR}/oscar_demosConfig.cmake.in"
        "${CMAKE_CURRENT_BINARY_DIR}/generated/oscar_demosConfig.cmake"
        INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/oscar_demos"
    )
    install(
        FILES       "${CMAKE_CURRENT_BINARY_DIR}/generated/oscar_demosConfig.cmake"
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/oscar_demos"
        COMPONENT   opynsim-cpp
    )
endif()
