1
0
Fork 0
mirror of https://github.com/ocornut/imgui.git synced 2026-01-12 00:14:20 +00:00
imgui/examples/ImGuiModule.cmake
Konstantin Podsvirov b567ffe7e0 Add CMake project
Export Dear ImGui as CMake's ImGui package.

Options:
- ImGui_USER_CONFIG;
- ImGui_EXAMPLES;
- ImGui_BACKENDS;
- ImGui_MISC;
- ImGui_3RDPARTY;
- ImGui_OPENGL_LOADER;
- ImGui_FREETYPE;
- ImGui_TOOLS;
- ImGui_PACKAGE.

Export targets:
- ImGui::Core;
- ImGui::ImplGLUT;
- ImGui::ImplSDL2;
- ImGui::ImplSDLRenderer2;
- ImGui::ImplSDL3;
- ImGui::ImplSDLRenderer3;
- ImGui::ImplGlfw;
- ImGui::ImplOpenGL2;
- ImGui::ImplOpenGL3;
- ImGui::ImplVulkan;
- ImGui::FreeType;
- ImGui::StdLib;
- ImGui::BinaryToCompressedC.

Import targets from:
- build directory;
- installed package.

Examples:
- example_null;
- example_glut_opengl2
- example_sdl2_sdlrenderer2;
- example_sdl2_opengl2;
- example_sdl2_opengl3;
- example_sdl2_vulkan;
- example_sdl3_sdlrenderer3;
- example_sdl3_opengl3;
- example_sdl3_vulkan;
- example_glfw_opengl2;
- example_glfw_opengl3;
- example_glfw_vulkan.

Presets:
- vcpkg (require $env{VCPKG_ROOT});
- emscripten (inherits vcpkg and require $env{EMSCRIPTEN_ROOT}).
2025-06-25 21:37:37 +03:00

325 lines
14 KiB
CMake

