Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmake build static/shared with two demo opengl3+{sdl3,glfw} #7650

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
237 changes: 237 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
cmake_minimum_required(VERSION 3.25)
project(imgui VERSION 1.90.8 LANGUAGES CXX)
set(imgui_VERSION "${imgui_VERSION}-WIP")
if(IMGUI_COMMIT_HASH)
set(imgui_VERSION "${imgui_VERSION}-g${IMGUI_COMMIT_HASH}")
endif()

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

set(CMAKE_DEBUG_POSTFIX d)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED)

option(IMGUI_BUILD_EXAMPLES "Build ImGUI Examples" OFF)
option(BUILD_SHARED_LIBS "Build shared library by default" ON)
option(CMAKE_POSITION_INDEPENDENT_CODE "Enable PIC for all" ON)
option(CMAKE_VERBOSE_MAKEFILE "Enable Makefile verbose output" OFF)
option(CMAKE_EXPORT_COMPILE_COMMANDS "Export compile cmds as JSON" OFF)

option(IMGUI_IMPL_COMBINE_STATIC "Combine static IMPL into libimgui.a" ON)

include(CMakeDependentOption)
# TODO Add more graphical backends
# NOTE Linux show current OpenGL version: $ glxinfo | grep version
# NOTE set <CMAKE_PREFIX_PATH> for none standard install of SDL3, GLFW, etc.
cmake_dependent_option(IMGUI_BUILD_IMPL_directx "Build GB/IMPL DirectX" ON "WIN32" OFF)
cmake_dependent_option(IMGUI_BUILD_IMPL_vulkan "Build GB/IMPL Vulkan" OFF "UNIX" OFF)
cmake_dependent_option(IMGUI_BUILD_IMPL_opengl3 "Build GB/IMPL OpenGL" ON "UNIX" OFF)

cmake_dependent_option(IMGUI_BUILD_IMPL_sdl3 "Build GB/IMPL SDL" ON "UNIX" OFF)
cmake_dependent_option(IMGUI_BUILD_IMPL_glfw "Build GB/IMPL GLFW" ON "UNIX" OFF)

