sddm-CMakeLists.txt 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. cmake_minimum_required(VERSION 2.8.8)
  2. project(SDDM)
  3. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  4. set(CMAKE_AUTOMOC ON)
  5. SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  6. # Silence CMake 3.0 warnings
  7. if(POLICY CMP0043)
  8. cmake_policy(SET CMP0043 OLD)
  9. endif()
  10. # Set version
  11. set(SDDM_VERSION_MAJOR 0)
  12. set(SDDM_VERSION_MINOR 19)
  13. set(SDDM_VERSION_PATCH 0)
  14. set(SDDM_VERSION_STRING "${SDDM_VERSION_MAJOR}.${SDDM_VERSION_MINOR}.${SDDM_VERSION_PATCH}")
  15. # Set up packaging
  16. set(CPACK_PACKAGE_NAME "sddm")
  17. set(CPACK_PACKAGE_VERSION "${SDDM_VERSION_STRING}")
  18. set(CPACK_GENERATOR "TGZ")
  19. set(CPACK_SET_DESTDIR FALSE)
  20. set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
  21. set(CPACK_SOURCE_IGNORE_FILES "/build/;/.git;/*.user;/.tx/;~$;${CPACK_SOURCE_IGNORE_FILES}")
  22. include(CPack)
  23. add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
  24. # Options
  25. option(BUILD_MAN_PAGES "Build man pages" OFF)
  26. option(ENABLE_JOURNALD "Enable logging to journald" ON)
  27. option(ENABLE_PAM "Enable PAM support" ON)
  28. option(NO_SYSTEMD "Disable systemd support" OFF)
  29. option(USE_ELOGIND "Use elogind instead of logind" OFF)
  30. # ECM
  31. find_package(ECM 1.4.0 REQUIRED NO_MODULE)
  32. set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH};${ECM_MODULE_PATH}")
  33. # Definitions
  34. add_definitions(-Wall -std=c++11 -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_FROM_BYTEARRAY -DQT_NO_FOREACH)
  35. # Default build type
  36. if(NOT CMAKE_BUILD_TYPE)
  37. set(CMAKE_BUILD_TYPE Release)
  38. endif()
  39. # Handle build type
  40. if(CMAKE_BUILD_TYPE MATCHES [Dd]ebug)
  41. message(STATUS "Debug build")
  42. add_definitions(-DDEBUG)
  43. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
  44. else()
  45. message(STATUS "Release build")
  46. add_definitions(-DNDEBUG)
  47. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
  48. endif()
  49. # Default absolute paths
  50. if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
  51. set(CMAKE_INSTALL_SYSCONFDIR "/etc")
  52. endif()
  53. if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
  54. set(CMAKE_INSTALL_LOCALSTATEDIR "/var")
  55. endif()
  56. # Standard installation paths
  57. include(GNUInstallDirs)
  58. # Macros
  59. include(FeatureSummary)
  60. # PKG-CONFIG
  61. find_package(PkgConfig)
  62. # PAM
  63. if(ENABLE_PAM)
  64. find_package(PAM REQUIRED)
  65. if(PAM_FOUND)
  66. add_definitions(-DUSE_PAM)
  67. endif()
  68. endif()
  69. add_feature_info("PAM" PAM_FOUND "PAM support")
  70. # getspnam and shadow(5) support
  71. include(CheckFunctionExists)
  72. check_function_exists(getspnam HAVE_GETSPNAM)
  73. # XCB
  74. find_package(XCB REQUIRED)
  75. # XKB
  76. find_package(XKB REQUIRED)
  77. # Qt 5
  78. find_package(Qt5 5.8.0 CONFIG REQUIRED Core DBus Gui Qml Quick LinguistTools Test)
  79. # find qt5 imports dir
  80. get_target_property(QMAKE_EXECUTABLE Qt5::qmake LOCATION)
  81. if(NOT QT_IMPORTS_DIR)
  82. exec_program(${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_QML" RETURN_VALUE return_code OUTPUT_VARIABLE QT_IMPORTS_DIR)
  83. endif()
  84. # Uninstall target
  85. if ("${ECM_VERSION}" VERSION_LESS "1.7.0")
  86. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
  87. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  88. IMMEDIATE @ONLY)
  89. add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
  90. endif()
  91. # systemd
  92. if(NOT NO_SYSTEMD AND NOT USE_ELOGIND)
  93. pkg_check_modules(SYSTEMD "systemd")
  94. endif()
  95. if(SYSTEMD_FOUND)
  96. add_definitions(-DHAVE_SYSTEMD)
  97. set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_SYSTEMD)
  98. # libsystemd-journal was merged into libsystemd in 209
  99. if(${SYSTEMD_VERSION} VERSION_LESS 209)
  100. pkg_check_modules(JOURNALD "libsystemd-journal")
  101. else()
  102. pkg_check_modules(JOURNALD "libsystemd")
  103. endif()
  104. if(ENABLE_JOURNALD)
  105. if(JOURNALD_FOUND)
  106. add_definitions(-DHAVE_JOURNALD)
  107. set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_JOURNALD)
  108. else()
  109. message(WARNING "Disable journald support for lack of libsystemd-journal")
  110. endif()
  111. endif()
  112. if (NOT DEFINED SYSTEMD_SYSTEM_UNIT_DIR)
  113. execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=systemdsystemunitdir systemd OUTPUT_VARIABLE SYSTEMD_SYSTEM_UNIT_DIR)
  114. string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SYSTEM_UNIT_DIR ${SYSTEMD_SYSTEM_UNIT_DIR})
  115. endif()
  116. set(MINIMUM_VT 1)
  117. set(HALT_COMMAND "/usr/bin/shutdown -p now")
  118. set(REBOOT_COMMAND "/usr/bin/shutdown -r now")
  119. else()
  120. set(SYSTEMD_FOUND 0)
  121. endif()
  122. add_feature_info("systemd" SYSTEMD_FOUND "systemd support")
  123. add_feature_info("journald" JOURNALD_FOUND "journald support")
  124. # elogind
  125. if(NO_SYSTEMD AND USE_ELOGIND)
  126. pkg_check_modules(ELOGIND "libelogind")
  127. endif()
  128. if(ELOGIND_FOUND)
  129. add_definitions(-DHAVE_ELOGIND)
  130. set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_ELOGIND)
  131. set(MINIMUM_VT 7)
  132. set(HALT_COMMAND "/usr/bin/shutdown -p now")
  133. set(REBOOT_COMMAND "/usr/bin/shutdown -r now")
  134. endif()
  135. add_feature_info("elogind" ELOGIND_FOUND "elogind support")
  136. # Default behaviour if neither systemd nor elogind is used
  137. if (NOT ELOGIND_FOUND AND NOT SYSTEMD_FOUND)
  138. # Set the VT on which sddm will normally appear, and the
  139. # commands for shutdown and reboot. On FreeBSD, there are
  140. # normally more getty's running than on Linux.
  141. if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
  142. set(MINIMUM_VT 9)
  143. set(HALT_COMMAND "/usr/bin/shutdown -p now")
  144. else()
  145. set(MINIMUM_VT 7)
  146. set(HALT_COMMAND "/usr/bin/shutdown -h -P now")
  147. endif()
  148. set(REBOOT_COMMAND "/usr/bin/shutdown -r now")
  149. endif()
  150. # Set constants
  151. set(DATA_INSTALL_DIR "${CMAKE_INSTALL_FULL_DATADIR}/sddm" CACHE PATH "System application data install directory")
  152. set(DBUS_CONFIG_DIR "${CMAKE_INSTALL_SYSCONFDIR}/dbus-1/system.d" CACHE PATH "DBus config files directory")
  153. set(STATE_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/sddm" CACHE PATH "State directory")
  154. set(RUNTIME_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/run/sddm" CACHE PATH "Runtime data storage directory")
  155. set(QML_INSTALL_DIR "${QT_IMPORTS_DIR}" CACHE PATH "QML component installation directory")
  156. set(SESSION_COMMAND "${DATA_INSTALL_DIR}/scripts/Xsession" CACHE PATH "Script to execute when starting the X11 desktop session")
  157. set(WAYLAND_SESSION_COMMAND "${DATA_INSTALL_DIR}/scripts/wayland-session" CACHE PATH "Script to execute when starting the Wayland desktop session")
  158. set(CONFIG_FILE "${CMAKE_INSTALL_FULL_SYSCONFDIR}/sddm.conf" CACHE PATH "Path of the sddm config file")
  159. set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/sddm.conf.d" CACHE PATH "Path of the sddm config directory")
  160. set(SYSTEM_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/lib/sddm/sddm.conf.d" CACHE PATH "Path of the system sddm config directory")
  161. set(LOG_FILE "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log/sddm.log" CACHE PATH "Path of the sddm log file")
  162. set(DBUS_CONFIG_FILENAME "org.freedesktop.DisplayManager.conf" CACHE STRING "Name of the sddm config file")
  163. set(COMPONENTS_TRANSLATION_DIR "${DATA_INSTALL_DIR}/translations" CACHE PATH "Components translations directory")
  164. # Autodetect UID_MIN and UID_MAX from /etc/login.defs
  165. if(NOT DEFINED LOGIN_DEFS_PATH)
  166. set(LOGIN_DEFS_PATH "/etc/login.defs" CACHE PATH "Path to login.defs")
  167. endif()
  168. if(NOT EXISTS "${LOGIN_DEFS_PATH}" AND NOT DEFINED UID_MIN AND NOT DEFINED UID_MAX)
  169. message(FATAL_ERROR "Could not find login.defs at ${LOGIN_DEFS_PATH}. Try -DLOGIN_DEFS_PATH.")
  170. endif()
  171. if(NOT DEFINED UID_MIN)
  172. file(STRINGS "${LOGIN_DEFS_PATH}" UID_MIN LIMIT_COUNT 1 REGEX "^UID_MIN")
  173. string(REGEX REPLACE "^UID_MIN[\t ]+([0-9]+)" "\\1" UID_MIN "${UID_MIN}")
  174. if(NOT UID_MIN MATCHES "[0-9]+")
  175. message(WARNING "Could not detect a valid UID_MIN (got '${UID_MIN}'). You should review your login.defs file.")
  176. set(UID_MIN 1000)
  177. else()
  178. message(STATUS "Autodetected UID_MIN=${UID_MIN} from ${LOGIN_DEFS_PATH}")
  179. endif()
  180. endif()
  181. if(NOT DEFINED UID_MAX)
  182. file(STRINGS "${LOGIN_DEFS_PATH}" UID_MAX LIMIT_COUNT 1 REGEX "^UID_MAX")
  183. string(REGEX REPLACE "^UID_MAX[\t ]+([0-9]+)" "\\1" UID_MAX "${UID_MAX}")
  184. if(NOT UID_MAX MATCHES "[0-9]+")
  185. message(WARNING "Could not detect a valid UID_MAX (got '${UID_MAX}'). You should review your login.defs file.")
  186. set(UID_MAX 65000)
  187. else()
  188. message(STATUS "Autodetected UID_MAX=${UID_MAX} from ${LOGIN_DEFS_PATH}")
  189. endif()
  190. endif()
  191. # Add subdirectories
  192. add_subdirectory(components)
  193. add_subdirectory(data)
  194. add_subdirectory(services)
  195. add_subdirectory(src)
  196. enable_testing()
  197. add_subdirectory(test)
  198. # Display feature summary
  199. feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)