CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. project(QtDialog)
  4. CMake_OPTIONAL_COMPONENT(cmake-gui)
  5. set(QT_COMPONENTS
  6. Core
  7. Widgets
  8. Gui
  9. )
  10. set(CMake_QT_MAJOR_VERSION "A" CACHE
  11. STRING "Expected Qt major version. Valid values are A (auto-select), 5, 6.")
  12. set(SUPPORTED_QT_VERSIONS "A" 5 6)
  13. set_property(CACHE CMake_QT_MAJOR_VERSION PROPERTY STRINGS ${SUPPORTED_QT_VERSIONS})
  14. if(NOT CMake_QT_MAJOR_VERSION STREQUAL "A")
  15. if(NOT CMake_QT_MAJOR_VERSION IN_LIST SUPPORTED_QT_VERSIONS)
  16. message(FATAL_ERROR "Supported Qt versions are \"${SUPPORTED_QT_VERSIONS}\"."
  17. " But CMake_QT_MAJOR_VERSION is set to ${CMake_QT_MAJOR_VERSION}.")
  18. endif()
  19. set(INSTALLED_QT_VERSION ${CMake_QT_MAJOR_VERSION})
  20. else()
  21. find_package(Qt6Widgets QUIET)
  22. set(INSTALLED_QT_VERSION 6)
  23. if(NOT Qt6Widgets_FOUND)
  24. find_package(Qt5Widgets QUIET)
  25. if(NOT Qt5Widgets_FOUND)
  26. message(FATAL_ERROR "Could not find a valid Qt installation.")
  27. endif()
  28. set(INSTALLED_QT_VERSION 5)
  29. endif()
  30. endif()
  31. find_package(Qt${INSTALLED_QT_VERSION}
  32. COMPONENTS ${QT_COMPONENTS}
  33. REQUIRED QUIET
  34. )
  35. set(CMake_QT_EXTRA_LIBRARIES)
  36. # Try to find the package WinExtras for the task bar progress
  37. if(WIN32)
  38. find_package(Qt${INSTALLED_QT_VERSION}WinExtras QUIET)
  39. if(Qt${INSTALLED_QT_VERSION}WinExtras_FOUND)
  40. add_compile_definitions(QT_WINEXTRAS)
  41. list(APPEND CMake_QT_EXTRA_LIBRARIES Qt${INSTALLED_QT_VERSION}::WinExtras)
  42. list(APPEND QT_COMPONENTS WinExtras)
  43. endif()
  44. endif()
  45. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt${INSTALLED_QT_VERSION}Widgets_EXECUTABLE_COMPILE_FLAGS}")
  46. if(CMake_QT_STATIC_QXcbIntegrationPlugin_LIBRARIES)
  47. list(APPEND CMake_QT_EXTRA_LIBRARIES ${CMake_QT_STATIC_QXcbIntegrationPlugin_LIBRARIES})
  48. set_property(SOURCE CMakeSetup.cxx
  49. PROPERTY COMPILE_DEFINITIONS USE_QXcbIntegrationPlugin)
  50. endif()
  51. if(CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES)
  52. list(APPEND CMake_QT_EXTRA_LIBRARIES ${CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES})
  53. set_property(SOURCE CMakeSetup.cxx
  54. PROPERTY COMPILE_DEFINITIONS USE_QWindowsIntegrationPlugin)
  55. endif()
  56. # We need to install platform plugin and add qt.conf for Qt5 on Mac and Windows.
  57. if(CMake_INSTALL_DEPENDENCIES AND (APPLE OR WIN32))
  58. function(_qt_get_plugin_name_with_version target out_var)
  59. string(REGEX REPLACE "^Qt::(.+)" "Qt${INSTALLED_QT_VERSION}::\\1"
  60. qt_plugin_with_version "${target}")
  61. if(TARGET "${qt_plugin_with_version}")
  62. set("${out_var}" "${qt_plugin_with_version}" PARENT_SCOPE)
  63. else()
  64. set("${out_var}" "" PARENT_SCOPE)
  65. endif()
  66. endfunction()
  67. macro(install_qt_plugin _qt_plugin_name _qt_plugins_var)
  68. if(TARGET "${_qt_plugin_name}")
  69. get_target_property(_qt_plugin_path "${_qt_plugin_name}" LOCATION)
  70. else()
  71. _qt_get_plugin_name_with_version("Qt::${_qt_plugin_name}" _qt_plugin_with_version_name)
  72. if(TARGET "${_qt_plugin_with_version_name}")
  73. get_target_property(_qt_plugin_path "${_qt_plugin_with_version_name}" LOCATION)
  74. endif()
  75. endif()
  76. if(EXISTS "${_qt_plugin_path}")
  77. get_filename_component(_qt_plugin_file "${_qt_plugin_path}" NAME)
  78. get_filename_component(_qt_plugin_type "${_qt_plugin_path}" PATH)
  79. get_filename_component(_qt_plugin_type "${_qt_plugin_type}" NAME)
  80. if(APPLE)
  81. set(_qt_plugin_dir "PlugIns")
  82. elseif(WIN32)
  83. set(_qt_plugin_dir "plugins")
  84. endif()
  85. set(_qt_plugin_dest "${_qt_plugin_dir}/${_qt_plugin_type}")
  86. install(FILES "${_qt_plugin_path}"
  87. DESTINATION "${_qt_plugin_dest}"
  88. ${COMPONENT})
  89. set(${_qt_plugins_var}
  90. "${${_qt_plugins_var}};\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${_qt_plugin_dest}/${_qt_plugin_file}")
  91. endif()
  92. endmacro()
  93. macro(install_qt_plugins _comps _plugins_var)
  94. foreach(_qt_comp IN LISTS ${_comps})
  95. if(INSTALLED_QT_VERSION VERSION_LESS 6)
  96. set(_qt_module_plugins ${Qt${INSTALLED_QT_VERSION}${_qt_comp}_PLUGINS})
  97. else()
  98. get_target_property(_qt_module_plugins Qt${INSTALLED_QT_VERSION}::${_qt_comp} QT_PLUGINS)
  99. endif()
  100. foreach(_qt_plugin IN LISTS _qt_module_plugins)
  101. if(INSTALLED_QT_VERSION VERSION_GREATER_EQUAL 6)
  102. # Qt6 provides the plugins as individual packages that need to be found.
  103. find_package(Qt${INSTALLED_QT_VERSION}${_qt_plugin} QUIET
  104. PATHS ${Qt${INSTALLED_QT_VERSION}${_qt_comp}_DIR})
  105. endif()
  106. install_qt_plugin("${_qt_plugin}" "${_plugins_var}")
  107. endforeach()
  108. endforeach()
  109. endmacro()
  110. if(APPLE)
  111. if(INSTALLED_QT_VERSION VERSION_EQUAL 5)
  112. install_qt_plugin("Qt5::QCocoaIntegrationPlugin" QT_PLUGINS)
  113. if(TARGET Qt5::QMacStylePlugin)
  114. install_qt_plugin("Qt5::QMacStylePlugin" QT_PLUGINS)
  115. endif()
  116. else()
  117. # FIXME: Minimize plugins for Qt6.
  118. install_qt_plugins(QT_COMPONENTS QT_PLUGINS)
  119. endif()
  120. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
  121. "[Paths]\nPlugins = ${_qt_plugin_dir}\n")
  122. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
  123. DESTINATION "${CMAKE_INSTALL_PREFIX}/Resources"
  124. ${COMPONENT})
  125. elseif(WIN32 AND NOT CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES)
  126. if(INSTALLED_QT_VERSION VERSION_EQUAL 5)
  127. install_qt_plugin("Qt5::QWindowsIntegrationPlugin" QT_PLUGINS)
  128. else()
  129. # FIXME: Minimize plugins for Qt6.
  130. install_qt_plugins(QT_COMPONENTS QT_PLUGINS)
  131. endif()
  132. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
  133. "[Paths]\nPlugins = ../${_qt_plugin_dir}\n")
  134. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
  135. DESTINATION bin
  136. ${COMPONENT})
  137. endif()
  138. endif()
  139. get_property(_Qt_Core_LOCATION TARGET Qt${INSTALLED_QT_VERSION}::Core PROPERTY LOCATION)
  140. get_filename_component(Qt_BIN_DIR "${_Qt_Core_LOCATION}" PATH)
  141. if(APPLE)
  142. get_filename_component(Qt_BIN_DIR "${Qt_BIN_DIR}" PATH)
  143. endif()
  144. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  145. add_library(
  146. CMakeGUILib STATIC
  147. AddCacheEntry.cxx
  148. AddCacheEntry.h
  149. CMakeSetupDialog.cxx
  150. CMakeSetupDialog.h
  151. Compilers.h
  152. EnvironmentDialog.cxx
  153. EnvironmentDialog.h
  154. FirstConfigure.cxx
  155. FirstConfigure.h
  156. QCMake.cxx
  157. QCMake.h
  158. QCMakeCacheView.cxx
  159. QCMakeCacheView.h
  160. QCMakePreset.cxx
  161. QCMakePreset.h
  162. QCMakePresetComboBox.cxx
  163. QCMakePresetComboBox.h
  164. QCMakePresetItemModel.cxx
  165. QCMakePresetItemModel.h
  166. QCMakeWidgets.cxx
  167. QCMakeWidgets.h
  168. RegexExplorer.cxx
  169. RegexExplorer.h
  170. WarningMessagesDialog.cxx
  171. WarningMessagesDialog.h
  172. )
  173. # CMake_QT_EXTRA_LIBRARIES have to come before the main libraries on the link line
  174. target_link_libraries(
  175. CMakeGUILib
  176. PUBLIC
  177. CMakeLib
  178. ${CMake_QT_EXTRA_LIBRARIES}
  179. Qt${INSTALLED_QT_VERSION}::Core
  180. Qt${INSTALLED_QT_VERSION}::Widgets
  181. )
  182. set(UI_SRCS
  183. CMakeSetupDialog.ui
  184. Compilers.ui
  185. CrossCompiler.ui
  186. AddCacheEntry.ui
  187. EnvironmentDialog.ui
  188. RegexExplorer.ui
  189. WarningMessagesDialog.ui
  190. )
  191. set(MOC_SRCS
  192. AddCacheEntry.h
  193. Compilers.h
  194. CMakeSetupDialog.h
  195. EnvironmentDialog.h
  196. FirstConfigure.h
  197. QCMake.h
  198. QCMakeCacheView.h
  199. QCMakePresetComboBox.h
  200. QCMakePresetItemModel.h
  201. QCMakeWidgets.h
  202. RegexExplorer.h
  203. WarningMessagesDialog.h
  204. )
  205. set(QRC_SRCS CMakeSetup.qrc)
  206. if(INSTALLED_QT_VERSION VERSION_LESS 6)
  207. qt5_wrap_ui(UI_BUILT_SRCS ${UI_SRCS})
  208. qt5_wrap_cpp(MOC_BUILT_SRCS ${MOC_SRCS})
  209. qt5_add_resources(QRC_BUILT_SRCS ${QRC_SRCS})
  210. else()
  211. qt_wrap_ui(UI_BUILT_SRCS ${UI_SRCS})
  212. qt_wrap_cpp(MOC_BUILT_SRCS ${MOC_SRCS})
  213. qt_add_resources(QRC_BUILT_SRCS ${QRC_SRCS})
  214. endif()
  215. add_library(CMakeGUIQRCLib OBJECT ${QRC_BUILT_SRCS})
  216. if(FALSE) # CMake's bootstrap binary does not support automoc
  217. set(CMAKE_AUTOMOC 1)
  218. set(CMAKE_AUTORCC 1)
  219. set(CMAKE_AUTOUIC 1)
  220. else()
  221. target_sources(
  222. CMakeGUILib
  223. PUBLIC
  224. ${UI_BUILT_SRCS}
  225. ${MOC_BUILT_SRCS}
  226. )
  227. endif()
  228. if(USE_LGPL)
  229. install(FILES ${CMake_SOURCE_DIR}/Licenses/LGPLv${USE_LGPL}.txt
  230. DESTINATION ${CMAKE_DATA_DIR}/Licenses
  231. ${COMPONENT})
  232. set_property(SOURCE CMakeSetupDialog.cxx
  233. PROPERTY COMPILE_DEFINITIONS USE_LGPL="${USE_LGPL}")
  234. endif()
  235. add_library(CMakeGUIMainLib STATIC CMakeSetup.cxx)
  236. target_link_libraries(CMakeGUIMainLib PUBLIC CMakeGUILib)
  237. add_executable(cmake-gui WIN32 MACOSX_BUNDLE CMakeGUIExec.cxx ${MANIFEST_FILE})
  238. target_link_libraries(cmake-gui CMakeGUIMainLib Qt${INSTALLED_QT_VERSION}::Core)
  239. target_sources(CMakeGUIMainLib INTERFACE $<TARGET_OBJECTS:CMakeGUIQRCLib>)
  240. if(WIN32)
  241. target_sources(CMakeGUIMainLib INTERFACE $<TARGET_OBJECTS:CMakeVersion> CMakeSetup.rc)
  242. endif()
  243. if(APPLE)
  244. target_sources(CMakeGUIMainLib INTERFACE CMakeSetup.icns)
  245. set(MACOSX_BUNDLE_ICON_FILE CMakeSetup.icns)
  246. set_source_files_properties(CMakeSetup.icns PROPERTIES
  247. MACOSX_PACKAGE_LOCATION Resources)
  248. endif()
  249. if(CMake_JOB_POOL_LINK_BIN)
  250. set_property(TARGET cmake-gui PROPERTY JOB_POOL_LINK "link-bin")
  251. endif()
  252. # cmake-gui has not been updated for `include-what-you-use`.
  253. # Block the tool until this is done.
  254. set_target_properties(CMakeGUILib CMakeGUIMainLib cmake-gui PROPERTIES
  255. CXX_INCLUDE_WHAT_YOU_USE ""
  256. )
  257. # Files generated by MOC, RCC, and UIC may produce clang-tidy warnings.
  258. # We generate a dummy .clang-tidy file in the binary directory that disables
  259. # all clang-tidy checks except one that will never match. This one check is
  260. # necessary; clang-tidy reports an error when no checks are enabled.
  261. # Since the Qt code generators will generate source files in the binary tree,
  262. # clang-tidy will load the configuration from this dummy file when the sources
  263. # are built.
  264. file(WRITE "${QtDialog_BINARY_DIR}/.clang-tidy" "
  265. ---
  266. Checks: '-*,llvm-twine-local'
  267. ...
  268. ")
  269. if(APPLE)
  270. file(STRINGS "${CMake_SOURCE_DIR}/Copyright.txt" copyright_line
  271. LIMIT_COUNT 1 REGEX "^Copyright 2000-20[0-9][0-9] Kitware")
  272. set_target_properties(cmake-gui PROPERTIES
  273. OUTPUT_NAME CMake
  274. MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in"
  275. MACOSX_BUNDLE_SHORT_VERSION_STRING "${CMAKE_BUNDLE_VERSION}"
  276. # TBD: MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_BUNDLE_VERSION}"
  277. MACOSX_BUNDLE_COPYRIGHT "${copyright_line}"
  278. MACOSX_BUNDLE_GUI_IDENTIFIER "org.cmake.cmake"
  279. )
  280. # Create a symlink in the build tree to provide a "cmake-gui" next
  281. # to the "cmake" executable that refers to the application bundle.
  282. add_custom_command(TARGET cmake-gui POST_BUILD
  283. COMMAND ln -sf CMake.app/Contents/MacOS/CMake
  284. $<TARGET_FILE_DIR:cmake>/cmake-gui
  285. )
  286. endif()
  287. set(CMAKE_INSTALL_DESTINATION_ARGS
  288. BUNDLE DESTINATION "${CMAKE_BUNDLE_LOCATION}" ${COMPONENT})
  289. install(TARGETS cmake-gui
  290. RUNTIME DESTINATION bin ${COMPONENT}
  291. ${CMAKE_INSTALL_DESTINATION_ARGS})
  292. if(UNIX AND NOT APPLE)
  293. foreach(size IN ITEMS 32 128)
  294. install(
  295. FILES "${CMAKE_CURRENT_SOURCE_DIR}/CMakeSetup${size}.png"
  296. DESTINATION "${CMAKE_XDGDATA_DIR}/icons/hicolor/${size}x${size}/apps"
  297. ${COMPONENT}
  298. RENAME "CMakeSetup.png")
  299. endforeach()
  300. # install a desktop file so CMake appears in the application start menu
  301. # with an icon
  302. install(FILES cmake-gui.desktop
  303. DESTINATION "${CMAKE_XDGDATA_DIR}/applications"
  304. ${COMPONENT})
  305. install(FILES cmakecache.xml
  306. DESTINATION "${CMAKE_XDGDATA_DIR}/mime/packages"
  307. ${COMPONENT})
  308. endif()
  309. if(APPLE)
  310. install(CODE "
  311. execute_process(COMMAND ln -s \"../MacOS/CMake\" cmake-gui
  312. WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)
  313. " ${COMPONENT})
  314. endif()
  315. if(CMake_INSTALL_DEPENDENCIES AND (APPLE OR WIN32))
  316. # install rules for including 3rd party libs such as Qt
  317. # if a system Qt is used (e.g. installed in /usr/lib/), it will not be included in the installation
  318. set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/cmake-gui${CMAKE_EXECUTABLE_SUFFIX}")
  319. if(APPLE)
  320. set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/MacOS/CMake")
  321. endif()
  322. install(CODE "
  323. include(\"${CMake_SOURCE_DIR}/Modules/BundleUtilities.cmake\")
  324. set(BU_CHMOD_BUNDLE_ITEMS ON)
  325. fixup_bundle(\"${fixup_exe}\" \"${QT_PLUGINS}\" \"${Qt_BIN_DIR};${QT_LIBRARY_DIR};${QT_BINARY_DIR}\")
  326. " ${COMPONENT})
  327. endif()
  328. set(CMAKE_PACKAGE_QTGUI TRUE)
  329. configure_file(QtDialogCPack.cmake.in QtDialogCPack.cmake @ONLY)