From 65e6ef1c33d86670de0bb385d48aaf51b56cbdb8 Mon Sep 17 00:00:00 2001 From: Konstantin Podsvirov Date: Tue, 9 Apr 2019 18:47:06 +0300 Subject: [PATCH] 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::ImplGlfw; - ImGui::ImplOpenGL2; - ImGui::ImplOpenGL3; - ImGui::ImplVulkan; - ImGui::FreeType; - ImGui::StdLib; - ImGui::BinaryToCompressedC. Import targets from: - build directory; - installed package. Examples: - example_null; - example_emscripten_opengl3; - example_glut_opengl2 - example_sdl2_opengl2; - example_sdl2_opengl3; - example_sdl2_vulkan; - example_glfw_opengl2; - example_glfw_opengl3; - example_glfw_vulkan. --- examples/CMakeLists.txt | 92 +++++ examples/ImGuiConfig.cmake | 21 ++ examples/ImGuiModule.cmake | 325 ++++++++++++++++++ examples/ImGuiTargets.cmake | 150 ++++++++ .../example_emscripten_opengl3/CMakeLists.txt | 18 + examples/example_glfw_opengl2/CMakeLists.txt | 16 + examples/example_glfw_opengl3/CMakeLists.txt | 16 + examples/example_glfw_vulkan/CMakeLists.txt | 51 +-- examples/example_glut_opengl2/CMakeLists.txt | 16 + examples/example_null/CMakeLists.txt | 16 + examples/example_sdl2_opengl2/CMakeLists.txt | 16 + examples/example_sdl2_opengl3/CMakeLists.txt | 16 + examples/example_sdl2_vulkan/CMakeLists.txt | 16 + 13 files changed, 729 insertions(+), 40 deletions(-) create mode 100644 examples/CMakeLists.txt create mode 100644 examples/ImGuiConfig.cmake create mode 100644 examples/ImGuiModule.cmake create mode 100644 examples/ImGuiTargets.cmake create mode 100644 examples/example_emscripten_opengl3/CMakeLists.txt create mode 100644 examples/example_glfw_opengl2/CMakeLists.txt create mode 100644 examples/example_glfw_opengl3/CMakeLists.txt create mode 100644 examples/example_glut_opengl2/CMakeLists.txt create mode 100644 examples/example_null/CMakeLists.txt create mode 100644 examples/example_sdl2_opengl2/CMakeLists.txt create mode 100644 examples/example_sdl2_opengl3/CMakeLists.txt create mode 100644 examples/example_sdl2_vulkan/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000000000..e31fab80618cc --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,92 @@ +cmake_minimum_required(VERSION 3.1) + +# Fetching version from header file +file(STRINGS ../imgui.h ImGui_VERSION_NUM_HEADER_STRING + REGEX "#define[ \t]+IMGUI_VERSION_NUM[ \t]+([0-9]+)" + LIMIT_COUNT 1) +string(REGEX REPLACE "#define[ \t]+IMGUI_VERSION_NUM[ \t]+([0-9]+)" "\\1" + IMGUI_VERSION_NUM "${ImGui_VERSION_NUM_HEADER_STRING}") +math(EXPR IMGUI_VERSION_MAJOR "${IMGUI_VERSION_NUM} / 10000") +math(EXPR IMGUI_VERSION_MINOR "(${IMGUI_VERSION_NUM} % 10000) / 100") +math(EXPR IMGUI_VERSION_PATCH "${IMGUI_VERSION_NUM} % 100") + +project(imgui_examples + VERSION "${IMGUI_VERSION_MAJOR}.${IMGUI_VERSION_MINOR}.${IMGUI_VERSION_PATCH}" + LANGUAGES CXX) + +get_filename_component(ImGui_SRCDIR "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY) + +include("${CMAKE_CURRENT_LIST_DIR}/ImGuiModule.cmake") + +set(ImGui_OPTIONS) + +imgui_option(USER_CONFIG "Dear ImGui user config for include" "" STRING) +imgui_option(EXAMPLES "Dear ImGui example applications" ON) +imgui_option(BACKENDS "Dear ImGui platform and render backends" ON) +imgui_option(MISC "Dear ImGui misc features" ON) +imgui_option(3RDPARTY "Dear ImGui example dependencies" ON) +if(EMSCRIPTEN) + set(ImGui_OPENGL_LOADER_DEFAULT "GLEW") +else() + set(ImGui_OPENGL_LOADER_DEFAULT "GL3W") +endif() +imgui_option(OPENGL_LOADER + "Dear ImGui OpenGL loader (GL3W, GLEW, GLAD or custom header)" + "${ImGui_OPENGL_LOADER_DEFAULT}" + STRINGS "GL3W" "GLEW" "GLAD") +imgui_option(FREETYPE "Dear ImGui will build font atlases using FreeType instead of stb_truetype" OFF) +imgui_option(TOOLS "Dear ImGui auxiliary applications" OFF) +imgui_option(PACKAGE "Dear ImGui packaging" OFF) + +file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/ImGuiOptions.cmake" + CONTENT "${ImGui_OPTIONS_CMAKE}") + +include("${CMAKE_CURRENT_LIST_DIR}/ImGuiTargets.cmake") + +set(ImGui_DIR "${CMAKE_CURRENT_LIST_DIR}") + +imgui_example(example_null + TARGETS Core) + +if(EMSCRIPTEN) + imgui_example(example_emscripten_opengl3 + BACKENDS ImplSDL2 ImplOpenGL3) +else() + imgui_example(example_glut_opengl2 + BACKENDS ImplGLUT ImplOpenGL2) + + imgui_example(example_sdl2_opengl2 + BACKENDS ImplSDL2 ImplOpenGL2) + + imgui_example(example_sdl2_opengl3 + BACKENDS ImplSDL2 ImplOpenGL3) + + imgui_example(example_sdl2_vulkan + BACKENDS ImplSDL2 ImplVulkan) + + imgui_example(example_glfw_opengl2 + BACKENDS ImplGlfw ImplOpenGL2) + + imgui_example(example_glfw_opengl3 + BACKENDS ImplGlfw ImplOpenGL3) + + imgui_example(example_glfw_vulkan + BACKENDS ImplGlfw ImplVulkan) +endif() + +if(NOT "${CMAKE_CURRENT_LIST_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") + foreach(FILE ImGuiConfig.cmake ImGuiModule.cmake ImGuiTargets.cmake) + configure_file(${FILE} ${FILE} COPYONLY) + endforeach() +endif() + +install(FILES ImGuiConfig.cmake ImGuiModule.cmake ImGuiTargets.cmake + "${CMAKE_CURRENT_BINARY_DIR}/ImGuiOptions.cmake" + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/imgui) + +if(ImGui_PACKAGE) + if(NOT DEFINED CPACK_PACKAGE_NAME) + set(CPACK_PACKAGE_NAME "dear-imgui") + endif() + include(CPack) +endif() diff --git a/examples/ImGuiConfig.cmake b/examples/ImGuiConfig.cmake new file mode 100644 index 0000000000000..254a7b107cfe2 --- /dev/null +++ b/examples/ImGuiConfig.cmake @@ -0,0 +1,21 @@ +if(NOT DEFINED ImGui_FIND_COMPONENTS) + set(ImGui_FIND_COMPONENTS Core) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/ImGuiTargets.cmake") + +foreach(COMPONENT ${ImGui_FIND_COMPONENTS}) + if(NOT ";${ImGui_AVAILABLE_COMPONENTS};" MATCHES ";${COMPONENT};") + set(ImGui_FOUND FALSE) + set(ImGui_NOT_FOUND_MESSAGE "Unavailable component: ${COMPONENT}.") + endif() + if(NOT ";${ImGui_SUPPORTED_COMPONENTS};" MATCHES ";${COMPONENT};") + set(ImGui_FOUND FALSE) + set(ImGui_NOT_FOUND_MESSAGE "Unsupported component: ${COMPONENT}.") + endif() +endforeach() + +if(NOT ImGui_FOUND) + set(ImGui_NOT_FOUND_MESSAGE "${ImGui_NOT_FOUND_MESSAGE}\nSupported components: ${ImGui_SUPPORTED_COMPONENTS}.") + set(ImGui_NOT_FOUND_MESSAGE "${ImGui_NOT_FOUND_MESSAGE}\nAvailable components: ${ImGui_AVAILABLE_COMPONENTS}.") +endif() diff --git a/examples/ImGuiModule.cmake b/examples/ImGuiModule.cmake new file mode 100644 index 0000000000000..33ac677641b6d --- /dev/null +++ b/examples/ImGuiModule.cmake @@ -0,0 +1,325 @@ +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 + $ + $) + foreach(HEADER ${TARGET_HEADERS}) + target_sources(${TARGET} + INTERFACE + $ + $) + 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 + $ + $) + 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 + $ + $) + install(FILES ${ImGui_SRCDIR}/${INFIX_PATH}/${HEADER} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/imgui) + endforeach() + foreach(SOURCE ${TARGET_SOURCES}) + target_sources(${TARGET} + INTERFACE + $ + $) + 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 + $ + $) + 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 + $ + $) + 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 $) + endforeach() + foreach(INTERFACE_INCLUDE_DIRECTORIES ${TARGET_INCLUDE_DIRECTORIES}) + target_include_directories(${TARGET} + INTERFACE $) + 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() diff --git a/examples/ImGuiTargets.cmake b/examples/ImGuiTargets.cmake new file mode 100644 index 0000000000000..df99a27b319ca --- /dev/null +++ b/examples/ImGuiTargets.cmake @@ -0,0 +1,150 @@ +include("${CMAKE_CURRENT_LIST_DIR}/ImGuiModule.cmake") + +set(ImGui_SUPPORTED_COMPONENTS) +set(ImGui_AVAILABLE_COMPONENTS) + +set(_ImGui_DEFINITIONS) +set(_ImGui_LIBRARIES) +if(NOT "${ImGui_USER_CONFIG}" STREQUAL "") + list(APPEND _ImGui_DEFINITIONS "IMGUI_USER_CONFIG=${ImGui_USER_CONFIG}") +endif() +if(ImGui_FREETYPE) + list(APPEND _ImGui_DEFINITIONS "IMGUI_ENABLE_FREETYPE") + list(APPEND _ImGui_LIBRARIES FreeType) +endif() +if(MINGW) + list(APPEND _ImGui_LIBRARIES "imm32") +endif() +imgui_core( + HEADERS + imconfig.h + imgui.h + imgui_internal.h + PRIVATE_HEADERS + imstb_textedit.h + imstb_truetype.h + imstb_rectpack.h + SOURCES_GLOB + imgui*.cpp + DEFINITIONS ${_ImGui_DEFINITIONS} + LIBRARIES ${_ImGui_LIBRARIES}) +unset(_ImGui_DEFINITIONS) +unset(_ImGui_LIBRARIES) + +if(APPLE) + set(_ImGui_PACKAGES GLUT) + set(_ImGui_TARGETS GLUT::GLUT) +else() + set(_ImGui_PACKAGES FreeGLUT) + set(_ImGui_TARGETS FreeGLUT::freeglut) +endif() +imgui_backend(ImplGLUT + HEADERS imgui_impl_glut.h + SOURCES imgui_impl_glut.cpp + PACKAGES ${_ImGui_PACKAGES} + TARGETS ${_ImGui_TARGETS}) +unset(_ImGui_PACKAGES) +unset(_ImGui_TARGETS) + +if(EMSCRIPTEN) + set(_ImGui_COMPILE_OPTIONS "SHELL:-s USE_SDL=2") + set(_ImGui_LINK_OPTIONS ${_ImGui_COMPILE_OPTIONS}) +else() + if(MINGW) + set(_ImGui_COMPILE_OPTIONS "-DSDL_MAIN_HANDLED") + endif() + set(_ImGui_PACKAGES SDL2) + set(_ImGui_TARGETS SDL2::SDL2main SDL2::SDL2) +endif() +imgui_backend(ImplSDL2 + HEADERS imgui_impl_sdl2.h + SOURCES imgui_impl_sdl2.cpp + COMPILE_OPTIONS ${_ImGui_COMPILE_OPTIONS} + LINK_OPTIONS ${_ImGui_LINK_OPTIONS} + PACKAGES ${_ImGui_PACKAGES} + TARGETS ${_ImGui_TARGETS}) +unset(_ImGui_COMPILE_OPTIONS) +unset(_ImGui_LINK_OPTIONS) +unset(_ImGui_PACKAGES) +unset(_ImGui_TARGETS) + +if(EMSCRIPTEN) + set(_ImGui_COMPILE_OPTIONS "SHELL:-s USE_GLFW=3") + set(_ImGui_LINK_OPTIONS ${_ImGui_COMPILE_OPTIONS}) +else() + set(_ImGui_PACKAGES glfw3) + set(_ImGui_TARGETS glfw) +endif() +imgui_backend(ImplGlfw + HEADERS imgui_impl_glfw.h + SOURCES imgui_impl_glfw.cpp + COMPILE_OPTIONS ${_ImGui_COMPILE_OPTIONS} + LINK_OPTIONS ${_ImGui_LINK_OPTIONS} + PACKAGES ${_ImGui_PACKAGES} + TARGETS ${_ImGui_TARGETS}) +unset(_ImGui_COMPILE_OPTIONS) +unset(_ImGui_LINK_OPTIONS) +unset(_ImGui_PACKAGES) +unset(_ImGui_TARGETS) + +imgui_backend(ImplOpenGL2 + HEADERS imgui_impl_opengl2.h + SOURCES imgui_impl_opengl2.cpp + PACKAGES OpenGL + TARGETS OpenGL::GL) + +if("${ImGui_OPENGL_LOADER}" STREQUAL "GL3W") + set(_ImGui_DEFINITIONS "IMGUI_IMPL_OPENGL_LOADER_GL3W=1") + set(_ImGui_PACKAGES gl3w) + set(_ImGui_TARGETS gl3w) +elseif("${ImGui_OPENGL_LOADER}" STREQUAL "GLEW") + set(_ImGui_DEFINITIONS "IMGUI_IMPL_OPENGL_LOADER_GLEW=1") + set(_ImGui_PACKAGES GLEW) + set(_ImGui_TARGETS GLEW::GLEW) +elseif("${ImGui_OPENGL_LOADER}" STREQUAL "GLAD") + set(_ImGui_DEFINITIONS "IMGUI_IMPL_OPENGL_LOADER_GLAD=1") + set(_ImGui_PACKAGES glad) + set(_ImGui_TARGETS glad::glad) +else() + set(_ImGui_DEFINITIONS "IMGUI_IMPL_OPENGL_LOADER_CUSTOM=${ImGui_OPENGL_LOADER}") + set(_ImGui_PACKAGES) + set(_ImGui_TARGETS) +endif() +if(EMSCRIPTEN) + set(_ImGui_PACKAGES) + set(_ImGui_TARGETS) +else() + list(APPEND _ImGui_PACKAGES OpenGL) + list(APPEND _ImGui_TARGETS OpenGL::GL) +endif() +imgui_backend(ImplOpenGL3 + HEADERS + imgui_impl_opengl3.h + imgui_impl_opengl3_loader.h + SOURCES imgui_impl_opengl3.cpp + DEFINITIONS ${_ImGui_DEFINITIONS} + PACKAGES ${_ImGui_PACKAGES} + TARGETS ${_ImGui_TARGETS}) +unset(_ImGui_DEFINITIONS) +unset(_ImGui_PACKAGES) +unset(_ImGui_TARGETS) + +imgui_backend(ImplVulkan + HEADERS imgui_impl_vulkan.h + SOURCES imgui_impl_vulkan.cpp + PACKAGES Vulkan + TARGETS Vulkan::Vulkan) + +imgui_misc(FreeType freetype + HEADERS imgui_freetype.h + SOURCES imgui_freetype.cpp + PACKAGES Freetype + TARGETS Freetype::Freetype) + +imgui_misc(StdLib cpp + HEADERS imgui_stdlib.h + SOURCES imgui_stdlib.cpp) + +imgui_tool(BinaryToCompressedC + OUTPUT_NAME binary_to_compressed_c + SOURCES misc/fonts/binary_to_compressed_c.cpp) diff --git a/examples/example_emscripten_opengl3/CMakeLists.txt b/examples/example_emscripten_opengl3/CMakeLists.txt new file mode 100644 index 0000000000000..c65089beae11f --- /dev/null +++ b/examples/example_emscripten_opengl3/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_emscripten_opengl3 + LANGUAGES C CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplSDL2 ImplOpenGL3) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplSDL2 ImGui::ImplOpenGL3) + +target_link_options(${PROJECT_NAME} PRIVATE + "SHELL:--shell-file ${CMAKE_CURRENT_LIST_DIR}/shell_minimal.html") + +set_target_properties(${PROJECT_NAME} PROPERTIES + SUFFIX .html) diff --git a/examples/example_glfw_opengl2/CMakeLists.txt b/examples/example_glfw_opengl2/CMakeLists.txt new file mode 100644 index 0000000000000..2c5bc3a42e27d --- /dev/null +++ b/examples/example_glfw_opengl2/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_glfw_opengl2 + LANGUAGES CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplGlfw ImplOpenGL2) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplGlfw ImGui::ImplOpenGL2) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/examples/example_glfw_opengl3/CMakeLists.txt b/examples/example_glfw_opengl3/CMakeLists.txt new file mode 100644 index 0000000000000..c7d233e3811ff --- /dev/null +++ b/examples/example_glfw_opengl3/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_glfw_opengl3 + LANGUAGES C CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplGlfw ImplOpenGL3) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplGlfw ImGui::ImplOpenGL3) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/examples/example_glfw_vulkan/CMakeLists.txt b/examples/example_glfw_vulkan/CMakeLists.txt index 443a144eae65f..69f5973166050 100644 --- a/examples/example_glfw_vulkan/CMakeLists.txt +++ b/examples/example_glfw_vulkan/CMakeLists.txt @@ -1,45 +1,16 @@ -# Example usage: -# mkdir build -# cd build -# cmake -g "Visual Studio 14 2015" .. +cmake_minimum_required(VERSION 3.1) -cmake_minimum_required(VERSION 2.8) -project(imgui_example_glfw_vulkan C CXX) +project(example_glfw_vulkan + LANGUAGES CXX) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) -endif() +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplGlfw ImplVulkan) -set(CMAKE_CXX_STANDARD 11) -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES") -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_PROTOTYPES") +add_executable(${PROJECT_NAME} main.cpp) -# GLFW -set(GLFW_DIR ../../../glfw) # Set this to point to an up-to-date GLFW repo -option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF) -option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF) -option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF) -option(GLFW_INSTALL "Generate installation target" OFF) -option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF) -add_subdirectory(${GLFW_DIR} binary_dir EXCLUDE_FROM_ALL) -include_directories(${GLFW_DIR}/include) - -# Dear ImGui -set(IMGUI_DIR ../../) -include_directories(${IMGUI_DIR} ${IMGUI_DIR}/backends ..) - -# Libraries -find_package(Vulkan REQUIRED) -#find_library(VULKAN_LIBRARY - #NAMES vulkan vulkan-1) -#set(LIBRARIES "glfw;${VULKAN_LIBRARY}") -set(LIBRARIES "glfw;Vulkan::Vulkan") - -# Use vulkan headers from glfw: -include_directories(${GLFW_DIR}/deps) - -file(GLOB sources *.cpp) - -add_executable(example_glfw_vulkan ${sources} ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp ${IMGUI_DIR}/backends/imgui_impl_vulkan.cpp ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp ${IMGUI_DIR}/imgui_tables.cpp ${IMGUI_DIR}/imgui_widgets.cpp) -target_link_libraries(example_glfw_vulkan ${LIBRARIES}) +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplGlfw ImGui::ImplVulkan) +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/examples/example_glut_opengl2/CMakeLists.txt b/examples/example_glut_opengl2/CMakeLists.txt new file mode 100644 index 0000000000000..3b4d1867fd92f --- /dev/null +++ b/examples/example_glut_opengl2/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_glut_opengl2 + LANGUAGES CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplGLUT ImplOpenGL2) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplGLUT ImGui::ImplOpenGL2) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/examples/example_null/CMakeLists.txt b/examples/example_null/CMakeLists.txt new file mode 100644 index 0000000000000..a59ae6f543e33 --- /dev/null +++ b/examples/example_null/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_null + LANGUAGES CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS Core) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::Core) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/examples/example_sdl2_opengl2/CMakeLists.txt b/examples/example_sdl2_opengl2/CMakeLists.txt new file mode 100644 index 0000000000000..51ccb6eeb95f5 --- /dev/null +++ b/examples/example_sdl2_opengl2/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_sdl_opengl2 + LANGUAGES CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplSDL2 ImplOpenGL2) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplSDL2 ImGui::ImplOpenGL2) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/examples/example_sdl2_opengl3/CMakeLists.txt b/examples/example_sdl2_opengl3/CMakeLists.txt new file mode 100644 index 0000000000000..0692eefb94b32 --- /dev/null +++ b/examples/example_sdl2_opengl3/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_sdl_opengl3 + LANGUAGES C CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplSDL2 ImplOpenGL3) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplSDL2 ImGui::ImplOpenGL3) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/examples/example_sdl2_vulkan/CMakeLists.txt b/examples/example_sdl2_vulkan/CMakeLists.txt new file mode 100644 index 0000000000000..bc6d6570d921c --- /dev/null +++ b/examples/example_sdl2_vulkan/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +project(example_sdl_vulkan + LANGUAGES CXX) + +find_package(ImGui CONFIG REQUIRED + COMPONENTS ImplSDL2 ImplVulkan) + +add_executable(${PROJECT_NAME} main.cpp) + +target_link_libraries(${PROJECT_NAME} + PRIVATE ImGui::ImplSDL2 ImGui::ImplVulkan) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")