# SPDX-License-Identifier: BSD-3-Clause
# Ernie's demos, by category: demos/<category>/demo_<category>_<name>.cpp beside its .py, the
# same demo in each language (interop/ is Python only), named by that stem. Each C++ demo
# registers itself (ERNIE_REGISTER_DEMO), and their objects go into the `ernie` program and the
# Python module, whose Demos panels list them. With ERNIE_BUILD_DEMOS each is also a program of
# its own, named as its files.

file(GLOB ernie_demo_cpp CONFIGURE_DEPENDS
     "${CMAKE_CURRENT_SOURCE_DIR}/*/*.cpp")

# An object library: a static archive would drop the demos' objects, which nothing references
# but their registrations.
add_library(ernie_demos OBJECT util.cpp ${ernie_demo_cpp})
target_include_directories(ernie_demos
                           PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
# The data the demos read (LRO's ISDs), which the Python package ships
# as ernie/demos/data.
target_compile_definitions(
    ernie_demos
    PRIVATE
        ERNIE_DEMO_DATA_DIR="${PROJECT_SOURCE_DIR}/ernie/test/fixtures/isd"
)
target_link_libraries(ernie_demos PRIVATE ernie_app
                                          ernie_build_options)
set_target_properties(ernie_demos PROPERTIES POSITION_INDEPENDENT_CODE
                                             ON)

# libcurl, for the demos to fetch their data (curl.cmake); every target
# their objects go into links it.
include("${PROJECT_SOURCE_DIR}/cmake/third_party/curl.cmake")
set(ernie_demo_links)
if(TARGET ernie_curl)
    set(ernie_demo_links ernie_curl)
    target_link_libraries(ernie_demos PRIVATE ernie_curl)
endif()

target_sources(ernie_viewer PRIVATE $<TARGET_OBJECTS:ernie_demos>)
target_link_libraries(ernie_viewer PRIVATE ${ernie_demo_links})
if(TARGET _ernie)
    target_sources(_ernie PRIVATE $<TARGET_OBJECTS:ernie_demos>)
    target_link_libraries(_ernie PRIVATE ${ernie_demo_links})
endif()

if(ERNIE_BUILD_DEMOS)
    foreach(source ${ernie_demo_cpp})
        get_filename_component(name "${source}" NAME_WE)
        get_filename_component(directory "${source}" DIRECTORY)
        get_filename_component(category "${directory}" NAME)
        # The demo's id and program: its file's stem,
        # demo_<category>_<name> (a file of the former <name> form
        # gets the prefix).
        if(name MATCHES "^demo_${category}_")
            set(program "${name}")
        else()
            set(program "demo_${category}_${name}")
        endif()
        add_executable(${program} main.cpp
                                  $<TARGET_OBJECTS:ernie_demos>)
        target_compile_definitions(${program}
                                   PRIVATE ERNIE_DEMO_ID="${program}")
        target_link_libraries(
            ${program} PRIVATE ernie_app ernie_build_options
                               ${ernie_demo_links})
        if(ERNIE_INSTALL)
            install(TARGETS ${program}
                    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
                            COMPONENT demos)
        endif()
    endforeach()
endif()
