mirror of
https://github.com/sddm/sddm.git
synced 2024-11-23 01:54:21 +08:00
b704e2ee35
utmps library can be used to provide utmp functionality on systems whose libcs do not implement it, e.g. musl. For more details, see https://skarnet.org/software/utmps/. Signed-off-by: Peter Shkenev <petershh@disroot.org>
237 lines
8.3 KiB
CMake
237 lines
8.3 KiB
CMake
cmake_minimum_required(VERSION 3.4)
|
|
|
|
project(SDDM)
|
|
|
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
set(CMAKE_AUTOMOC ON)
|
|
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
|
|
# Set version
|
|
set(SDDM_VERSION_MAJOR 0)
|
|
set(SDDM_VERSION_MINOR 21)
|
|
set(SDDM_VERSION_PATCH 0)
|
|
set(SDDM_VERSION_STRING "${SDDM_VERSION_MAJOR}.${SDDM_VERSION_MINOR}.${SDDM_VERSION_PATCH}")
|
|
add_compile_definitions("SDDM_VERSION=\"${SDDM_VERSION_STRING}\"")
|
|
|
|
# Options
|
|
option(BUILD_MAN_PAGES "Build man pages" OFF)
|
|
option(ENABLE_JOURNALD "Enable logging to journald" ON)
|
|
option(NO_SYSTEMD "Disable systemd support" OFF)
|
|
option(USE_ELOGIND "Use elogind instead of logind" OFF)
|
|
option(BUILD_WITH_QT6 "Build with Qt 6" OFF)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
|
|
|
|
# Definitions
|
|
add_definitions(-Wall -Wextra -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_FROM_BYTEARRAY -DQT_NO_FOREACH)
|
|
|
|
# Default build type
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE Release)
|
|
endif()
|
|
|
|
# Handle build type
|
|
if(CMAKE_BUILD_TYPE MATCHES [Dd]ebug)
|
|
message(STATUS "Debug build")
|
|
add_definitions(-DDEBUG)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
|
|
else()
|
|
message(STATUS "Release build")
|
|
add_definitions(-DNDEBUG)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
|
|
endif()
|
|
|
|
# Default absolute paths
|
|
if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
|
|
set(CMAKE_INSTALL_SYSCONFDIR "/etc")
|
|
endif()
|
|
if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
|
|
set(CMAKE_INSTALL_LOCALSTATEDIR "/var")
|
|
endif()
|
|
|
|
# Standard installation paths
|
|
include(GNUInstallDirs)
|
|
|
|
# Macros
|
|
include(FeatureSummary)
|
|
|
|
# PKG-CONFIG
|
|
find_package(PkgConfig)
|
|
|
|
# PAM
|
|
find_package(PAM REQUIRED)
|
|
|
|
# XAU
|
|
pkg_check_modules(LIBXAU REQUIRED "xau")
|
|
|
|
# XCB
|
|
find_package(XCB REQUIRED)
|
|
|
|
# XKB
|
|
find_package(XKB REQUIRED)
|
|
|
|
# Qt
|
|
if(BUILD_WITH_QT6)
|
|
set(QT_MAJOR_VERSION 6)
|
|
message(STATUS "Building Qt 6 version")
|
|
else()
|
|
set(QT_MAJOR_VERSION 5)
|
|
message(STATUS "Building Qt 5 version")
|
|
endif()
|
|
|
|
find_package(Qt${QT_MAJOR_VERSION} 5.15.0 CONFIG REQUIRED Core DBus Gui Qml Quick LinguistTools Test QuickTest)
|
|
|
|
# find qt5 imports dir
|
|
get_target_property(QMAKE_EXECUTABLE Qt${QT_MAJOR_VERSION}::qmake LOCATION)
|
|
if(NOT QT_IMPORTS_DIR)
|
|
execute_process(COMMAND ${QMAKE_EXECUTABLE} -query QT_INSTALL_QML OUTPUT_VARIABLE QT_IMPORTS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
endif()
|
|
|
|
# systemd
|
|
if(NOT NO_SYSTEMD AND NOT USE_ELOGIND)
|
|
pkg_check_modules(SYSTEMD "systemd")
|
|
endif()
|
|
|
|
if(SYSTEMD_FOUND)
|
|
add_definitions(-DHAVE_SYSTEMD)
|
|
set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_SYSTEMD)
|
|
|
|
# libsystemd-journal was merged into libsystemd in 209
|
|
if(${SYSTEMD_VERSION} VERSION_LESS 209)
|
|
pkg_check_modules(JOURNALD "libsystemd-journal")
|
|
else()
|
|
pkg_check_modules(JOURNALD "libsystemd")
|
|
endif()
|
|
|
|
if(ENABLE_JOURNALD)
|
|
if(JOURNALD_FOUND)
|
|
add_definitions(-DHAVE_JOURNALD)
|
|
set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_JOURNALD)
|
|
else()
|
|
message(WARNING "Disable journald support for lack of libsystemd-journal")
|
|
endif()
|
|
endif()
|
|
|
|
if (NOT DEFINED SYSTEMD_SYSTEM_UNIT_DIR)
|
|
pkg_get_variable(SYSTEMD_SYSTEM_UNIT_DIR systemd systemdsystemunitdir)
|
|
endif()
|
|
|
|
if (NOT DEFINED SYSTEMD_SYSUSERS_DIR)
|
|
pkg_get_variable(SYSTEMD_SYSUSERS_DIR systemd sysusersdir)
|
|
endif()
|
|
|
|
if (NOT DEFINED SYSTEMD_TMPFILES_DIR)
|
|
pkg_get_variable(SYSTEMD_TMPFILES_DIR systemd tmpfilesdir)
|
|
endif()
|
|
|
|
set(HALT_COMMAND "/usr/bin/systemctl poweroff")
|
|
set(REBOOT_COMMAND "/usr/bin/systemctl reboot")
|
|
else()
|
|
set(SYSTEMD_FOUND 0)
|
|
endif()
|
|
add_feature_info("systemd" SYSTEMD_FOUND "systemd support")
|
|
add_feature_info("journald" JOURNALD_FOUND "journald support")
|
|
|
|
# elogind
|
|
if(NO_SYSTEMD AND USE_ELOGIND)
|
|
pkg_check_modules(ELOGIND "libelogind")
|
|
endif()
|
|
|
|
if(ELOGIND_FOUND)
|
|
add_definitions(-DHAVE_ELOGIND)
|
|
set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_ELOGIND)
|
|
|
|
set(HALT_COMMAND "/usr/bin/loginctl poweroff")
|
|
set(REBOOT_COMMAND "/usr/bin/loginctl reboot")
|
|
endif()
|
|
add_feature_info("elogind" ELOGIND_FOUND "elogind support")
|
|
|
|
# Default behaviour if neither systemd nor elogind is used
|
|
if (NOT ELOGIND_FOUND AND NOT SYSTEMD_FOUND)
|
|
# Set the VT on which sddm will normally appear, and the
|
|
# commands for shutdown and reboot. On FreeBSD, there are
|
|
# normally more getty's running than on Linux.
|
|
if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
|
|
set(HALT_COMMAND "/sbin/shutdown -p now")
|
|
else()
|
|
set(HALT_COMMAND "/sbin/shutdown -h -P now")
|
|
endif()
|
|
set(REBOOT_COMMAND "/sbin/shutdown -r now")
|
|
endif()
|
|
|
|
if (SYSTEMD_FOUND)
|
|
set(RUNTIME_DIR_DEFAULT "/run/sddm")
|
|
else()
|
|
set(RUNTIME_DIR_DEFAULT "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/run/sddm")
|
|
endif()
|
|
|
|
# utmps
|
|
find_package(utmps)
|
|
add_feature_info("utmps" UTMPS_FOUND "utmps support")
|
|
|
|
# Set constants
|
|
set(DATA_INSTALL_DIR "${CMAKE_INSTALL_FULL_DATADIR}/sddm" CACHE PATH "System application data install directory")
|
|
set(DBUS_CONFIG_DIR "${CMAKE_INSTALL_FULL_DATADIR}/dbus-1/system.d" CACHE PATH "DBus config files directory")
|
|
set(STATE_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/sddm" CACHE PATH "State directory")
|
|
set(RUNTIME_DIR "${RUNTIME_DIR_DEFAULT}" CACHE PATH "Runtime data storage directory")
|
|
set(QML_INSTALL_DIR "${QT_IMPORTS_DIR}" CACHE PATH "QML component installation directory")
|
|
|
|
set(SESSION_COMMAND "${DATA_INSTALL_DIR}/scripts/Xsession" CACHE PATH "Script to execute when starting the X11 desktop session")
|
|
set(WAYLAND_SESSION_COMMAND "${DATA_INSTALL_DIR}/scripts/wayland-session" CACHE PATH "Script to execute when starting the Wayland desktop session")
|
|
|
|
set(CONFIG_FILE "${CMAKE_INSTALL_FULL_SYSCONFDIR}/sddm.conf" CACHE PATH "Path of the sddm config file")
|
|
set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/sddm.conf.d" CACHE PATH "Path of the sddm config directory")
|
|
set(ACCOUNTSSERVICE_DATA_DIR "/var/lib/AccountsService" CACHE PATH "Path of the accountsservice data directory")
|
|
set(SYSTEM_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/lib/sddm/sddm.conf.d" CACHE PATH "Path of the system sddm config directory")
|
|
set(LOG_FILE "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log/sddm.log" CACHE PATH "Path of the sddm log file")
|
|
set(DBUS_CONFIG_FILENAME "org.freedesktop.DisplayManager.conf" CACHE STRING "Name of the sddm config file")
|
|
set(COMPONENTS_TRANSLATION_DIR "${DATA_INSTALL_DIR}/translations-qt${QT_MAJOR_VERSION}" CACHE PATH "Components translations directory")
|
|
set(SDDM_INITIAL_VT "1" CACHE STRING "Initial tty to use")
|
|
|
|
|
|
# Autodetect UID_MIN and UID_MAX from /etc/login.defs
|
|
if(NOT DEFINED LOGIN_DEFS_PATH)
|
|
set(LOGIN_DEFS_PATH "/etc/login.defs" CACHE PATH "Path to login.defs")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${LOGIN_DEFS_PATH}" AND NOT DEFINED UID_MIN AND NOT DEFINED UID_MAX)
|
|
message(FATAL_ERROR "Could not find login.defs at ${LOGIN_DEFS_PATH}. Try -DLOGIN_DEFS_PATH.")
|
|
endif()
|
|
|
|
if(NOT DEFINED UID_MIN)
|
|
file(STRINGS "${LOGIN_DEFS_PATH}" UID_MIN LIMIT_COUNT 1 REGEX "^UID_MIN")
|
|
string(REGEX REPLACE "^UID_MIN[\t ]+([0-9]+)" "\\1" UID_MIN "${UID_MIN}")
|
|
if(NOT UID_MIN MATCHES "[0-9]+")
|
|
message(WARNING "Could not detect a valid UID_MIN (got '${UID_MIN}'). You should review your login.defs file.")
|
|
set(UID_MIN 1000)
|
|
else()
|
|
message(STATUS "Autodetected UID_MIN=${UID_MIN} from ${LOGIN_DEFS_PATH}")
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT DEFINED UID_MAX)
|
|
file(STRINGS "${LOGIN_DEFS_PATH}" UID_MAX LIMIT_COUNT 1 REGEX "^UID_MAX")
|
|
string(REGEX REPLACE "^UID_MAX[\t ]+([0-9]+)" "\\1" UID_MAX "${UID_MAX}")
|
|
if(NOT UID_MAX MATCHES "[0-9]+")
|
|
message(WARNING "Could not detect a valid UID_MAX (got '${UID_MAX}'). You should review your login.defs file.")
|
|
set(UID_MAX 65000)
|
|
else()
|
|
message(STATUS "Autodetected UID_MAX=${UID_MAX} from ${LOGIN_DEFS_PATH}")
|
|
endif()
|
|
endif()
|
|
|
|
# Add subdirectories
|
|
add_subdirectory(components)
|
|
add_subdirectory(data)
|
|
add_subdirectory(services)
|
|
add_subdirectory(src)
|
|
|
|
enable_testing()
|
|
add_subdirectory(test)
|
|
|
|
# Display feature summary
|
|
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
|