Skip to content

Commit 1c50275

Browse files
committed
Refactor and cleanup project.
+ Make proper usage of cmake's package_config. + Provide examples to consume the library. + Apply proper renaming in accordance to imgui's backend changes. + Inline backends include function in the same CMakeLists.txt. + Set default CMAKE_INSTALL_PREFIX and allow for it to be overriden (closes #2). + Change imgui branch from master to docking. + Update readme. TODO: Add support for more backends. Now with the new structure it should be easier.
1 parent fffed6e commit 1c50275

File tree

10 files changed

+460
-205
lines changed

10 files changed

+460
-205
lines changed

CMakeImplFiles.cmake

Lines changed: 0 additions & 59 deletions
This file was deleted.

CMakeLists.txt

Lines changed: 174 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,155 +1,227 @@
11
#
22
# ImGui Library
33
#
4-
cmake_minimum_required(VERSION 3.6.0)
4+
cmake_minimum_required(VERSION 3.15)
55

66
include(CMakeOptions.cmake)
7-
include(CMakeImplFiles.cmake)
87

98

109
##################################################################################################################
11-
# Setup
10+
# PROJECT
1211
##################################################################################################################
12+
13+
set(imgui_VERSION 1.88.0)
14+
1315
project(imgui
14-
VERSION 1.88
15-
LANGUAGES CXX
16-
DESCRIPTION "ImGui library."
16+
VERSION ${imgui_VERSION}
17+
LANGUAGES CXX
18+
DESCRIPTION "Build ImGui as shared or static library."
19+
HOMEPAGE_URL "https://github.com/ocornut/imgui"
1720
)
1821

19-
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/$<CONFIG>)
20-
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/$<CONFIG>)
21-
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/$<CONFIG>)
22-
set(CMAKE_PDB_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/$<CONFIG>)
22+
set(CMAKE_VERBOSE_MAKEFILE TRUE CACHE BOOL "" FORCE)
2323

24-
set(CMAKE_VERBOSE_MAKEFILE TRUE)
24+
# Note that for multi-config generators, we don't need to set CMAKE_BUILD_TYPE.
25+
# However for single-config generators, depending on the type of generator and cmake version,
26+
# both may be null and we set CMAKE_BUILD_TYPE just in case.
27+
if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
28+
message(STATUS "[ImGui] CMAKE_BUILD_TYPE was not set. Defaults to Release.")
29+
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
30+
endif()
2531

26-
if (WIN32)
27-
if (IMGUI_STATIC_LIBRARY)
28-
message(STATUS "[INFO] Building library as --> Static Library")
29-
set(BUILD_SHARED_LIBS OFF)
30-
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS OFF)
31-
else()
32-
message(STATUS "[INFO] Building library as --> DLL")
33-
set(BUILD_SHARED_LIBS ON)
34-
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
35-
endif()
32+
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
33+
message(STATUS "[ImGui] Default install path: [${CMAKE_BINARY_DIR}/dist]")
34+
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/dist" CACHE PATH "" FORCE)
3635
endif()
3736

38-
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/imgui)
39-
set(BACKENDS_DIR ${SOURCE_DIR}/backends)
40-
set(FONTS_DIR ${SOURCE_DIR}/misc/fonts)
37+
set(IMGUI_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/imgui)
38+
set(BACKENDS_DIR ${IMGUI_SOURCE_DIR}/backends)
4139

4240