if(NOT DEFINED ImGuiModule_CMAKE_INCLUDED)
set(ImGuiModule_CMAKE_INCLUDED 1)
else()
return()
endif()
if(CMAKE_VERSION VERSION_LESS 3.5)
include(CMakeParseArguments)
endif()
if(EXISTS "${ImGui_SRCDIR}" AND EXISTS "${ImGui_SRCDIR}/imgui.cpp")
set(ImGui TRUE)
else()
include(${CMAKE_CURRENT_LIST_DIR}/ImGuiOptions.cmake)
endif()
function(imgui_option OPTION DESCRIPTION DEFAULT)
if(ImGui)
cmake_parse_arguments(OPTION "STRING" "" "STRINGS" ${ARGN})
if(DEFINED OPTION_STRING)
set(ImGui_${OPTION} ${DEFAULT} CACHE STRING "${DESCRIPTION}")
elseif(DEFINED OPTION_STRINGS)
set(ImGui_${OPTION} ${DEFAULT} CACHE STRING "${DESCRIPTION}")
set_property(CACHE ImGui_${OPTION}
PROPERTY STRINGS "${OPTION_STRINGS}")
else()
option(ImGui_${OPTION} "${DESCRIPTION}" ${DEFAULT})
endif()
set(ImGui_${OPTION}_DESCRIPTION "${DESCRIPTION}")
set(ImGui_${OPTION}_DEFAULT ${DEFAULT})
list(APPEND ImGui_OPTIONS ${OPTION})
set(ImGui_OPTIONS "${ImGui_OPTIONS}" PARENT_SCOPE)
set(ImGui_${OPTION}_DESCRIPTION "${DESCRIPTION}" PARENT_SCOPE)
set(ImGui_OPTIONS_CMAKE)
foreach(OPTION ${ImGui_OPTIONS})
set(ImGui_OPTIONS_CMAKE "${ImGui_OPTIONS_CMAKE}# ${ImGui_${OPTION}_DESCRIPTION}\n")
set(ImGui_OPTIONS_CMAKE "${ImGui_OPTIONS_CMAKE}set(ImGui_${OPTION} ${ImGui_${OPTION}})\n")
endforeach()
set(ImGui_OPTIONS_CMAKE "${ImGui_OPTIONS_CMAKE}" PARENT_SCOPE)
endif()
endfunction()
function(imgui_export TARGET)
if(CMAKE_VERSION VERSION_LESS 3.3)
return()
endif()
export(TARGETS ${TARGET} NAMESPACE ImGui::
FILE ImGui${TARGET}.cmake)
install(TARGETS ${TARGET} EXPORT ${TARGET}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
install(EXPORT ${TARGET} NAMESPACE ImGui::
FILE ImGui${TARGET}.cmake
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/imgui)
endfunction()
function(imgui_core)
set(TARGET Core)
list(APPEND ImGui_SUPPORTED_COMPONENTS ${TARGET})
set(ImGui_SUPPORTED_COMPONENTS "${ImGui_SUPPORTED_COMPONENTS}" PARENT_SCOPE)
list(APPEND ImGui_AVAILABLE_COMPONENTS ${TARGET})
set(ImGui_AVAILABLE_COMPONENTS "${ImGui_AVAILABLE_COMPONENTS}" PARENT_SCOPE)
if(ImGui AND "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${ImGui_SRCDIR}/examples")
cmake_parse_arguments(TARGET "" "" "HEADERS;PRIVATE_HEADERS;SOURCES;SOURCES_GLOB;DEFINITIONS;LIBRARIES" ${ARGN})
add_library(${TARGET} INTERFACE)
include(GNUInstallDirs)
target_include_directories(${TARGET} INTERFACE
$<BUILD_INTERFACE:${ImGui_SRCDIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/imgui>)
foreach(HEADER ${TARGET_HEADERS})
target_sources(${TARGET}
INTERFACE
$<BUILD_INTERFACE:${ImGui_SRCDIR}/${HEADER}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/imgui/${HEADER}>)
install(FILES ${ImGui_SRCDIR}/${HEADER}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/imgui)
endforeach()
foreach(PRIVATE_HEADER ${TARGET_PRIVATE_HEADERS})
install(FILES ${ImGui_SRCDIR}/${PRIVATE_HEADER}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/imgui)
endforeach()
foreach(GLOB ${TARGET_SOURCES_GLOB})
file(GLOB TARGET_SOURCES_BY_GLOB
LIST_DIRECTORIES FALSE
RELATIVE "${ImGui_SRCDIR}"
"${ImGui_SRCDIR}/${GLOB}")
list(APPEND TARGET_SOURCES ${TARGET_SOURCES_BY_GLOB})
endforeach()
foreach(SOURCE ${TARGET_SOURCES})
target_sources(${TARGET}
INTERFACE
$<BUILD_INTERFACE:${ImGui_SRCDIR}/${SOURCE}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_DATAROOTDIR}/imgui/${SOURCE}>)
install(FILES ${ImGui_SRCDIR}/${SOURCE}
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/imgui)
endforeach()
foreach(DEFINITION ${TARGET_DEFINITIONS})
target_compile_definitions(${TARGET} INTERFACE ${DEFINITION})
endforeach()
foreach(LIBRARY ${TARGET_LIBRARIES})
target_link_libraries(${TARGET}
INTERFACE ${LIBRARY})
endforeach()
imgui_export(${TARGET})
elseif(ImGui)
add_library(ImGui::${TARGET} ALIAS ${TARGET})
else()
include(${CMAKE_CURRENT_LIST_DIR}/ImGui${TARGET}.cmake)
endif()
endfunction()
function(imgui_library TARGET INFIX_PATH)
cmake_parse_arguments(TARGET "" "" "HEADERS;SOURCES;DEFINITIONS;PACKAGES;TARGETS;COMPILE_OPTIONS;LINK_OPTIONS" ${ARGN})
if(ImGui AND "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${ImGui_SRCDIR}/examples")
if(ImGui_3RDPARTY)
set(TARGET_DEPENDENCIES TRUE)
foreach(PACKAGE ${TARGET_PACKAGES})
find_package(${PACKAGE} QUIET)
if(NOT ${PACKAGE}_FOUND)
message(AUTHOR_WARNING "Package ${PACKAGE} not found.")
string(TOUPPER "${PACKAGE}" PACKAGE_UPPER)
if(NOT ${PACKAGE_UPPER}_FOUND)
set(TARGET_DEPENDENCIES FALSE)
break()
endif()
endif()
endforeach()
if(TARGET_DEPENDENCIES)
foreach(INTERFACE_TARGET ${TARGET_TARGETS})
if(NOT TARGET ${INTERFACE_TARGET})
if(INTERFACE_TARGET STREQUAL "OpenGL::GL"
AND CMAKE_VERSION VERSION_LESS 3.8)
list(REMOVE_ITEM TARGET_TARGETS "${INTERFACE_TARGET}")
if(IS_ABSOLUTE "${OPENGL_gl_LIBRARY}")
message(AUTHOR_WARNING "Replace target ${INTERFACE_TARGET} to ${OPENGL_gl_LIBRARY}.")
list(APPEND TARGET_LIBRARIES "${OPENGL_gl_LIBRARY}")
else()
list(APPEND TARGET_TARGETS "${OPENGL_gl_LIBRARY}")
endif()
elseif(INTERFACE_TARGET STREQUAL "Freetype::Freetype")
list(REMOVE_ITEM TARGET_TARGETS "${INTERFACE_TARGET}")
if(IS_ABSOLUTE "${FREETYPE_LIBRARIES}")
message(AUTHOR_WARNING "Replace target ${INTERFACE_TARGET} to ${FREETYPE_LIBRARIES}.")
list(APPEND TARGET_LIBRARIES "${FREETYPE_LIBRARIES}")
else()
list(APPEND TARGET_TARGETS "${FREETYPE_LIBRARIES}")
endif()
list(APPEND TARGET_INCLUDE_DIRECTORIES "${FREETYPE_INCLUDE_DIRS}")
else()
message(WARNING "Target ${INTERFACE_TARGET} not found.")
set(TARGET_DEPENDENCIES FALSE)
endif()
endif()
endforeach()
endif()
if(NOT TARGET_DEPENDENCIES)
message(STATUS "Skip ${TARGET} library because not all dependencies found")
return()
endif()
endif()
add_library(${TARGET} INTERFACE)
target_link_libraries(${TARGET} INTERFACE Core)
foreach(HEADER ${TARGET_HEADERS})
target_sources(${TARGET}
INTERFACE
$<BUILD_INTERFACE:${ImGui_SRCDIR}/${INFIX_PATH}/${HEADER}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/imgui/${HEADER}>)
install(FILES ${ImGui_SRCDIR}/${INFIX_PATH}/${HEADER}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/imgui)
endforeach()
foreach(SOURCE ${TARGET_SOURCES})
target_sources(${TARGET}
INTERFACE
$<BUILD_INTERFACE:${ImGui_SRCDIR}/${INFIX_PATH}/${SOURCE}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_DATAROOTDIR}/imgui/${SOURCE}>)
install(FILES ${ImGui_SRCDIR}/${INFIX_PATH}/${SOURCE}
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/imgui)
endforeach()
foreach(DEFINITION ${TARGET_DEFINITIONS})
target_compile_definitions(${TARGET} INTERFACE ${DEFINITION})
endforeach()
target_include_directories(${TARGET} INTERFACE
$<BUILD_INTERFACE:${ImGui_SRCDIR}/${INFIX_PATH}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/imgui>)
if(NOT ImGui_3RDPARTY)
imgui_export(${TARGET})
return()
endif()
if(";${TARGET_TARGETS};" MATCHES ";SDL2::SDL2;")
get_target_property(SDL2_INCLUDE_DIRS SDL2::SDL2 INTERFACE_INCLUDE_DIRECTORIES)
if(NOT ";${SDL2_INCLUDE_DIRS};" MATCHES "SDL2;")
foreach(SDL2_INCLUDE_DIR ${SDL2_INCLUDE_DIRS})
if(EXISTS ${SDL2_INCLUDE_DIR}/SDL2)
target_include_directories(${TARGET} INTERFACE
$<BUILD_INTERFACE:${SDL2_INCLUDE_DIR}/SDL2>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/SDL2>)
endif()
endforeach()
endif()
endif()
foreach(INTERFACE_TARGET ${TARGET_TARGETS})
target_link_libraries(${TARGET}
INTERFACE ${INTERFACE_TARGET})
endforeach()
foreach(INTERFACE_LIBRARY ${TARGET_LIBRARIES})
target_link_libraries(${TARGET}
INTERFACE $<BUILD_INTERFACE:${INTERFACE_LIBRARY}>)
endforeach()
foreach(INTERFACE_INCLUDE_DIRECTORIES ${TARGET_INCLUDE_DIRECTORIES})
target_include_directories(${TARGET}
INTERFACE $<BUILD_INTERFACE:${INTERFACE_INCLUDE_DIRECTORIES}>)
endforeach()
foreach(INTERFACE_COMPILE_OPTION ${TARGET_COMPILE_OPTIONS})
target_compile_options(${TARGET}
INTERFACE ${INTERFACE_COMPILE_OPTION})
endforeach()
foreach(INTERFACE_LINK_OPTION ${TARGET_LINK_OPTIONS})
target_link_options(${TARGET}
INTERFACE ${INTERFACE_LINK_OPTION})
endforeach()
imgui_export(${TARGET})
elseif(ImGui)
if(TARGET ${TARGET})
list(APPEND ImGui_AVAILABLE_COMPONENTS ${TARGET})
set(ImGui_AVAILABLE_COMPONENTS "${ImGui_AVAILABLE_COMPONENTS}" PARENT_SCOPE)
if(";${ImGui_FIND_COMPONENTS};" MATCHES ";${TARGET};"
AND NOT TARGET ImGui::${TARGET})
add_library(ImGui::${TARGET} ALIAS ${TARGET})
endif()
endif()
else()
if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/ImGui${TARGET}.cmake)
list(APPEND ImGui_AVAILABLE_COMPONENTS ${TARGET})
set(ImGui_AVAILABLE_COMPONENTS "${ImGui_AVAILABLE_COMPONENTS}" PARENT_SCOPE)
endif()
if(";${ImGui_FIND_COMPONENTS};" MATCHES ";${TARGET};")
include(${CMAKE_CURRENT_LIST_DIR}/ImGui${TARGET}.cmake)
if(ImGui_3RDPARTY)
include(CMakeFindDependencyMacro)
foreach(PACKAGE ${TARGET_PACKAGES})
find_dependency(${PACKAGE} REQUIRED)
endforeach()
else()
message(STATUS "Please manualy link 3-rd party dependencies for ${TARGET} library")
endif()
endif()
endif()
endfunction()
function(imgui_backend TARGET)
list(APPEND ImGui_SUPPORTED_COMPONENTS ${TARGET})
set(ImGui_SUPPORTED_COMPONENTS "${ImGui_SUPPORTED_COMPONENTS}" PARENT_SCOPE)
if(NOT ImGui_BACKENDS)
return()
endif()
imgui_library(${TARGET} backends ${ARGN})
set(ImGui_AVAILABLE_COMPONENTS "${ImGui_AVAILABLE_COMPONENTS}" PARENT_SCOPE)
endfunction()
function(imgui_misc TARGET MISC_PATH)
list(APPEND ImGui_SUPPORTED_COMPONENTS ${TARGET})
set(ImGui_SUPPORTED_COMPONENTS "${ImGui_SUPPORTED_COMPONENTS}" PARENT_SCOPE)
if(NOT ImGui_MISC)
return()
endif()
set(INFIX_PATH "misc/${MISC_PATH}")
imgui_library(${TARGET} ${INFIX_PATH} ${ARGN})
set(ImGui_AVAILABLE_COMPONENTS "${ImGui_AVAILABLE_COMPONENTS}" PARENT_SCOPE)
endfunction()
function(imgui_example SUBDIRECTORY)
if(NOT ImGui_EXAMPLES OR NOT ImGui_3RDPARTY)
return()
endif()
cmake_parse_arguments(EXAMPLE "" "" "TARGETS;BACKENDS;MISC" ${ARGN})
if(EXAMPLE_BACKENDS AND NOT ImGui_BACKENDS)
return()
endif()
if(EXAMPLE_MISC AND NOT ImGui_MISC)
return()
endif()
set(EXAMPLE_DEPENDENCIES TRUE)
foreach(TARGET ${EXAMPLE_TARGETS} ${EXAMPLE_BACKENDS} ${EXAMPLE_MISC})
if(NOT TARGET ${TARGET})
set(EXAMPLE_DEPENDENCIES FALSE)
endif()
endforeach()
if(EXAMPLE_DEPENDENCIES)
add_subdirectory(${SUBDIRECTORY})
else()
message(STATUS "Skip ${SUBDIRECTORY} because not all dependencies found")
endif()
endfunction()
function(imgui_tool TARGET)
list(APPEND ImGui_SUPPORTED_COMPONENTS ${TARGET})
set(ImGui_SUPPORTED_COMPONENTS "${ImGui_SUPPORTED_COMPONENTS}" PARENT_SCOPE)
if(NOT ImGui_TOOLS)
return()
endif()
if(ImGui AND "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${ImGui_SRCDIR}/examples")
cmake_parse_arguments(TARGET "" "OUTPUT_NAME" "SOURCES" ${ARGN})
add_executable(${TARGET})
if(TARGET_OUTPUT_NAME)
set_target_properties(${TARGET} PROPERTIES
OUTPUT_NAME ${TARGET_OUTPUT_NAME})
endif()
foreach(SOURCE ${TARGET_SOURCES})
target_sources(${TARGET}
PRIVATE ${ImGui_SRCDIR}/${SOURCE})
endforeach()
imgui_export(${TARGET})
elseif(ImGui)
add_executable(ImGui::${TARGET} ALIAS ${TARGET})
else()
if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/ImGui${TARGET}.cmake)
list(APPEND ImGui_AVAILABLE_COMPONENTS ${TARGET})
set(ImGui_AVAILABLE_COMPONENTS "${ImGui_AVAILABLE_COMPONENTS}" PARENT_SCOPE)
endif()
if(";${ImGui_FIND_COMPONENTS};" MATCHES ";${TARGET};")
include(${CMAKE_CURRENT_LIST_DIR}/ImGui${TARGET}.cmake)
endif()
endif()
endfunction()