From 9d5e4c31120a3f3a9f6fe4ff69e920c410613478 Mon Sep 17 00:00:00 2001 From: Pinwhell <60289470+pinwhell@users.noreply.github.com> Date: Wed, 18 Sep 2024 02:11:20 -0400 Subject: [PATCH] Installs Impl & Quality Cleanups & Uniformity --- .gitignore | 1 + CMakeLists.txt | 32 ++++++++++++++++++++++++---- backends/CMakeLists.txt | 29 ++++++++++++++----------- cmake/add_library_ns.cmake | 14 ++++++++++++ cmake/imgui-config.cmake.in | 30 ++++++++++++++++++++++++++ cmake/install_target.cmake | 19 +++++++++++++++++ cmake/target_include_dir_iface.cmake | 10 +++++++++ misc/cpp/CMakeLists.txt | 8 ++++--- misc/freetype/CMakeLists.txt | 8 ++++--- misc/single_file/CMakeLists.txt | 7 ++++-- 10 files changed, 134 insertions(+), 24 deletions(-) create mode 100644 cmake/add_library_ns.cmake create mode 100644 cmake/imgui-config.cmake.in create mode 100644 cmake/install_target.cmake create mode 100644 cmake/target_include_dir_iface.cmake diff --git a/.gitignore b/.gitignore index 1f2c6d077..c8ce3ddae 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer ## User Playground playground/* +CMakeSettings.json diff --git a/CMakeLists.txt b/CMakeLists.txt index f86f39cef..2dd8457e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,9 +7,15 @@ option(IMGUI_IMPL_OPENGL2 "Enable ImGui OpenGL2 implementation" OFF) option(IMGUI_IMPL_OPENGL3 "Enable ImGui OpenGL3 implementation" OFF) option(IMGUI_ENABLE_PLAYGROUND "Enable playground subdirectory" OFF) -set(IMGUI_INC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(imgui-core STATIC) -target_sources(imgui-core PUBLIC imgui.cpp imgui_demo.cpp imgui_draw.cpp imgui_tables.cpp imgui_widgets.cpp) +set(IMGUI_INC_DIR +$ +$) + +include(cmake/add_library_ns.cmake) +include(cmake/target_include_dir_iface.cmake) +include(cmake/install_target.cmake) + +add_library_ns(imgui core STATIC imgui.cpp imgui_demo.cpp imgui_draw.cpp imgui_tables.cpp imgui_widgets.cpp) target_include_directories(imgui-core PUBLIC ${IMGUI_INC_DIR}) add_subdirectory(misc) @@ -17,7 +23,25 @@ add_subdirectory(backends) # Playground is a private space where dev might test/experiment/freestyle stuffs if(IMGUI_ENABLE_PLAYGROUND) -if(EXISTS playground) +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/playground) add_subdirectory(playground) endif() endif() + +install_target_and_headers(imgui core + imgui.h + imgui_internal.h + imconfig.h + imstb_truetype.h + imstb_textedit.h + imstb_rectpack.h + ) + +configure_file(cmake/imgui-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/imgui-config.cmake + @ONLY) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/imgui-config.cmake + DESTINATION lib/cmake/imgui) + diff --git a/backends/CMakeLists.txt b/backends/CMakeLists.txt index d8ced3e56..960998ea2 100644 --- a/backends/CMakeLists.txt +++ b/backends/CMakeLists.txt @@ -3,26 +3,31 @@ find_package(OpenGL) endif() if(IMGUI_IMPL_WIN32) -add_library(imgui-impl-win32 STATIC) -target_sources(imgui-impl-win32 PUBLIC imgui_impl_win32.cpp) -target_include_directories(imgui-impl-win32 PUBLIC ${IMGUI_INC_DIR}) +add_library_ns(imgui win32 STATIC imgui_impl_win32.cpp) +target_include_dir_iface(imgui-win32 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} include PRIVATE ${IMGUI_INC_DIR}) +install_target_and_headers(imgui win32 + imgui_impl_win32.h + ) endif() if(OpenGL_FOUND) if(IMGUI_IMPL_OPENGL2) -add_library(imgui-impl-opengl2 STATIC) -target_sources(imgui-impl-opengl2 PUBLIC imgui_impl_opengl2.cpp) -target_include_directories(imgui-impl-opengl2 PUBLIC ${IMGUI_INC_DIR}) -target_link_libraries(imgui-impl-opengl2 OpenGL::GL) +add_library_ns(imgui opengl2 STATIC imgui_impl_opengl2.cpp) +target_include_dir_iface(imgui-opengl2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} include PRIVATE ${IMGUI_INC_DIR}) +target_link_libraries(imgui-opengl2 OpenGL::GL) +install_target_and_headers(imgui opengl2 + imgui_impl_opengl2.h + ) endif() if(IMGUI_IMPL_OPENGL3) -add_library(imgui-impl-opengl3 STATIC) -target_sources(imgui-impl-opengl3 PUBLIC imgui_impl_opengl3.cpp) -target_include_directories(imgui-impl-opengl3 PUBLIC ${IMGUI_INC_DIR}) -target_link_libraries(imgui-impl-opengl3 OpenGL::GL) - +add_library_ns(imgui opengl3 STATIC imgui_impl_opengl3.cpp) +target_include_dir_iface(imgui-opengl3 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} include PRIVATE ${IMGUI_INC_DIR}) +target_link_libraries(imgui-opengl3 OpenGL::GL) +install_target_and_headers(imgui opengl3 + imgui_impl_opengl3.h + ) endif() endif() diff --git a/cmake/add_library_ns.cmake b/cmake/add_library_ns.cmake new file mode 100644 index 000000000..ce5bbf16f --- /dev/null +++ b/cmake/add_library_ns.cmake @@ -0,0 +1,14 @@ +function(add_library_ns target_ns target_name) + # Forward all arguments after the target_name + set(args ${ARGN}) + set(target_fullname ${target_ns}-${target_name}) + + # Call the original add_library command with the forwarded arguments + add_library(${target_fullname} ${args}) + + # Alias it properly + add_library(${target_ns}::${target_name} ALIAS ${target_fullname}) + + # Export name unambiguate + set_target_properties(${target_fullname} PROPERTIES EXPORT_NAME ${target_name}) +endfunction() diff --git a/cmake/imgui-config.cmake.in b/cmake/imgui-config.cmake.in new file mode 100644 index 000000000..f23d956e6 --- /dev/null +++ b/cmake/imgui-config.cmake.in @@ -0,0 +1,30 @@ +@PACKAGE_INIT@ # Init + +include(CMakeFindDependencyMacro) + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/imgui-opengl2-targets.cmake" OR +EXISTS "${CMAKE_CURRENT_LIST_DIR}/imgui-opengl3-targets.cmake") +find_dependency(OpenGL) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/imgui-core-targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/imgui-cpp-targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/imgui-jumbo-targets.cmake") + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/imgui-freetype-targets.cmake") +find_dependency(Freetype) +include("${CMAKE_CURRENT_LIST_DIR}/imgui-freetype-targets.cmake") +endif() + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/imgui-win32-targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/imgui-win32-targets.cmake") +endif() + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/imgui-opengl2-targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/imgui-opengl2-targets.cmake") +endif() + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/imgui-opengl3-targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/imgui-opengl3-targets.cmake") +endif() + diff --git a/cmake/install_target.cmake b/cmake/install_target.cmake new file mode 100644 index 000000000..853e99218 --- /dev/null +++ b/cmake/install_target.cmake @@ -0,0 +1,19 @@ +function(install_target_and_headers ns name) + +set(target_name ${ns}-${name}) + +install(FILES +${ARGN} +DESTINATION include) + +install(TARGETS ${target_name} + EXPORT ${target_name}-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin) + +install(EXPORT ${target_name}-targets + FILE ${target_name}-targets.cmake + NAMESPACE ${ns}:: + DESTINATION lib/cmake/${ns}) +endfunction() diff --git a/cmake/target_include_dir_iface.cmake b/cmake/target_include_dir_iface.cmake new file mode 100644 index 000000000..210f5d0eb --- /dev/null +++ b/cmake/target_include_dir_iface.cmake @@ -0,0 +1,10 @@ +function(target_include_dir_iface target visibility build-inc install-inc) + set(args ${ARGN}) + target_include_directories( + ${target} + ${visibility} + $ + $ + ${args} + ) +endfunction() diff --git a/misc/cpp/CMakeLists.txt b/misc/cpp/CMakeLists.txt index cd2f03341..d79d2e979 100644 --- a/misc/cpp/CMakeLists.txt +++ b/misc/cpp/CMakeLists.txt @@ -1,3 +1,5 @@ -add_library(imgui-cpp STATIC) -target_sources(imgui-cpp PUBLIC imgui_stdlib.cpp) -target_include_directories(imgui-cpp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} PRIVATE ${IMGUI_INC_DIR}) +add_library_ns(imgui cpp STATIC imgui_stdlib.cpp) +target_include_dir_iface(imgui-cpp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} include PRIVATE ${IMGUI_INC_DIR}) +install_target_and_headers(imgui cpp + imgui_stdlib.h + ) diff --git a/misc/freetype/CMakeLists.txt b/misc/freetype/CMakeLists.txt index 014ba8f75..1b7e62df0 100644 --- a/misc/freetype/CMakeLists.txt +++ b/misc/freetype/CMakeLists.txt @@ -1,7 +1,9 @@ find_package(Freetype) if(Freetype_FOUND) -add_library(imgui-freetype STATIC) -target_include_directories(imgui-freetype PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} PRIVATE ${IMGUI_INC_DIR}) -target_sources(imgui-freetype PUBLIC imgui_freetype.cpp) +add_library_ns(imgui freetype STATIC imgui_freetype.cpp) +target_include_dir_iface(imgui-freetype PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} include PRIVATE ${IMGUI_INC_DIR}) target_link_libraries(imgui-freetype Freetype::Freetype) +install_target_and_headers(imgui freetype + imgui_freetype.h + ) endif() diff --git a/misc/single_file/CMakeLists.txt b/misc/single_file/CMakeLists.txt index 9fd73c3e8..abc813296 100644 --- a/misc/single_file/CMakeLists.txt +++ b/misc/single_file/CMakeLists.txt @@ -1,2 +1,5 @@ -add_library(imgui-jumbo INTERFACE) -target_include_directories(imgui-jumbo INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +add_library_ns(imgui jumbo INTERFACE) +target_include_dir_iface(imgui-jumbo INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} include INTERFACE ${IMGUI_INC_DIR}) +install_target_and_headers(imgui jumbo + imgui_single_file.h + )