4341
##################################################################################################################
44-
# Project Files
42+
# SOURCES
4543
##################################################################################################################
46-
set(HEADERS_CXX_FILES
47-
${SOURCE_DIR}/imgui.h
48-
${SOURCE_DIR}/imconfig.h
49-
${SOURCE_DIR}/imgui_internal.h
50-
${SOURCE_DIR}/imstb_rectpack.h
51-
${SOURCE_DIR}/imstb_textedit.h
52-
${SOURCE_DIR}/imstb_truetype.h
44+
45+
set(PUBLIC_H_FILES
46+
${IMGUI_SOURCE_DIR}/imgui.h
47+
${IMGUI_SOURCE_DIR}/imconfig.h
48+
${IMGUI_SOURCE_DIR}/imgui_internal.h
49+
${IMGUI_SOURCE_DIR}/imstb_rectpack.h
50+
${IMGUI_SOURCE_DIR}/imstb_textedit.h
51+
${IMGUI_SOURCE_DIR}/imstb_truetype.h
5352
)
5453

55-
set(SOURCES_CXX_FILES
56-
${SOURCE_DIR}/imgui.cpp
57-
${SOURCE_DIR}/imgui_draw.cpp
58-
${SOURCE_DIR}/imgui_widgets.cpp
59-
${SOURCE_DIR}/imgui_demo.cpp
60-
${SOURCE_DIR}/imgui_tables.cpp
54+
set(PUBLIC_CXX_FILES
55+
${IMGUI_SOURCE_DIR}/imgui.cpp
56+
${IMGUI_SOURCE_DIR}/imgui_draw.cpp
57+
${IMGUI_SOURCE_DIR}/imgui_widgets.cpp
58+
${IMGUI_SOURCE_DIR}/imgui_demo.cpp
59+
${IMGUI_SOURCE_DIR}/imgui_tables.cpp
6160
)
6261

63-
file(GLOB FONTS_FILES ${FONTS_DIR}/*.ttf)
62+
file(GLOB FONTS_FILES ${IMGUI_SOURCE_DIR}/misc/fonts/*.ttf)
6463

65-
set(HEADERS_CXX_IMPL_FILES)
66-
set(SOURCES_CXX_IMPL_FILES)
67-
if (IMGUI_WITH_IMPL)
68-
Init_Impl_Files(HEADERS_CXX_IMPL_FILES SOURCES_CXX_IMPL_FILES)
64+
set(IMGUI_INTERFACE_LIBS "")
65+
if(IMGUI_WITH_BACKEND)
66+
if("${IMGUI_BACKEND_PLATFORM}" STREQUAL "WIN32")
67+
message(STATUS "[ImGui] Including backend platform: [WIN32]")
68+
list(APPEND PUBLIC_H_FILES ${BACKENDS_DIR}/imgui_impl_win32.h)
69+
list(APPEND PUBLIC_CXX_FILES ${BACKENDS_DIR}/imgui_impl_win32.cpp)
70+
endif()
71+
72+
if(IMGUI_BACKEND_DX9)
73+
message(STATUS "[ImGui] Including backend api: [Direct3D9]")
74+
list(APPEND PUBLIC_H_FILES ${BACKENDS_DIR}/imgui_impl_dx9.h)
75+
list(APPEND PUBLIC_CXX_FILES ${BACKENDS_DIR}/imgui_impl_dx9.cpp)
76+
list(APPEND IMGUI_INTERFACE_LIBS d3d9)
77+
endif()
78+
if(IMGUI_BACKEND_DX10)
79+
message(STATUS "[ImGui] Including backend api: [Direct3D10]")
80+
list(APPEND PUBLIC_H_FILES ${BACKENDS_DIR}/imgui_impl_dx10.h)
81+
list(APPEND PUBLIC_CXX_FILES ${BACKENDS_DIR}/imgui_impl_dx10.cpp)
82+
list(APPEND IMGUI_INTERFACE_LIBS d3d10)
83+
endif()
84+
if(IMGUI_BACKEND_DX11)
85+
message(STATUS "[ImGui] Including backend api: [Direct3D11]")
86+
list(APPEND PUBLIC_H_FILES ${BACKENDS_DIR}/imgui_impl_dx11.h)
87+
list(APPEND PUBLIC_CXX_FILES ${BACKENDS_DIR}/imgui_impl_dx11.cpp)
88+
list(APPEND IMGUI_INTERFACE_LIBS d3d11)
89+
endif()
90+
if(IMGUI_BACKEND_DX12)
91+
message(STATUS "[ImGui] Including backend api: [Direct3D12]")
92+
list(APPEND PUBLIC_H_FILES ${BACKENDS_DIR}/imgui_impl_dx12.h)
93+
list(APPEND PUBLIC_CXX_FILES ${BACKENDS_DIR}/imgui_impl_dx12.cpp)
94+
list(APPEND IMGUI_INTERFACE_LIBS d3d12)
95+
list(APPEND IMGUI_INTERFACE_LIBS dxgi)
96+
# list(APPEND IMGUI_INTERFACE_LIBS d3dcompiler)
97+
endif()
6998
endif()
7099

100+
set(PROJECT_FILES
101+
${PUBLIC_H_FILES}
102+
${PUBLIC_CXX_FILES}
103+
${FONTS_FILES}
104+
)
105+
71106

72107
##################################################################################################################
73-
# IDE Representation
108+
# IDE REPRESENTATION
74109
##################################################################################################################
110+
75111
# Groups CMake pre-defined projects:
76112
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
77-
78-
source_group("Header Files" FILES
79-
${HEADERS_CXX_FILES}
80-
)
81-
source_group("Header Files\\Impl" FILES
82-
${HEADERS_CXX_IMPL_FILES}
83-
)
84-
source_group("Source Files" FILES
85-
${SOURCES_CXX_FILES}
86-
)
87-
source_group("Source Files\\Impl" FILES
88-
${SOURCES_CXX_IMPL_FILES}
89-
)
90-
source_group("Resource Files" FILES
91-
${FONTS_FILES}
92-
)
113+
source_group("" FILES ${PUBLIC_H_FILES})
114+
source_group("" FILES ${PUBLIC_CXX_FILES})
115+
source_group("\\Fonts" FILES ${FONTS_FILES})
93116

94117

95118
##################################################################################################################
96-
# Target
119+
# TARGET
97120
##################################################################################################################
98-
add_library(${PROJECT_NAME}
99-
${HEADERS_CXX_FILES}
100-
${SOURCES_CXX_FILES}
101-
${HEADERS_CXX_IMPL_FILES}
102-
${SOURCES_CXX_IMPL_FILES}
103-
${FONTS_FILES}
121+
122+
if(IMGUI_STATIC_LIBRARY)
123+
message(STATUS "[ImGui] Building STATIC library")
124+
add_library(${PROJECT_NAME} STATIC ${PROJECT_FILES})
125+
else()
126+
message(STATUS "[ImGui] Building SHARED library")
127+
add_library(${PROJECT_NAME} SHARED ${PROJECT_FILES})
128+
endif()
129+
add_library(ImGui::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
130+
131+
target_include_directories(${PROJECT_NAME}
132+
PUBLIC
133+
$<BUILD_INTERFACE:${IMGUI_SOURCE_DIR}>
134+
$<BUILD_INTERFACE:${BACKENDS_DIR}>
135+
$<INSTALL_INTERFACE:include> # ${CMAKE_INSTALL_PREFIX}/include
104136
)
105-
target_include_directories(${PROJECT_NAME} PUBLIC
106-
${SOURCE_DIR}
107-
${SOURCE_DIR}/backends
137+
target_link_libraries(${PROJECT_NAME} INTERFACE ${IMGUI_INTERFACE_LIBS})
138+
139+
if(IMGUI_BACKEND_DX12)
140+
target_link_libraries(${PROJECT_NAME} PRIVATE d3d12 dxgi)
141+
target_compile_definitions(${PROJECT_NAME} PRIVATE ImTextureID=ImU64)
142+
endif()
143+
144+
target_compile_options(${PROJECT_NAME}
145+
PUBLIC
146+
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:Debug>:/MTd>>
147+
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:MinSizeRel>:/MT>>
148+
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:Release>:/MT>>
149+
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:RelWithDebInfo>:/MTd>>
108150
)
109-
if(IMGUI_IMPL_DX12 AND NOT IMGUI_STATIC_LIBRARY)
110-
target_link_libraries(${PROJECT_NAME} PUBLIC d3d12)
151+
152+
if(MSVC)
153+
if(IMGUI_STATIC_LIBRARY)
154+
set_property(TARGET ${PROJECT_NAME} PROPERTY WINDOWS_EXPORT_ALL_SYMBOLS OFF)
155+
else()
156+
set_property(TARGET ${PROJECT_NAME} PROPERTY WINDOWS_EXPORT_ALL_SYMBOLS ON)
157+
endif()
111158
endif()
112159

160+
set_target_properties(${PROJECT_NAME} PROPERTIES
161+
DEBUG_POSTFIX "${STATIC_POSTFIX}d"
162+
RELEASE_POSTFIX "${STATIC_POSTFIX}"
163+
MINSIZEREL_POSTFIX "${STATIC_POSTFIX}mr"
164+
RELWITHDEBINFO_POSTFIX "${STATIC_POSTFIX}rd"
165+
)
166+
113167

114168
##################################################################################################################
115-
# Target Install
169+
# INSTALL
116170
##################################################################################################################
117-
set (DISTRIBUTE_DIR ${CMAKE_BINARY_DIR}/dist/$<CONFIG>)
118-
install(
119-
TARGETS ${PROJECT_NAME}
120-
RUNTIME DESTINATION ${DISTRIBUTE_DIR}/bin
121-
LIBRARY DESTINATION ${DISTRIBUTE_DIR}/lib
122-
ARCHIVE DESTINATION ${DISTRIBUTE_DIR}/lib
171+
172+
set(CMAKE_PACKAGE_NAME "ImGui")
173+
string(TOLOWER ${CMAKE_PACKAGE_NAME} CMAKE_PACKAGE_NAME_LOWER)
174+
set(TARGETS_EXPORT_NAME "${CMAKE_PACKAGE_NAME}Targets")
175+
176+
install(TARGETS ${PROJECT_NAME}
177+
EXPORT ${TARGETS_EXPORT_NAME}
123178
)
124-
install(
125-
FILES ${HEADERS_CXX_FILES} ${HEADERS_CXX_IMPL_FILES}
126-
DESTINATION ${DISTRIBUTE_DIR}/include
179+
install(FILES ${PUBLIC_H_FILES}
180+
DESTINATION include/imgui
127181
)
128-
install(
129-
FILES ${FONTS_FILES}
130-
DESTINATION ${DISTRIBUTE_DIR}/misc/fonts
182+
install(FILES ${FONTS_FILES}
183+
DESTINATION misc/fonts
131184
)
132185

133-
# Install PDB files for VS builds to enable debugging:
134-
if (MSVC)
135-
if (NOT IMGUI_STATIC_LIBRARY)
136-
install(
137-
FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
138-
DESTINATION ${DISTRIBUTE_DIR}/lib
139-
CONFIGURATIONS Debug OR RelWithDebInfo
140-
COMPONENT libraries
141-
OPTIONAL
186+
if(MSVC)
187+
if(IMGUI_STATIC_LIBRARY)
188+
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/$<TARGET_FILE_BASE_NAME:${PROJECT_NAME}>.pdb
189+
DESTINATION lib
190+
CONFIGURATIONS Debug OR RelWithDebInfo
142191
)
143192
else()
144-
install(
145-
FILES
146-
$<$<CONFIG:Debug>:${CMAKE_BINARY_DIR}/bin/$<CONFIG>/${PROJECT_NAME}.pdb>
147-
$<$<CONFIG:RelWithDebInfo>:${CMAKE_BINARY_DIR}/${PROJECT_NAME}.dir/$<CONFIG>/${PROJECT_NAME}.pdb>
148-
DESTINATION ${DISTRIBUTE_DIR}/lib
149-
CONFIGURATIONS Debug OR RelWithDebInfo
150-
COMPONENT libraries
151-
OPTIONAL
193+
install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
194+
DESTINATION bin
195+
CONFIGURATIONS Debug OR RelWithDebInfo
152196
)
153197
endif()
154198
endif()
155199

200+
201+
##################################################################################################################
202+
# PACKAGE
203+
##################################################################################################################
204+
205+
include(CMakePackageConfigHelpers)
206+
207+
set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
208+
set(CMAKE_FILES_INSTALL_DIR "lib/cmake/${CMAKE_PACKAGE_NAME_LOWER}")
209+
set(VERSION_FILE "${GENERATED_DIR}/${CMAKE_PACKAGE_NAME}ConfigVersion.cmake")
210+
set(CONFIG_FILE "${GENERATED_DIR}/${CMAKE_PACKAGE_NAME}Config.cmake")
211+
212+
file(WRITE "${CONFIG_FILE}.in"
213+
"@PACKAGE_INIT@
214+
215+
include(\"\${CMAKE_CURRENT_LIST_DIR}/${TARGETS_EXPORT_NAME}.cmake\")
216+
")
217+
218+
write_basic_package_version_file(${VERSION_FILE} VERSION ${imgui_VERSION} COMPATIBILITY AnyNewerVersion)
219+
configure_package_config_file("${CONFIG_FILE}.in" ${CONFIG_FILE} INSTALL_DESTINATION ${CMAKE_FILES_INSTALL_DIR})
220+
221+
install(EXPORT ${TARGETS_EXPORT_NAME}
222+
NAMESPACE ${CMAKE_PACKAGE_NAME}::
223+
DESTINATION ${CMAKE_FILES_INSTALL_DIR}
224+
)
225+
install(FILES ${VERSION_FILE} ${CONFIG_FILE}
226+
DESTINATION ${CMAKE_FILES_INSTALL_DIR}
227+
)

0 commit comments

Comments
 (0)