1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
5 CMake_OPTIONAL_COMPONENT(cmake-gui)
12 set(CMake_QT_MAJOR_VERSION "A" CACHE
13 STRING "Expected Qt major version. Valid values are A (auto-select), 5, 6.")
14 set(SUPPORTED_QT_VERSIONS "A" 5 6)
15 set_property(CACHE CMake_QT_MAJOR_VERSION PROPERTY STRINGS ${SUPPORTED_QT_VERSIONS})
16 if(NOT CMake_QT_MAJOR_VERSION STREQUAL "A")
17 if(NOT CMake_QT_MAJOR_VERSION IN_LIST SUPPORTED_QT_VERSIONS)
18 message(FATAL_ERROR "Supported Qt versions are \"${SUPPORTED_QT_VERSIONS}\"."
19 " But CMake_QT_MAJOR_VERSION is set to ${CMake_QT_MAJOR_VERSION}.")
21 set(INSTALLED_QT_VERSION ${CMake_QT_MAJOR_VERSION})
23 find_package(Qt6Widgets QUIET)
24 set(INSTALLED_QT_VERSION 6)
25 if(NOT Qt6Widgets_FOUND)
26 find_package(Qt5Widgets QUIET)
27 if(NOT Qt5Widgets_FOUND)
28 message(FATAL_ERROR "Could not find a valid Qt installation.")
30 set(INSTALLED_QT_VERSION 5)
34 find_package(Qt${INSTALLED_QT_VERSION}
35 COMPONENTS ${QT_COMPONENTS}
39 set(CMake_QT_EXTRA_LIBRARIES)
41 # Try to find the package WinExtras for the task bar progress
43 find_package(Qt${INSTALLED_QT_VERSION}WinExtras QUIET)
44 if(Qt${INSTALLED_QT_VERSION}WinExtras_FOUND)
45 add_compile_definitions(QT_WINEXTRAS)
46 list(APPEND CMake_QT_EXTRA_LIBRARIES Qt${INSTALLED_QT_VERSION}::WinExtras)
47 list(APPEND QT_COMPONENTS WinExtras)
51 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt${INSTALLED_QT_VERSION}Widgets_EXECUTABLE_COMPILE_FLAGS}")
53 if(CMake_QT_STATIC_QXcbIntegrationPlugin_LIBRARIES)
54 list(APPEND CMake_QT_EXTRA_LIBRARIES ${CMake_QT_STATIC_QXcbIntegrationPlugin_LIBRARIES})
55 set_property(SOURCE CMakeSetup.cxx
56 PROPERTY COMPILE_DEFINITIONS USE_QXcbIntegrationPlugin)
59 if(CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES)
60 list(APPEND CMake_QT_EXTRA_LIBRARIES ${CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES})
61 set_property(SOURCE CMakeSetup.cxx
62 PROPERTY COMPILE_DEFINITIONS USE_QWindowsIntegrationPlugin)
65 # We need to install platform plugin and add qt.conf for Qt5 on Mac and Windows.
66 if(CMake_INSTALL_DEPENDENCIES AND (APPLE OR WIN32))
67 function(_qt_get_plugin_name_with_version target out_var)
68 string(REGEX REPLACE "^Qt::(.+)" "Qt${INSTALLED_QT_VERSION}::\\1"
69 qt_plugin_with_version "${target}")
70 if(TARGET "${qt_plugin_with_version}")
71 set("${out_var}" "${qt_plugin_with_version}" PARENT_SCOPE)
73 set("${out_var}" "" PARENT_SCOPE)
76 macro(install_qt_plugin _qt_plugin_name _qt_plugins_var)
77 if(TARGET "${_qt_plugin_name}")
78 get_target_property(_qt_plugin_path "${_qt_plugin_name}" LOCATION)
80 _qt_get_plugin_name_with_version("Qt::${_qt_plugin_name}" _qt_plugin_with_version_name)
81 if(TARGET "${_qt_plugin_with_version_name}")
82 get_target_property(_qt_plugin_path "${_qt_plugin_with_version_name}" LOCATION)
85 if(EXISTS "${_qt_plugin_path}")
86 get_filename_component(_qt_plugin_file "${_qt_plugin_path}" NAME)
87 get_filename_component(_qt_plugin_type "${_qt_plugin_path}" PATH)
88 get_filename_component(_qt_plugin_type "${_qt_plugin_type}" NAME)
90 set(_qt_plugin_dir "PlugIns")
92 set(_qt_plugin_dir "plugins")
94 set(_qt_plugin_dest "${_qt_plugin_dir}/${_qt_plugin_type}")
95 install(FILES "${_qt_plugin_path}"
96 DESTINATION "${_qt_plugin_dest}"
98 set(${_qt_plugins_var}
99 "${${_qt_plugins_var}};\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${_qt_plugin_dest}/${_qt_plugin_file}")
102 macro(install_qt_plugins _comps _plugins_var)
103 foreach(_qt_comp IN LISTS ${_comps})
104 if(INSTALLED_QT_VERSION VERSION_LESS 6)
105 set(_qt_module_plugins ${Qt${INSTALLED_QT_VERSION}${_qt_comp}_PLUGINS})
107 get_target_property(_qt_module_plugins Qt${INSTALLED_QT_VERSION}::${_qt_comp} QT_PLUGINS)
109 foreach(_qt_plugin IN LISTS _qt_module_plugins)
110 if(INSTALLED_QT_VERSION VERSION_GREATER_EQUAL 6)
111 # Qt6 provides the plugins as individual packages that need to be found.
112 find_package(Qt${INSTALLED_QT_VERSION}${_qt_plugin} QUIET
113 PATHS ${Qt${INSTALLED_QT_VERSION}${_qt_comp}_DIR})
115 install_qt_plugin("${_qt_plugin}" "${_plugins_var}")
120 if(INSTALLED_QT_VERSION VERSION_EQUAL 5)
121 install_qt_plugin("Qt5::QCocoaIntegrationPlugin" QT_PLUGINS)
122 if(TARGET Qt5::QMacStylePlugin)
123 install_qt_plugin("Qt5::QMacStylePlugin" QT_PLUGINS)
126 # FIXME: Minimize plugins for Qt6.
127 install_qt_plugins(QT_COMPONENTS QT_PLUGINS)
129 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
130 "[Paths]\nPlugins = ${_qt_plugin_dir}\n")
131 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
132 DESTINATION "${CMAKE_INSTALL_PREFIX}/Resources"
134 elseif(WIN32 AND NOT CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES)
135 if(INSTALLED_QT_VERSION VERSION_EQUAL 5)
136 install_qt_plugin("Qt5::QWindowsIntegrationPlugin" QT_PLUGINS)
138 # FIXME: Minimize plugins for Qt6.
139 install_qt_plugins(QT_COMPONENTS QT_PLUGINS)
141 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
142 "[Paths]\nPlugins = ../${_qt_plugin_dir}\n")
143 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
149 get_property(_Qt_Core_LOCATION TARGET Qt${INSTALLED_QT_VERSION}::Core PROPERTY LOCATION)
150 get_filename_component(Qt_BIN_DIR "${_Qt_Core_LOCATION}" PATH)
152 get_filename_component(Qt_BIN_DIR "${Qt_BIN_DIR}" PATH)
155 set(CMAKE_INCLUDE_CURRENT_DIR ON)
164 EnvironmentDialog.cxx
174 QCMakePresetComboBox.cxx
175 QCMakePresetComboBox.h
176 QCMakePresetItemModel.cxx
177 QCMakePresetItemModel.h
182 WarningMessagesDialog.cxx
183 WarningMessagesDialog.h
185 # CMake_QT_EXTRA_LIBRARIES have to come before the main libraries on the link line
186 target_link_libraries(
190 ${CMake_QT_EXTRA_LIBRARIES}
191 Qt${INSTALLED_QT_VERSION}::Core
192 Qt${INSTALLED_QT_VERSION}::Widgets
202 WarningMessagesDialog.ui
212 QCMakePresetComboBox.h
213 QCMakePresetItemModel.h
216 WarningMessagesDialog.h
218 set(QRC_SRCS CMakeSetup.qrc)
220 if(INSTALLED_QT_VERSION VERSION_LESS 6)
221 qt5_wrap_ui(UI_BUILT_SRCS ${UI_SRCS})
222 qt5_wrap_cpp(MOC_BUILT_SRCS ${MOC_SRCS})
223 qt5_add_resources(QRC_BUILT_SRCS ${QRC_SRCS})
225 qt_wrap_ui(UI_BUILT_SRCS ${UI_SRCS})
226 qt_wrap_cpp(MOC_BUILT_SRCS ${MOC_SRCS})
227 qt_add_resources(QRC_BUILT_SRCS ${QRC_SRCS})
229 add_library(CMakeGUIQRCLib OBJECT ${QRC_BUILT_SRCS})
231 if(FALSE) # CMake's bootstrap binary does not support automoc
245 install(FILES ${CMake_SOURCE_DIR}/Licenses/LGPLv${USE_LGPL}.txt
246 DESTINATION ${CMAKE_DATA_DIR}/Licenses
248 set_property(SOURCE CMakeSetupDialog.cxx
249 PROPERTY COMPILE_DEFINITIONS USE_LGPL="${USE_LGPL}")
252 add_library(CMakeGUIMainLib STATIC CMakeSetup.cxx)
253 target_link_libraries(
259 add_executable(cmake-gui WIN32 MACOSX_BUNDLE CMakeGUIExec.cxx)
260 target_link_libraries(cmake-gui
264 $<TARGET_NAME_IF_EXISTS:CMakeVersion>
266 Qt${INSTALLED_QT_VERSION}::Core
270 target_sources(CMakeGUIMainLib INTERFACE CMakeSetup.rc)
273 target_sources(CMakeGUIMainLib INTERFACE CMakeSetup.icns)
274 set(MACOSX_BUNDLE_ICON_FILE CMakeSetup.icns)
275 set_source_files_properties(CMakeSetup.icns PROPERTIES
276 MACOSX_PACKAGE_LOCATION Resources)
279 if(CMake_JOB_POOL_LINK_BIN)
280 set_property(TARGET cmake-gui PROPERTY JOB_POOL_LINK "link-bin")
283 # cmake-gui has not been updated for `include-what-you-use`.
284 # Block the tool until this is done.
285 set_target_properties(CMakeGUILib CMakeGUIMainLib cmake-gui PROPERTIES
286 CXX_INCLUDE_WHAT_YOU_USE ""
289 # Files generated by MOC, RCC, and UIC may produce clang-tidy warnings.
290 # We generate a dummy .clang-tidy file in the binary directory that disables
291 # all clang-tidy checks except one that will never match. This one check is
292 # necessary; clang-tidy reports an error when no checks are enabled.
293 # Since the Qt code generators will generate source files in the binary tree,
294 # clang-tidy will load the configuration from this dummy file when the sources
296 file(WRITE "${QtDialog_BINARY_DIR}/.clang-tidy" "
298 Checks: '-*,llvm-twine-local'
303 file(STRINGS "${CMake_SOURCE_DIR}/Copyright.txt" copyright_line
304 LIMIT_COUNT 1 REGEX "^Copyright 2000-20[0-9][0-9] Kitware")
306 set_target_properties(cmake-gui PROPERTIES
308 MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in"
309 MACOSX_BUNDLE_SHORT_VERSION_STRING "${CMAKE_BUNDLE_VERSION}"
310 # TBD: MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_BUNDLE_VERSION}"
311 MACOSX_BUNDLE_COPYRIGHT "${copyright_line}"
312 MACOSX_BUNDLE_GUI_IDENTIFIER "org.cmake.cmake"
315 # Create a symlink in the build tree to provide a "cmake-gui" next
316 # to the "cmake" executable that refers to the application bundle.
317 add_custom_command(TARGET cmake-gui POST_BUILD
318 COMMAND ln -sf CMake.app/Contents/MacOS/CMake
319 $<TARGET_FILE_DIR:cmake>/cmake-gui
323 install(TARGETS cmake-gui
324 RUNTIME DESTINATION bin ${COMPONENT}
325 BUNDLE DESTINATION "${CMAKE_BUNDLE_LOCATION}" ${COMPONENT})
327 if(UNIX AND NOT APPLE)
328 foreach(size IN ITEMS 32 128)
330 FILES "${CMAKE_CURRENT_SOURCE_DIR}/CMakeSetup${size}.png"
331 DESTINATION "${CMAKE_XDGDATA_DIR}/icons/hicolor/${size}x${size}/apps"
333 RENAME "CMakeSetup.png")
336 # install a desktop file so CMake appears in the application start menu
338 install(FILES cmake-gui.desktop
339 DESTINATION "${CMAKE_XDGDATA_DIR}/applications"
341 install(FILES cmakecache.xml
342 DESTINATION "${CMAKE_XDGDATA_DIR}/mime/packages"
348 execute_process(COMMAND ln -s \"../MacOS/CMake\" cmake-gui
349 WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)
353 if(CMake_INSTALL_DEPENDENCIES AND (APPLE OR WIN32))
354 # install rules for including 3rd party libs such as Qt
355 # if a system Qt is used (e.g. installed in /usr/lib/), it will not be included in the installation
356 set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/cmake-gui${CMAKE_EXECUTABLE_SUFFIX}")
358 set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/MacOS/CMake")
361 include(\"${CMake_SOURCE_DIR}/Modules/BundleUtilities.cmake\")
362 set(BU_CHMOD_BUNDLE_ITEMS ON)
363 fixup_bundle(\"${fixup_exe}\" \"${QT_PLUGINS}\" \"${Qt_BIN_DIR};${QT_LIBRARY_DIR};${QT_BINARY_DIR}\")
367 set(CMAKE_PACKAGE_QTGUI TRUE)
368 configure_file(QtDialogCPack.cmake.in QtDialogCPack.cmake @ONLY)