Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Source / QtDialog / CMakeLists.txt
1 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3
4 project(QtDialog)
5 CMake_OPTIONAL_COMPONENT(cmake-gui)
6 set(QT_COMPONENTS
7   Core
8   Widgets
9   Gui
10 )
11
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}.")
20   endif()
21   set(INSTALLED_QT_VERSION ${CMake_QT_MAJOR_VERSION})
22 else()
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.")
29     endif()
30     set(INSTALLED_QT_VERSION 5)
31   endif()
32 endif()
33
34 find_package(Qt${INSTALLED_QT_VERSION}
35     COMPONENTS ${QT_COMPONENTS}
36     REQUIRED QUIET
37 )
38
39 set(CMake_QT_EXTRA_LIBRARIES)
40
41 # Try to find the package WinExtras for the task bar progress
42 if(WIN32)
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)
48   endif()
49 endif()
50
51 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt${INSTALLED_QT_VERSION}Widgets_EXECUTABLE_COMPILE_FLAGS}")
52
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)
57 endif()
58
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)
63 endif()
64
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)
72       else()
73           set("${out_var}" "" PARENT_SCOPE)
74       endif()
75   endfunction()
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)
79     else()
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)
83       endif()
84     endif()
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)
89       if(APPLE)
90         set(_qt_plugin_dir "PlugIns")
91       elseif(WIN32)
92         set(_qt_plugin_dir "plugins")
93       endif()
94       set(_qt_plugin_dest "${_qt_plugin_dir}/${_qt_plugin_type}")
95       install(FILES "${_qt_plugin_path}"
96         DESTINATION "${_qt_plugin_dest}"
97         ${COMPONENT})
98       set(${_qt_plugins_var}
99         "${${_qt_plugins_var}};\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${_qt_plugin_dest}/${_qt_plugin_file}")
100     endif()
101   endmacro()
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})
106       else()
107         get_target_property(_qt_module_plugins Qt${INSTALLED_QT_VERSION}::${_qt_comp} QT_PLUGINS)
108       endif()
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})
114         endif()
115         install_qt_plugin("${_qt_plugin}" "${_plugins_var}")
116       endforeach()
117     endforeach()
118   endmacro()
119   if(APPLE)
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)
124       endif()
125     else()
126       # FIXME: Minimize plugins for Qt6.
127       install_qt_plugins(QT_COMPONENTS QT_PLUGINS)
128     endif()
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"
133       ${COMPONENT})
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)
137     else()
138       # FIXME: Minimize plugins for Qt6.
139       install_qt_plugins(QT_COMPONENTS QT_PLUGINS)
140     endif()
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"
144       DESTINATION bin
145       ${COMPONENT})
146   endif()
147 endif()
148
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)
151 if(APPLE)
152   get_filename_component(Qt_BIN_DIR "${Qt_BIN_DIR}" PATH)
153 endif()
154
155 set(CMAKE_INCLUDE_CURRENT_DIR ON)
156
157 add_library(
158   CMakeGUILib STATIC
159   AddCacheEntry.cxx
160   AddCacheEntry.h
161   CMakeSetupDialog.cxx
162   CMakeSetupDialog.h
163   Compilers.h
164   EnvironmentDialog.cxx
165   EnvironmentDialog.h
166   FirstConfigure.cxx
167   FirstConfigure.h
168   QCMake.cxx
169   QCMake.h
170   QCMakeCacheView.cxx
171   QCMakeCacheView.h
172   QCMakePreset.cxx
173   QCMakePreset.h
174   QCMakePresetComboBox.cxx
175   QCMakePresetComboBox.h
176   QCMakePresetItemModel.cxx
177   QCMakePresetItemModel.h
178   QCMakeWidgets.cxx
179   QCMakeWidgets.h
180   RegexExplorer.cxx
181   RegexExplorer.h
182   WarningMessagesDialog.cxx
183   WarningMessagesDialog.h
184   )
185 # CMake_QT_EXTRA_LIBRARIES have to come before the main libraries on the link line
186 target_link_libraries(
187   CMakeGUILib
188   PUBLIC
189     CMakeLib
190     ${CMake_QT_EXTRA_LIBRARIES}
191     Qt${INSTALLED_QT_VERSION}::Core
192     Qt${INSTALLED_QT_VERSION}::Widgets
193   )
194
195 set(UI_SRCS
196   CMakeSetupDialog.ui
197   Compilers.ui
198   CrossCompiler.ui
199   AddCacheEntry.ui
200   EnvironmentDialog.ui
201   RegexExplorer.ui
202   WarningMessagesDialog.ui
203   )
204 set(MOC_SRCS
205   AddCacheEntry.h
206   Compilers.h
207   CMakeSetupDialog.h
208   EnvironmentDialog.h
209   FirstConfigure.h
210   QCMake.h
211   QCMakeCacheView.h
212   QCMakePresetComboBox.h
213   QCMakePresetItemModel.h
214   QCMakeWidgets.h
215   RegexExplorer.h
216   WarningMessagesDialog.h
217   )
218 set(QRC_SRCS CMakeSetup.qrc)
219
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})
224 else()
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})
228 endif()
229 add_library(CMakeGUIQRCLib OBJECT ${QRC_BUILT_SRCS})
230
231 if(FALSE) # CMake's bootstrap binary does not support automoc
232   set(CMAKE_AUTOMOC 1)
233   set(CMAKE_AUTORCC 1)
234   set(CMAKE_AUTOUIC 1)
235 else()
236   target_sources(
237     CMakeGUILib
238     PRIVATE
239       ${UI_BUILT_SRCS}
240       ${MOC_BUILT_SRCS}
241   )
242 endif()
243
244 if(USE_LGPL)
245   install(FILES ${CMake_SOURCE_DIR}/Licenses/LGPLv${USE_LGPL}.txt
246     DESTINATION ${CMAKE_DATA_DIR}/Licenses
247     ${COMPONENT})
248   set_property(SOURCE CMakeSetupDialog.cxx
249     PROPERTY COMPILE_DEFINITIONS USE_LGPL="${USE_LGPL}")
250 endif()
251
252 add_library(CMakeGUIMainLib STATIC CMakeSetup.cxx)
253 target_link_libraries(
254   CMakeGUIMainLib
255   PUBLIC
256     CMakeGUILib
257   )
258
259 add_executable(cmake-gui WIN32 MACOSX_BUNDLE CMakeGUIExec.cxx)
260 target_link_libraries(cmake-gui
261   PRIVATE
262     CMakeGUIMainLib
263     CMakeGUIQRCLib
264     $<TARGET_NAME_IF_EXISTS:CMakeVersion>
265     ManifestLib
266     Qt${INSTALLED_QT_VERSION}::Core
267   )
268
269 if(WIN32)
270   target_sources(CMakeGUIMainLib INTERFACE CMakeSetup.rc)
271 endif()
272 if(APPLE)
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)
277 endif()
278
279 if(CMake_JOB_POOL_LINK_BIN)
280   set_property(TARGET cmake-gui PROPERTY JOB_POOL_LINK "link-bin")
281 endif()
282
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 ""
287   )
288
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
295 # are built.
296 file(WRITE "${QtDialog_BINARY_DIR}/.clang-tidy" "
297 ---
298 Checks: '-*,llvm-twine-local'
299 ...
300 ")
301
302 if(APPLE)
303   file(STRINGS "${CMake_SOURCE_DIR}/Copyright.txt" copyright_line
304     LIMIT_COUNT 1 REGEX "^Copyright 2000-20[0-9][0-9] Kitware")
305
306   set_target_properties(cmake-gui PROPERTIES
307     OUTPUT_NAME CMake
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"
313     )
314
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
320     )
321 endif()
322
323 install(TARGETS cmake-gui
324   RUNTIME DESTINATION bin ${COMPONENT}
325   BUNDLE DESTINATION "${CMAKE_BUNDLE_LOCATION}" ${COMPONENT})
326
327 if(UNIX AND NOT APPLE)
328   foreach(size IN ITEMS 32 128)
329     install(
330       FILES       "${CMAKE_CURRENT_SOURCE_DIR}/CMakeSetup${size}.png"
331       DESTINATION "${CMAKE_XDGDATA_DIR}/icons/hicolor/${size}x${size}/apps"
332       ${COMPONENT}
333       RENAME      "CMakeSetup.png")
334   endforeach()
335
336   # install a desktop file so CMake appears in the application start menu
337   # with an icon
338   install(FILES cmake-gui.desktop
339     DESTINATION "${CMAKE_XDGDATA_DIR}/applications"
340     ${COMPONENT})
341   install(FILES cmakecache.xml
342     DESTINATION "${CMAKE_XDGDATA_DIR}/mime/packages"
343     ${COMPONENT})
344 endif()
345
346 if(APPLE)
347   install(CODE "
348     execute_process(COMMAND ln -s \"../MacOS/CMake\" cmake-gui
349         WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)
350   " ${COMPONENT})
351 endif()
352
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}")
357   if(APPLE)
358     set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/MacOS/CMake")
359   endif()
360   install(CODE "
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}\")
364   " ${COMPONENT})
365 endif()
366
367 set(CMAKE_PACKAGE_QTGUI TRUE)
368 configure_file(QtDialogCPack.cmake.in QtDialogCPack.cmake @ONLY)