Files
plotter/adapters/imgui/CMakeLists.txt
T

64 lines
3.2 KiB
CMake

# The Dear ImGui adapter: a widget that draws a plot into a child region of the
# framebuffer ImGui is rendering its own chrome into, and feeds that plot
# ImGui's mouse and keyboard state.
#
# ImGui is not a packaging dependency here: it is fetched pinned to a release
# tag (never a branch, so a build is reproducible) and only the sources this
# adapter needs are compiled -- the core plus the GLFW and OpenGL 3 backends.
# The fetched sources are third-party code: they are not held to this project's
# warning set, and the adapter and its example are.
include(FetchContent)
FetchContent_Declare(imgui
GIT_REPOSITORY https://github.com/ocornut/imgui.git
GIT_TAG v1.91.9b
GIT_SHALLOW TRUE)
# imgui has no top-level CMakeLists.txt, so MakeAvailable populates it and stops;
# the sources are added to the target below by name.
FetchContent_MakeAvailable(imgui)
if(NOT imgui_SOURCE_DIR OR NOT EXISTS "${imgui_SOURCE_DIR}/imgui.cpp")
message(FATAL_ERROR
"plot: the Dear ImGui sources for tag v1.91.9b are missing from "
"'${imgui_SOURCE_DIR}'. The FetchContent clone failed, so PLOT_BUILD_IMGUI "
"cannot link anything; either restore network access or pre-populate the "
"source with -DFETCHCONTENT_SOURCE_DIR_IMGUI=<path>.")
endif()
add_library(imgui STATIC
"${imgui_SOURCE_DIR}/imgui.cpp"
"${imgui_SOURCE_DIR}/imgui_draw.cpp"
"${imgui_SOURCE_DIR}/imgui_tables.cpp"
"${imgui_SOURCE_DIR}/imgui_widgets.cpp"
"${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp"
"${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp")
# Both include roots are public: a consumer of the backends -- the adapter and
# the example -- reaches them as <imgui.h> and <backends/imgui_impl_glfw.h>.
target_include_directories(imgui PUBLIC
"${imgui_SOURCE_DIR}"
"${imgui_SOURCE_DIR}/backends")
# imgui_impl_glfw.cpp needs GLFW; a build that also enables the GLFW adapter
# gets the same target, never a second copy.
plot_find_glfw(plot_imgui_glfw_dep)
target_link_libraries(imgui PUBLIC ${plot_imgui_glfw_dep})
target_compile_features(imgui PUBLIC cxx_std_20)
add_library(plot_imgui STATIC imgui_plot.cpp)
add_library(plot::imgui ALIAS plot_imgui)
# The public include root is `adapters/`, so the header is reached as
# <imgui/imgui_plot.hpp> -- the toolkit's name first, like every other adapter's.
target_include_directories(plot_imgui PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
# ImGui stays PRIVATE: the adapter's header includes no ImGui header, so a
# consumer of plot::imgui does not inherit the toolkit's headers.
target_link_libraries(plot_imgui PUBLIC plot::core PRIVATE imgui ${plot_imgui_glfw_dep})
plot_apply_warnings(plot_imgui)
# Not installed and not exported, and not because of a discovery fallback: ImGui
# is *always* fetched here, so there is no ImGui package for an installed config
# file to find. Exporting plot::imgui would name the fetched `imgui` target in its
# link interface and leave every consumer of `find_package(plot)` unable to
# configure -- so plot::imgui is a build-tree target only, and a consumer that
# wants it adds the adapter's source or fetches the same pinned tag itself.
plot_record_adapter_export(plot_imgui FALSE
"ImGui is supplied by FetchContent, so find_package(plot) cannot promise it to a consumer" "")