# https://cmake.org/cmake/help/latest/module/FindOpenGL.html
if(IMGUI_BUILD_EXAMPLES AND IMGUI_BUILD_IMPL_opengl3)
find_package(OpenGL REQUIRED) # apt show libopengl-dev
set(IMGUI_IMPL_API_opengl3 ${CMAKE_SOURCE_DIR}/backends/imgui_impl_opengl3.h)
set(IMGUI_IMPL_SRC_opengl3 ${CMAKE_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp)
endif()

if(IMGUI_BUILD_EXAMPLES AND IMGUI_BUILD_IMPL_sdl3)
find_package(SDL3 REQUIRED) # apt show libsdl{2,3}-dev
set(IMGUI_IMPL_API_sdl3 ${CMAKE_SOURCE_DIR}/backends/imgui_impl_sdl3.h)
set(IMGUI_IMPL_SRC_sdl3 ${CMAKE_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp)
endif()

if(IMGUI_BUILD_EXAMPLES AND IMGUI_BUILD_IMPL_glfw)
find_package(glfw3 REQUIRED) # apt show libglfw3
set(IMGUI_IMPL_API_glfw ${CMAKE_SOURCE_DIR}/backends/imgui_impl_glfw.h)
set(IMGUI_IMPL_SRC_glfw ${CMAKE_SOURCE_DIR}/backends/imgui_impl_glfw.cpp)
endif()

set(IMGUI_HEADER_FILES
${CMAKE_SOURCE_DIR}/imgui.h
${CMAKE_SOURCE_DIR}/imconfig.h
)

set(IMGUI_SOURCE_FILES
${CMAKE_SOURCE_DIR}/imgui.cpp
${CMAKE_SOURCE_DIR}/imgui_demo.cpp
${CMAKE_SOURCE_DIR}/imgui_draw.cpp
${CMAKE_SOURCE_DIR}/imgui_tables.cpp
${CMAKE_SOURCE_DIR}/imgui_widgets.cpp
)

if(BUILD_SHARED_LIBS)
set(xLibType SHARED)
set(IMGUI_IMPL_COMBINE_STATIC OFF)
else()
set(xLibType STATIC)
endif()

add_library(imgui ${xLibType}
${IMGUI_HEADER_FILES}
${IMGUI_SOURCE_FILES}
# Internal Private Headers
${CMAKE_SOURCE_DIR}/imgui_internal.h
${CMAKE_SOURCE_DIR}/imstb_rectpack.h
${CMAKE_SOURCE_DIR}/imstb_textedit.h
${CMAKE_SOURCE_DIR}/imstb_truetype.h
)

target_include_directories(imgui PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)

if(IMGUI_BUILD_EXAMPLES AND IMGUI_BUILD_IMPL_opengl3)
if(IMGUI_IMPL_COMBINE_STATIC)
target_sources(imgui PRIVATE
${IMGUI_IMPL_API_opengl3}
${IMGUI_IMPL_SRC_opengl3}
)
target_include_directories(imgui PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(imgui PUBLIC OpenGL::GL)
else()
add_library(imgui-impl-opengl3 ${xLibType}
${IMGUI_IMPL_API_opengl3}
${IMGUI_IMPL_SRC_opengl3}
)
target_include_directories(imgui-impl-opengl3 PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(imgui-impl-opengl3 PUBLIC OpenGL::GL)
endif()
endif()

if(IMGUI_BUILD_EXAMPLES AND IMGUI_BUILD_IMPL_sdl3)
if(IMGUI_IMPL_COMBINE_STATIC)
target_sources(imgui PRIVATE
${IMGUI_IMPL_API_sdl3}
${IMGUI_IMPL_SRC_sdl3}
)
target_include_directories(imgui PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(imgui PUBLIC SDL3::SDL3)
target_compile_options(imgui PUBLIC -DSDL_ENABLE_OLD_NAMES)
else()
add_library(imgui-impl-sdl3 ${xLibType}
${IMGUI_IMPL_API_sdl3}
${IMGUI_IMPL_SRC_sdl3}
)
target_include_directories(imgui-impl-sdl3 PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(imgui-impl-sdl3 PUBLIC SDL3::SDL3)
# TODO use SDL3 New Name and this can be safely removed
target_compile_options(imgui-impl-sdl3 PUBLIC -DSDL_ENABLE_OLD_NAMES)
endif()
endif()

if(IMGUI_BUILD_EXAMPLES AND IMGUI_BUILD_IMPL_glfw)
if(IMGUI_IMPL_COMBINE_STATIC)
target_sources(imgui PRIVATE
${IMGUI_IMPL_API_glfw}
${IMGUI_IMPL_SRC_glfw}
)
target_include_directories(imgui PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(imgui PUBLIC glfw)
else()
add_library(imgui-impl-glfw ${xLibType}
${IMGUI_IMPL_API_glfw}
${IMGUI_IMPL_SRC_glfw}
)
target_include_directories(imgui-impl-glfw PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(imgui-impl-glfw PUBLIC glfw)
endif()
endif()

install(TARGETS imgui DESTINATION lib EXPORT imgui-targets)
export(TARGETS imgui NAMESPACE imgui:: FILE imgui-targets.cmake)
install(EXPORT imgui-targets NAMESPACE imgui::
DESTINATION lib/cmake/imgui
)

install(FILES ${IMGUI_HEADER_FILES}
DESTINATION include/imgui
)

if(IMGUI_BUILD_EXAMPLES)
foreach(xIMPL opengl3 sdl3 glfw vulkan)
if(IMGUI_BUILD_IMPL_${xIMPL})
if(NOT IMGUI_IMPL_COMBINE_STATIC)
install(TARGETS imgui-impl-${xIMPL}
DESTINATION lib EXPORT imgui-${xIMPL}-targets
)
export(TARGETS imgui-impl-${xIMPL} NAMESPACE imgui-impl::
FILE imgui-${xIMPL}-targets.cmake
)
install(EXPORT imgui-${xIMPL}-targets NAMESPACE imgui-impl::
DESTINATION lib/cmake/imgui
)
endif()
install(FILES ${IMGUI_IMPL_API_${xIMPL}}
DESTINATION include/imgui/impl RENAME ${xIMPL}.h
)
endif()
endforeach()
endif()

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/imgui-config-version.cmake"
VERSION "${imgui_VERSION}" COMPATIBILITY AnyNewerVersion
)

install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/imgui-config-version.cmake"
DESTINATION lib/cmake/imgui
)

if(IMGUI_BUILD_EXAMPLES)
string(TOLOWER "${xLibType}" xLibType)
# xGLP = Graphical Library Platform, xGRL = Graphical Renderer Library
foreach(xGLP vulkan opengl3)
if(NOT IMGUI_BUILD_IMPL_${xGLP})
continue()
endif()

foreach(xGRL glfw sdl3)
if(NOT IMGUI_BUILD_IMPL_${xGRL})
continue()
endif()

set(xDemoName "demo-${xGRL}-${xGLP}-${xLibType}")
add_executable(${xDemoName}
"${CMAKE_SOURCE_DIR}/examples/example_${xGRL}_${xGLP}/main.cpp"
)
target_include_directories(${xDemoName} PRIVATE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/backends>
)
if(IMGUI_IMPL_COMBINE_STATIC)
target_link_libraries(${xDemoName} PRIVATE
imgui
)
else()
target_link_libraries(${xDemoName} PRIVATE
imgui imgui-impl-${xGLP} imgui-impl-${xGRL}
)
endif()
endforeach()
endforeach()
endif()