Warning, /plasma/kwin/CMakeLists.txt is written in an unsupported language. File is not indexed.
0001 cmake_minimum_required(VERSION 3.16) 0002 0003 set(PROJECT_VERSION "5.27.10") # Handled by release scripts 0004 project(KWin VERSION ${PROJECT_VERSION}) 0005 0006 set(CMAKE_C_STANDARD 99) 0007 set(CMAKE_CXX_STANDARD 20) 0008 set(CMAKE_CXX_STANDARD_REQUIRED ON) 0009 0010 set(QT_MIN_VERSION "5.15.2") 0011 set(KF5_MIN_VERSION "5.102.0") 0012 set(KDE_COMPILERSETTINGS_LEVEL "5.82") 0013 0014 find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) 0015 0016 # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked 0017 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${ECM_MODULE_PATH}) 0018 0019 include(CMakeDependentOption) 0020 include(CMakePackageConfigHelpers) 0021 include(FeatureSummary) 0022 include(WriteBasicConfigVersionFile) 0023 include(GenerateExportHeader) 0024 include(CheckCXXCompilerFlag) 0025 include(CheckIncludeFile) 0026 include(CheckIncludeFiles) 0027 include(CheckSymbolExists) 0028 0029 include(KDEInstallDirs) 0030 include(KDECMakeSettings) 0031 include(KDECompilerSettings NO_POLICY_SCOPE) 0032 include(KDEClangFormat) 0033 include(KDEGitCommitHooks) 0034 0035 include(ECMFindQmlModule) 0036 include(ECMInstallIcons) 0037 include(ECMOptionalAddSubdirectory) 0038 include(ECMConfiguredInstall) 0039 include(ECMQtDeclareLoggingCategory) 0040 0041 find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS 0042 Concurrent 0043 Core 0044 DBus 0045 Network 0046 Quick 0047 UiTools 0048 Widgets 0049 ) 0050 if (QT_MAJOR_VERSION EQUAL "5") 0051 find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS X11Extras) 0052 find_package(Qt5XkbCommonSupport REQUIRED) 0053 else() 0054 find_package(Qt6 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS WaylandClient ShaderTools) 0055 if (Qt6WaylandClient_VERSION VERSION_LESS "6.4.1") # TODO Plasma 6: Drop once minimum Qt version is 6.4.1+ 0056 include(Qt6WaylandClientMacrosKde) 0057 endif() 0058 endif() 0059 0060 find_package(Qt${QT_MAJOR_VERSION}Test ${QT_MIN_VERSION} CONFIG QUIET) 0061 set_package_properties(Qt${QT_MAJOR_VERSION}Test PROPERTIES 0062 PURPOSE "Required for tests" 0063 TYPE OPTIONAL 0064 ) 0065 add_feature_info("Qt${QT_MAJOR_VERSION}Test" Qt${QT_MAJOR_VERSION}Test_FOUND "Required for building tests") 0066 if (NOT Qt${QT_MAJOR_VERSION}Test_FOUND) 0067 set(BUILD_TESTING OFF CACHE BOOL "Build the testing tree.") 0068 endif() 0069 0070 # required frameworks by Core 0071 find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS 0072 Auth 0073 Config 0074 ConfigWidgets 0075 CoreAddons 0076 Crash 0077 DBusAddons 0078 GlobalAccel 0079 I18n 0080 IdleTime 0081 Package 0082 Plasma 0083 WidgetsAddons 0084 WindowSystem 0085 ) 0086 # required frameworks by config modules 0087 find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS 0088 Declarative 0089 KCMUtils 0090 NewStuff 0091 Service 0092 XmlGui 0093 ) 0094 0095 find_package(Threads) 0096 set_package_properties(Threads PROPERTIES 0097 PURPOSE "Needed for VirtualTerminal support in KWin Wayland" 0098 TYPE REQUIRED 0099 ) 0100 0101 find_package(KF5Wayland ${KF5_MIN_VERSION} CONFIG) 0102 set_package_properties(KF5Wayland PROPERTIES 0103 PURPOSE "Required to build wayland platform plugin and tests" 0104 TYPE REQUIRED 0105 ) 0106 0107 # optional frameworks 0108 find_package(KF5Activities ${KF5_MIN_VERSION} CONFIG) 0109 set_package_properties(KF5Activities PROPERTIES 0110 PURPOSE "Enable building of KWin with kactivities support" 0111 TYPE OPTIONAL 0112 ) 0113 add_feature_info("KF5Activities" KF5Activities_FOUND "Enable building of KWin with kactivities support") 0114 0115 find_package(KF5DocTools ${KF5_MIN_VERSION} CONFIG) 0116 set_package_properties(KF5DocTools PROPERTIES 0117 PURPOSE "Enable building documentation" 0118 TYPE OPTIONAL 0119 ) 0120 add_feature_info("KF5DocTools" KF5DocTools_FOUND "Enable building documentation") 0121 0122 find_package(KF5Runner ${KF5_MIN_VERSION} CONFIG) 0123 set_package_properties(KF5Runner PROPERTIES 0124 PURPOSE "Enable building of KWin with krunner support" 0125 TYPE OPTIONAL 0126 ) 0127 add_feature_info("KF5Runner" KF5Runner_FOUND "Enable building of KWin with krunner support") 0128 0129 find_package(KF5Kirigami2 ${KF5_MIN_VERSION} CONFIG) 0130 set_package_properties(KF5Kirigami2 PROPERTIES 0131 DESCRIPTION "A QtQuick based components set" 0132 PURPOSE "Required at runtime for Virtual desktop KCM" 0133 TYPE RUNTIME 0134 ) 0135 0136 find_package(KDecoration2 ${PROJECT_VERSION} CONFIG) 0137 set_package_properties(KDecoration2 PROPERTIES 0138 TYPE REQUIRED 0139 PURPOSE "Required for server side decoration support" 0140 ) 0141 0142 find_package(Breeze 5.9.0 CONFIG) 0143 set_package_properties(Breeze PROPERTIES 0144 TYPE OPTIONAL 0145 PURPOSE "For setting the default window decoration plugin" 0146 ) 0147 if (${Breeze_FOUND}) 0148 if (${BREEZE_WITH_KDECORATION}) 0149 set(HAVE_BREEZE_DECO true) 0150 else() 0151 set(HAVE_BREEZE_DECO FALSE) 0152 endif() 0153 else() 0154 set(HAVE_BREEZE_DECO FALSE) 0155 endif() 0156 add_feature_info("Breeze-Decoration" HAVE_BREEZE_DECO "Default decoration plugin Breeze") 0157 0158 find_package(EGL) 0159 set_package_properties(EGL PROPERTIES 0160 TYPE REQUIRED 0161 PURPOSE "Required to build KWin with EGL support" 0162 ) 0163 0164 find_package(epoxy 1.3) 0165 set_package_properties(epoxy PROPERTIES 0166 DESCRIPTION "libepoxy" 0167 URL "https://github.com/anholt/libepoxy" 0168 TYPE REQUIRED 0169 PURPOSE "OpenGL dispatch library" 0170 ) 0171 0172 set(HAVE_DL_LIBRARY FALSE) 0173 if (epoxy_HAS_GLX) 0174 find_library(DL_LIBRARY dl) 0175 if (DL_LIBRARY) 0176 set(HAVE_DL_LIBRARY TRUE) 0177 endif() 0178 endif() 0179 0180 check_cxx_source_compiles(" 0181 #include <fcntl.h> 0182 #include <sys/mman.h> 0183 #include <unistd.h> 0184 0185 int main() { 0186 const int size = 10; 0187 int fd = memfd_create(\"test\", MFD_CLOEXEC | MFD_ALLOW_SEALING); 0188 ftruncate(fd, size); 0189 fcntl(fd, F_ADD_SEALS, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE | F_SEAL_SEAL); 0190 mmap(nullptr, size, PROT_WRITE, MAP_SHARED, fd, 0); 0191 }" HAVE_MEMFD) 0192 0193 find_package(Wayland 1.21) 0194 set_package_properties(Wayland PROPERTIES 0195 TYPE REQUIRED 0196 PURPOSE "Required for building KWin with Wayland support" 0197 ) 0198 0199 find_package(WaylandProtocols 1.31) 0200 set_package_properties(WaylandProtocols PROPERTIES 0201 TYPE REQUIRED 0202 PURPOSE "Collection of Wayland protocols that add functionality not available in the Wayland core protocol" 0203 URL "https://gitlab.freedesktop.org/wayland/wayland-protocols/" 0204 ) 0205 0206 find_package(PlasmaWaylandProtocols 1.9.0 CONFIG) 0207 set_package_properties(PlasmaWaylandProtocols PROPERTIES 0208 TYPE REQUIRED 0209 PURPOSE "Collection of Plasma-specific Wayland protocols" 0210 URL "https://invent.kde.org/libraries/plasma-wayland-protocols/" 0211 ) 0212 0213 if (QT_MAJOR_VERSION EQUAL "5") 0214 find_package(QtWaylandScanner) 0215 set_package_properties(QtWaylandScanner PROPERTIES 0216 TYPE REQUIRED 0217 PURPOSE "Required for building KWin with Wayland support" 0218 ) 0219 endif() 0220 0221 find_package(XKB 0.7.0) 0222 set_package_properties(XKB PROPERTIES 0223 TYPE REQUIRED 0224 PURPOSE "Required for building KWin with Wayland support" 0225 ) 0226 if (XKB_VERSION VERSION_GREATER_EQUAL 1.5.0) 0227 set(HAVE_XKBCOMMON_NO_SECURE_GETENV 1) 0228 else() 0229 set(HAVE_XKBCOMMON_NO_SECURE_GETENV 0) 0230 endif() 0231 0232 pkg_check_modules(XKBX11 IMPORTED_TARGET xkbcommon-x11 REQUIRED) 0233 add_feature_info(XKBX11 XKBX11_FOUND "Required for handling keyboard events in X11 backend") 0234 0235 find_package(Libinput 1.19) 0236 set_package_properties(Libinput PROPERTIES TYPE REQUIRED PURPOSE "Required for input handling on Wayland.") 0237 0238 find_package(UDev) 0239 set_package_properties(UDev PROPERTIES 0240 URL "https://www.freedesktop.org/wiki/Software/systemd/" 0241 DESCRIPTION "Linux device library." 0242 TYPE REQUIRED 0243 PURPOSE "Required for input handling on Wayland." 0244 ) 0245 0246 find_package(Libdrm 2.4.112) 0247 set_package_properties(Libdrm PROPERTIES TYPE REQUIRED PURPOSE "Required for drm output on Wayland.") 0248 0249 find_package(gbm) 0250 set_package_properties(gbm PROPERTIES TYPE REQUIRED PURPOSE "Required for egl output of drm backend.") 0251 if (gbm_VERSION VERSION_GREATER_EQUAL 21.1) 0252 set(HAVE_GBM_BO_GET_FD_FOR_PLANE 1) 0253 else() 0254 set(HAVE_GBM_BO_GET_FD_FOR_PLANE 0) 0255 endif() 0256 if (gbm_VERSION VERSION_GREATER_EQUAL 21.3) 0257 set(HAVE_GBM_BO_CREATE_WITH_MODIFIERS2 1) 0258 else() 0259 set(HAVE_GBM_BO_CREATE_WITH_MODIFIERS2 0) 0260 endif() 0261 0262 pkg_check_modules(Libxcvt IMPORTED_TARGET libxcvt>=0.1.1 REQUIRED) 0263 add_feature_info(Libxcvt Libxcvt_FOUND "Required for generating modes in the drm backend") 0264 0265 find_package(X11) 0266 set_package_properties(X11 PROPERTIES 0267 DESCRIPTION "X11 libraries" 0268 URL "https://www.x.org" 0269 TYPE REQUIRED 0270 ) 0271 add_feature_info("XInput" X11_Xi_FOUND "Required for poll-free mouse cursor updates") 0272 set(HAVE_X11_XINPUT ${X11_Xinput_FOUND}) 0273 0274 find_package(lcms2) 0275 set_package_properties(lcms2 PROPERTIES 0276 DESCRIPTION "Small-footprint color management engine" 0277 URL "http://www.littlecms.com" 0278 TYPE REQUIRED 0279 PURPOSE "Required for the color management system" 0280 ) 0281 0282 # All the required XCB components 0283 find_package(XCB 1.10 REQUIRED COMPONENTS 0284 COMPOSITE 0285 CURSOR 0286 DAMAGE 0287 GLX 0288 ICCCM 0289 IMAGE 0290 KEYSYMS 0291 PRESENT 0292 RANDR 0293 RENDER 0294 SHAPE 0295 SHM 0296 SYNC 0297 XCB 0298 XFIXES 0299 XKB 0300 XINERAMA 0301 ) 0302 set_package_properties(XCB PROPERTIES TYPE REQUIRED) 0303 0304 # and the optional XCB dependencies 0305 if (XCB_ICCCM_VERSION VERSION_LESS "0.4") 0306 set(XCB_ICCCM_FOUND FALSE) 0307 endif() 0308 add_feature_info("XCB-ICCCM" XCB_ICCCM_FOUND "Required for building test applications for KWin") 0309 0310 find_package(X11_XCB) 0311 set_package_properties(X11_XCB PROPERTIES 0312 PURPOSE "Required for building X11 windowed backend of kwin_wayland" 0313 TYPE OPTIONAL 0314 ) 0315 0316 # dependencies for QPA plugin 0317 if (QT_MAJOR_VERSION EQUAL "5") 0318 find_package(Qt5FontDatabaseSupport REQUIRED) 0319 find_package(Qt5ThemeSupport REQUIRED) 0320 find_package(Qt5ServiceSupport REQUIRED) 0321 find_package(Qt5EventDispatcherSupport REQUIRED) 0322 endif() 0323 0324 find_package(Freetype) 0325 set_package_properties(Freetype PROPERTIES 0326 DESCRIPTION "A font rendering engine" 0327 URL "https://www.freetype.org" 0328 TYPE REQUIRED 0329 PURPOSE "Needed for KWin's QPA plugin." 0330 ) 0331 find_package(Fontconfig) 0332 set_package_properties(Fontconfig PROPERTIES 0333 TYPE REQUIRED 0334 PURPOSE "Needed for KWin's QPA plugin." 0335 ) 0336 0337 find_package(Xwayland) 0338 set_package_properties(Xwayland PROPERTIES 0339 URL "https://x.org" 0340 DESCRIPTION "Xwayland X server" 0341 TYPE RUNTIME 0342 PURPOSE "Needed for running kwin_wayland" 0343 ) 0344 set(HAVE_XWAYLAND_LISTENFD ${Xwayland_HAVE_LISTENFD}) 0345 0346 find_package(Libcap) 0347 set_package_properties(Libcap PROPERTIES 0348 TYPE OPTIONAL 0349 PURPOSE "Needed for running kwin_wayland with real-time scheduling policy" 0350 ) 0351 set(HAVE_LIBCAP ${Libcap_FOUND}) 0352 0353 find_package(hwdata) 0354 set_package_properties(hwdata PROPERTIES 0355 TYPE RUNTIME 0356 PURPOSE "Runtime-only dependency needed for mapping monitor hardware vendor IDs to full names" 0357 URL "https://github.com/vcrhonek/hwdata" 0358 ) 0359 0360 find_package(QAccessibilityClient CONFIG) 0361 set_package_properties(QAccessibilityClient PROPERTIES 0362 URL "https://www.kde.org" 0363 DESCRIPTION "KDE client-side accessibility library" 0364 TYPE OPTIONAL 0365 PURPOSE "Required to enable accessibility features" 0366 ) 0367 set(HAVE_ACCESSIBILITY ${QAccessibilityClient_FOUND}) 0368 0369 find_package(Qt5LinuxAccessibilitySupport REQUIRED) 0370 0371 ecm_find_qmlmodule(QtQuick 2.3) 0372 ecm_find_qmlmodule(QtQuick.Controls 2.15) 0373 ecm_find_qmlmodule(QtQuick.Layouts 1.3) 0374 ecm_find_qmlmodule(QtQuick.Window 2.1) 0375 ecm_find_qmlmodule(QtMultimedia 5.0) 0376 ecm_find_qmlmodule(org.kde.kquickcontrolsaddons 2.0) 0377 ecm_find_qmlmodule(org.kde.plasma.core 2.0) 0378 ecm_find_qmlmodule(org.kde.plasma.components 2.0) 0379 0380 ########### configure tests ############### 0381 option(KWIN_BUILD_DECORATIONS "Enable building of KWin decorations." ON) 0382 option(KWIN_BUILD_KCMS "Enable building of KWin configuration modules." ON) 0383 option(KWIN_BUILD_NOTIFICATIONS "Enable building of KWin with knotifications support" ON) 0384 option(KWIN_BUILD_SCREENLOCKER "Enable building of KWin lockscreen functionality" ON) 0385 option(KWIN_BUILD_TABBOX "Enable building of KWin Tabbox functionality" ON) 0386 cmake_dependent_option(KWIN_BUILD_ACTIVITIES "Enable building of KWin with kactivities support" ON "KF5Activities_FOUND" OFF) 0387 cmake_dependent_option(KWIN_BUILD_RUNNERS "Enable building of KWin with krunner support" ON "KF5Runner_FOUND" OFF) 0388 0389 set(HAVE_EPOXY_GLX ${epoxy_HAS_GLX}) 0390 0391 # for kwin internal things 0392 set(HAVE_X11_XCB ${X11_XCB_FOUND}) 0393 0394 check_symbol_exists(SCHED_RESET_ON_FORK "sched.h" HAVE_SCHED_RESET_ON_FORK) 0395 add_feature_info("SCHED_RESET_ON_FORK" 0396 HAVE_SCHED_RESET_ON_FORK 0397 "Required for running kwin_wayland with real-time scheduling") 0398 0399 0400 pkg_check_modules(PipeWire IMPORTED_TARGET libpipewire-0.3>=0.3.29) 0401 add_feature_info(PipeWire PipeWire_FOUND "Required for Wayland screencasting") 0402 0403 if (KWIN_BUILD_NOTIFICATIONS) 0404 find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Notifications) 0405 endif() 0406 0407 if (KWIN_BUILD_SCREENLOCKER) 0408 find_package(KScreenLocker CONFIG) 0409 set_package_properties(KScreenLocker PROPERTIES 0410 TYPE REQUIRED 0411 PURPOSE "For screenlocker integration in kwin_wayland" 0412 ) 0413 endif() 0414 0415 ########### global ############### 0416 0417 include_directories(BEFORE 0418 ${CMAKE_CURRENT_BINARY_DIR}/src/libkwineffects 0419 ${CMAKE_CURRENT_BINARY_DIR}/src/wayland 0420 ${CMAKE_CURRENT_BINARY_DIR}/src 0421 ${CMAKE_CURRENT_SOURCE_DIR}/src/libkwineffects 0422 ${CMAKE_CURRENT_SOURCE_DIR}/src/effects 0423 ${CMAKE_CURRENT_SOURCE_DIR}/src/tabbox 0424 ${CMAKE_CURRENT_SOURCE_DIR}/src/platformsupport 0425 ${CMAKE_CURRENT_SOURCE_DIR}/src/colors 0426 ) 0427 0428 check_cxx_compiler_flag(-Wno-unused-parameter COMPILER_UNUSED_PARAMETER_SUPPORTED) 0429 if (COMPILER_UNUSED_PARAMETER_SUPPORTED) 0430 add_compile_options(-Wno-unused-parameter) 0431 endif() 0432 0433 add_definitions( 0434 -DQT_DISABLE_DEPRECATED_BEFORE=0 0435 -DQT_NO_KEYWORDS 0436 -DQT_USE_QSTRINGBUILDER 0437 -DQT_NO_URL_CAST_FROM_STRING 0438 -DQT_NO_CAST_TO_ASCII 0439 -DQT_NO_FOREACH 0440 0441 # Prevent EGL headers from including platform headers, in particular Xlib.h. 0442 -DMESA_EGL_NO_X11_HEADERS 0443 -DEGL_NO_X11 0444 -DEGL_NO_PLATFORM_SPECIFIC_TYPES 0445 ) 0446 0447 if (KF5DocTools_FOUND) 0448 add_subdirectory(doc) 0449 kdoctools_install(po) 0450 endif() 0451 0452 add_subdirectory(data) 0453 add_subdirectory(kconf_update) 0454 add_subdirectory(src) 0455 0456 if (BUILD_TESTING) 0457 find_package(Wayland REQUIRED COMPONENTS Client) 0458 0459 add_subdirectory(autotests) 0460 add_subdirectory(tests) 0461 endif() 0462 0463 # add clang-format target for all our real source files 0464 file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h) 0465 kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES}) 0466 kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT) 0467 0468 feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) 0469 0470 set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KWinDBusInterface") 0471 configure_package_config_file(KWinDBusInterfaceConfig.cmake.in 0472 "${CMAKE_CURRENT_BINARY_DIR}/KWinDBusInterfaceConfig.cmake" 0473 PATH_VARS KDE_INSTALL_DBUSINTERFACEDIR 0474 INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}) 0475 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/KWinDBusInterfaceConfig.cmake 0476 DESTINATION ${CMAKECONFIG_INSTALL_DIR}) 0477 0478 ecm_install_configured_files(INPUT plasma-kwin_x11.service.in plasma-kwin_wayland.service.in @ONLY 0479 DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) 0480 0481 ki18n_install(po)