mirror of
https://github.com/hyprwm/Hyprland
synced 2025-12-20 05:30:04 +01:00
* protocols: add Fifo-v1 introduce fifo-v1 * fifo: only present locked surfaces dont present to unlocked surfaces and commit pending states from the fifo protocol. * fifo: cformat cformat * protocols: add committiming and surface state queue introduce CSurfaceStateQueue and commit-timing-v1 * fifo: schedule a frame if waiting on barrier if we are waiting on a barrier the state doesnt commit until the next refresh cycle meaning the monitor might have no pending damage and we never get onPresented to unlock the barrier, moment 22. so schedule a frame. * fifo: properly check monitor intersection check for m_enteredoutputs or monitor intersection if client hasnt bound one yet, and dont fifo lock it until the surface is mapped. * buffer: try to merge states before committing them try to merge states before committing them meaning way less churn and surface commits if a surface sends multiple small ones while we wait for buffer readyness from either fifo locks or simply fences. * buffer: dont commit states past the buffer certain changes are relative to the buffer attached, cant go beyond it and apply those onto the next buffer. * buffer: set the lockmask directly cant use .lock since the state hasnt been queued yet, set the lockmask directly when exporting buffer fence. * fifo: dont fifo lock on tearing dont fifo lock on tearing. * buffer: queue the state directly queue the state directly and use the .lock function instead of directly modify the lockMask on the state. * buffer: revert creating texture at commit time fifo barriers introduces such long wait that upon commit time a race happends with current xdg configure implentation that the buffer and image is actually destroyed when entering commitState, doing it at buffer creation time with EGL_PRESERVED_KHR means it sticks around until we are done. so revert82759d4and32f3233for now. * buffer: rename enum and lockreasons eLockReason and LOCK_REASON_NONE. * fifo: workaround direct scanout lock workaround cursor commits causing fifo to get forever locked, this entire thing needs to be worked out.
544 lines
18 KiB
CMake
544 lines
18 KiB
CMake
cmake_minimum_required(VERSION 3.30)
|
|
|
|
# Get version
|
|
file(READ "${CMAKE_SOURCE_DIR}/VERSION" VER_RAW)
|
|
string(STRIP ${VER_RAW} VER)
|
|
|
|
project(
|
|
Hyprland
|
|
DESCRIPTION "A Modern C++ Wayland Compositor"
|
|
VERSION ${VER})
|
|
|
|
include(CTest)
|
|
include(CheckIncludeFile)
|
|
include(GNUInstallDirs)
|
|
|
|
set(HYPRLAND_VERSION ${VER})
|
|
set(PREFIX ${CMAKE_INSTALL_PREFIX})
|
|
set(INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
|
|
set(BINDIR ${CMAKE_INSTALL_BINDIR})
|
|
configure_file(hyprland.pc.in hyprland.pc @ONLY)
|
|
|
|
set(CMAKE_MESSAGE_LOG_LEVEL "STATUS")
|
|
|
|
message(STATUS "Gathering git info")
|
|
|
|
# Make shader files includable
|
|
execute_process(COMMAND ./scripts/generateShaderIncludes.sh
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
|
|
find_package(PkgConfig REQUIRED)
|
|
|
|
# Try to find canihavesomecoffee's udis86 using pkgconfig vmd/udis86 does not
|
|
# provide a .pc file and won't be detected this way
|
|
pkg_check_modules(udis_dep IMPORTED_TARGET udis86>=1.7.2)
|
|
|
|
# Fallback to subproject
|
|
if(NOT udis_dep_FOUND)
|
|
add_subdirectory("subprojects/udis86")
|
|
include_directories("subprojects/udis86")
|
|
message(STATUS "udis86 dependency not found, falling back to subproject")
|
|
endif()
|
|
|
|
if(CMAKE_BUILD_TYPE)
|
|
string(TOLOWER ${CMAKE_BUILD_TYPE} BUILDTYPE_LOWER)
|
|
if(BUILDTYPE_LOWER STREQUAL "release")
|
|
# Pass.
|
|
elseif(BUILDTYPE_LOWER STREQUAL "debug")
|
|
# Pass.
|
|
elseif(BUILDTYPE_LOWER STREQUAL "relwithdebinfo")
|
|
set(BUILDTYPE_LOWER "debugoptimized")
|
|
elseif(BUILDTYPE_LOWER STREQUAL "minsizerel")
|
|
set(BUILDTYPE_LOWER "minsize")
|
|
elseif(BUILDTYPE_LOWER STREQUAL "none")
|
|
set(BUILDTYPE_LOWER "plain")
|
|
else()
|
|
set(BUILDTYPE_LOWER "release")
|
|
endif()
|
|
else()
|
|
set(BUILDTYPE_LOWER "release")
|
|
endif()
|
|
|
|
pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
|
|
message(STATUS "Found wayland-protocols at ${WAYLAND_PROTOCOLS_DIR}")
|
|
pkg_get_variable(WAYLAND_SCANNER_PKGDATA_DIR wayland-scanner pkgdatadir)
|
|
message(
|
|
STATUS "Found wayland-scanner pkgdatadir at ${WAYLAND_SCANNER_PKGDATA_DIR}")
|
|
|
|
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG)
|
|
message(STATUS "Configuring Hyprland in Debug with CMake")
|
|
add_compile_definitions(HYPRLAND_DEBUG)
|
|
else()
|
|
add_compile_options(-O3)
|
|
message(STATUS "Configuring Hyprland in Release with CMake")
|
|
endif()
|
|
|
|
add_compile_definitions(HYPRLAND_VERSION="${HYPRLAND_VERSION}")
|
|
|
|
include_directories(. "src/" "protocols/")
|
|
|
|
set(CMAKE_CXX_STANDARD 26)
|
|
set(CXX_STANDARD_REQUIRED ON)
|
|
add_compile_options(
|
|
-Wall
|
|
-Wextra
|
|
-Wpedantic
|
|
-Wno-unused-parameter
|
|
-Wno-unused-value
|
|
-Wno-missing-field-initializers
|
|
-Wno-gnu-zero-variadic-macro-arguments
|
|
-Wno-narrowing
|
|
-Wno-pointer-arith
|
|
-Wno-clobbered
|
|
-fmacro-prefix-map=${CMAKE_SOURCE_DIR}/=)
|
|
|
|
# disable lto as it may break plugins
|
|
add_compile_options(-fno-lto)
|
|
|
|
set(CMAKE_EXECUTABLE_ENABLE_EXPORTS TRUE)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
|
|
|
|
message(STATUS "Checking deps...")
|
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
set(GLES_VERSION "GLES3")
|
|
find_package(OpenGL REQUIRED COMPONENTS ${GLES_VERSION})
|
|
|
|
pkg_check_modules(aquamarine_dep REQUIRED IMPORTED_TARGET aquamarine>=0.9.3)
|
|
pkg_check_modules(hyprlang_dep REQUIRED IMPORTED_TARGET hyprlang>=0.3.2)
|
|
pkg_check_modules(hyprcursor_dep REQUIRED IMPORTED_TARGET hyprcursor>=0.1.7)
|
|
pkg_check_modules(hyprutils_dep REQUIRED IMPORTED_TARGET hyprutils>=0.8.2)
|
|
pkg_check_modules(hyprgraphics_dep REQUIRED IMPORTED_TARGET hyprgraphics>=0.1.6)
|
|
|
|
string(REPLACE "." ";" AQ_VERSION_LIST ${aquamarine_dep_VERSION})
|
|
list(GET AQ_VERSION_LIST 0 AQ_VERSION_MAJOR)
|
|
list(GET AQ_VERSION_LIST 1 AQ_VERSION_MINOR)
|
|
list(GET AQ_VERSION_LIST 2 AQ_VERSION_PATCH)
|
|
|
|
set(AQUAMARINE_VERSION "${aquamarine_dep_VERSION}")
|
|
set(AQUAMARINE_VERSION_MAJOR "${AQ_VERSION_MAJOR}")
|
|
set(AQUAMARINE_VERSION_MINOR "${AQ_VERSION_MINOR}")
|
|
set(AQUAMARINE_VERSION_PATCH "${AQ_VERSION_PATCH}")
|
|
set(HYPRLANG_VERSION "${hyprlang_dep_VERSION}")
|
|
set(HYPRUTILS_VERSION "${hyprutils_dep_VERSION}")
|
|
set(HYPRCURSOR_VERSION "${hyprcursor_dep_VERSION}")
|
|
set(HYPRGRAPHICS_VERSION "${hyprgraphics_dep_VERSION}")
|
|
|
|
|
|
find_package(Git QUIET)
|
|
|
|
set(GIT_COMMIT_HASH "unknown")
|
|
set(GIT_BRANCH "unknown")
|
|
set(GIT_COMMIT_MESSAGE "unknown")
|
|
set(GIT_COMMIT_DATE "unknown")
|
|
set(GIT_DIRTY "unknown")
|
|
set(GIT_TAG "unknown")
|
|
set(GIT_COMMITS "0")
|
|
|
|
if(Git_FOUND)
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} rev-parse --show-toplevel
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_TOPLEVEL
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_QUIET
|
|
RESULT_VARIABLE GIT_TOPLEVEL_RESULT
|
|
)
|
|
|
|
if(GIT_TOPLEVEL_RESULT EQUAL 0)
|
|
message(STATUS "Detected git repository root: ${GIT_TOPLEVEL}")
|
|
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
|
|
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
OUTPUT_VARIABLE GIT_COMMIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} branch --show-current
|
|
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format=%s
|
|
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
OUTPUT_VARIABLE GIT_COMMIT_MESSAGE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format=%cd --date=local
|
|
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --quiet HEAD --
|
|
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
RESULT_VARIABLE GIT_DIRTY_RESULT)
|
|
if(NOT GIT_DIRTY_RESULT EQUAL 0)
|
|
set(GIT_DIRTY "dirty")
|
|
else()
|
|
set(GIT_DIRTY "clean")
|
|
endif()
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags
|
|
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
OUTPUT_VARIABLE GIT_TAG OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD
|
|
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
OUTPUT_VARIABLE GIT_COMMITS OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
else()
|
|
message(WARNING "No Git repository detected in ${CMAKE_SOURCE_DIR}")
|
|
endif()
|
|
endif()
|
|
|
|
configure_file(
|
|
${CMAKE_SOURCE_DIR}/src/version.h.in
|
|
${CMAKE_SOURCE_DIR}/src/version.h
|
|
@ONLY
|
|
)
|
|
|
|
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/version.h PROPERTIES GENERATED TRUE)
|
|
|
|
pkg_check_modules(
|
|
deps
|
|
REQUIRED
|
|
IMPORTED_TARGET
|
|
xkbcommon
|
|
uuid
|
|
wayland-server>=1.22.90
|
|
wayland-protocols>=1.45
|
|
cairo
|
|
pango
|
|
pangocairo
|
|
pixman-1
|
|
xcursor
|
|
libdrm
|
|
libinput>=1.28
|
|
gbm
|
|
gio-2.0
|
|
re2)
|
|
|
|
find_package(hyprwayland-scanner 0.3.10 REQUIRED)
|
|
|
|
file(GLOB_RECURSE SRCFILES "src/*.cpp")
|
|
|
|
set(TRACY_CPP_FILES "")
|
|
if(USE_TRACY)
|
|
set(TRACY_CPP_FILES "subprojects/tracy/public/TracyClient.cpp")
|
|
message(STATUS "Tracy enabled, TRACY_CPP_FILES: " ${TRACY_CPP_FILES})
|
|
endif()
|
|
|
|
add_executable(Hyprland ${SRCFILES} ${TRACY_CPP_FILES})
|
|
|
|
set(USE_GPROF OFF)
|
|
|
|
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG)
|
|
message(STATUS "Setting debug flags")
|
|
|
|
if(WITH_ASAN)
|
|
message(STATUS "Enabling ASan")
|
|
|
|
target_link_libraries(Hyprland asan)
|
|
target_compile_options(Hyprland PUBLIC -fsanitize=address)
|
|
endif()
|
|
|
|
if(USE_TRACY)
|
|
message(STATUS "Tracy is turned on")
|
|
|
|
option(TRACY_ENABLE "" ON)
|
|
option(TRACY_ON_DEMAND "" ON)
|
|
add_subdirectory(subprojects/tracy)
|
|
|
|
target_link_libraries(Hyprland Tracy::TracyClient)
|
|
|
|
if(USE_TRACY_GPU)
|
|
message(STATUS "Tracy GPU Profiling is turned on")
|
|
add_compile_definitions(USE_TRACY_GPU)
|
|
endif()
|
|
endif()
|
|
|
|
add_compile_options(-fno-pie -fno-builtin)
|
|
add_link_options(-no-pie -fno-builtin)
|
|
if(USE_GPROF)
|
|
add_compile_options(-pg)
|
|
add_link_options(-pg)
|
|
endif()
|
|
endif()
|
|
|
|
check_include_file("execinfo.h" EXECINFOH)
|
|
if(EXECINFOH)
|
|
message(STATUS "Configuration supports execinfo")
|
|
add_compile_definitions(HAS_EXECINFO)
|
|
endif()
|
|
|
|
include(CheckLibraryExists)
|
|
check_library_exists(execinfo backtrace "" HAVE_LIBEXECINFO)
|
|
if(HAVE_LIBEXECINFO)
|
|
target_link_libraries(Hyprland execinfo)
|
|
endif()
|
|
|
|
check_include_file("sys/timerfd.h" HAS_TIMERFD)
|
|
pkg_check_modules(epoll IMPORTED_TARGET epoll-shim)
|
|
if(NOT HAS_TIMERFD AND epoll_FOUND)
|
|
target_link_libraries(Hyprland PkgConfig::epoll)
|
|
endif()
|
|
|
|
check_include_file("sys/inotify.h" HAS_INOTIFY)
|
|
pkg_check_modules(inotify IMPORTED_TARGET libinotify)
|
|
if(NOT HAS_INOTIFY AND inotify_FOUND)
|
|
target_link_libraries(Hyprland PkgConfig::inotify)
|
|
endif()
|
|
|
|
if(NO_XWAYLAND)
|
|
message(STATUS "Using the NO_XWAYLAND flag, disabling XWayland!")
|
|
add_compile_definitions(NO_XWAYLAND)
|
|
else()
|
|
message(STATUS "XWAYLAND Enabled (NO_XWAYLAND not defined) checking deps...")
|
|
pkg_check_modules(
|
|
xdeps
|
|
REQUIRED
|
|
IMPORTED_TARGET
|
|
xcb
|
|
xcb-render
|
|
xcb-xfixes
|
|
xcb-icccm
|
|
xcb-composite
|
|
xcb-res
|
|
xcb-errors)
|
|
target_link_libraries(Hyprland PkgConfig::xdeps)
|
|
endif()
|
|
|
|
if(NO_SYSTEMD)
|
|
message(STATUS "SYSTEMD support is disabled...")
|
|
else()
|
|
message(STATUS "SYSTEMD support is requested (NO_SYSTEMD not defined)...")
|
|
add_compile_definitions(USES_SYSTEMD)
|
|
|
|
# session file -uwsm
|
|
if(NO_UWSM)
|
|
message(STATUS "UWSM support is disabled...")
|
|
else()
|
|
message(STATUS "UWSM support is enabled (NO_UWSM not defined)...")
|
|
install(FILES ${CMAKE_SOURCE_DIR}/systemd/hyprland-uwsm.desktop
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/wayland-sessions)
|
|
endif()
|
|
endif()
|
|
|
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
|
include(CPack)
|
|
|
|
if(CMAKE_DISABLE_PRECOMPILE_HEADERS)
|
|
message(STATUS "Not using precompiled headers")
|
|
else()
|
|
message(STATUS "Setting precompiled headers")
|
|
target_precompile_headers(Hyprland PRIVATE
|
|
$<$<COMPILE_LANGUAGE:CXX>:src/pch/pch.hpp>)
|
|
endif()
|
|
|
|
message(STATUS "Setting link libraries")
|
|
|
|
target_link_libraries(
|
|
Hyprland
|
|
rt
|
|
PkgConfig::aquamarine_dep
|
|
PkgConfig::hyprlang_dep
|
|
PkgConfig::hyprutils_dep
|
|
PkgConfig::hyprcursor_dep
|
|
PkgConfig::hyprgraphics_dep
|
|
PkgConfig::deps)
|
|
if(udis_dep_FOUND)
|
|
target_link_libraries(Hyprland PkgConfig::udis_dep)
|
|
else()
|
|
target_link_libraries(Hyprland libudis86)
|
|
endif()
|
|
|
|
# used by `make installheaders`, to ensure the headers are generated
|
|
add_custom_target(generate-protocol-headers)
|
|
|
|
function(protocolnew protoPath protoName external)
|
|
if(external)
|
|
set(path ${protoPath})
|
|
else()
|
|
set(path ${WAYLAND_PROTOCOLS_DIR}/${protoPath})
|
|
endif()
|
|
add_custom_command(
|
|
OUTPUT ${CMAKE_SOURCE_DIR}/protocols/${protoName}.cpp
|
|
${CMAKE_SOURCE_DIR}/protocols/${protoName}.hpp
|
|
COMMAND hyprwayland-scanner ${path}/${protoName}.xml
|
|
${CMAKE_SOURCE_DIR}/protocols/
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
target_sources(Hyprland PRIVATE protocols/${protoName}.cpp
|
|
protocols/${protoName}.hpp)
|
|
target_sources(generate-protocol-headers
|
|
PRIVATE ${CMAKE_SOURCE_DIR}/protocols/${protoName}.hpp)
|
|
endfunction()
|
|
function(protocolWayland)
|
|
add_custom_command(
|
|
OUTPUT ${CMAKE_SOURCE_DIR}/protocols/wayland.cpp
|
|
${CMAKE_SOURCE_DIR}/protocols/wayland.hpp
|
|
COMMAND
|
|
hyprwayland-scanner --wayland-enums
|
|
${WAYLAND_SCANNER_PKGDATA_DIR}/wayland.xml ${CMAKE_SOURCE_DIR}/protocols/
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
target_sources(Hyprland PRIVATE protocols/wayland.cpp protocols/wayland.hpp)
|
|
target_sources(generate-protocol-headers
|
|
PRIVATE ${CMAKE_SOURCE_DIR}/protocols/wayland.hpp)
|
|
endfunction()
|
|
|
|
target_link_libraries(Hyprland OpenGL::EGL OpenGL::GL Threads::Threads)
|
|
|
|
pkg_check_modules(hyprland_protocols_dep hyprland-protocols>=0.6.4)
|
|
if(hyprland_protocols_dep_FOUND)
|
|
pkg_get_variable(HYPRLAND_PROTOCOLS hyprland-protocols pkgdatadir)
|
|
message(STATUS "hyprland-protocols dependency set to ${HYPRLAND_PROTOCOLS}")
|
|
else()
|
|
set(HYPRLAND_PROTOCOLS "subprojects/hyprland-protocols")
|
|
message(STATUS "hyprland-protocols subproject set to ${HYPRLAND_PROTOCOLS}")
|
|
endif()
|
|
|
|
protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-global-shortcuts-v1"
|
|
true)
|
|
protocolnew("unstable/text-input" "text-input-unstable-v1" false)
|
|
protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-toplevel-export-v1"
|
|
true)
|
|
protocolnew("protocols" "wlr-screencopy-unstable-v1" true)
|
|
protocolnew("protocols" "wlr-gamma-control-unstable-v1" true)
|
|
protocolnew("protocols" "wlr-foreign-toplevel-management-unstable-v1" true)
|
|
protocolnew("protocols" "wlr-output-power-management-unstable-v1" true)
|
|
protocolnew("protocols" "virtual-keyboard-unstable-v1" true)
|
|
protocolnew("protocols" "wlr-virtual-pointer-unstable-v1" true)
|
|
protocolnew("protocols" "input-method-unstable-v2" true)
|
|
protocolnew("protocols" "wlr-output-management-unstable-v1" true)
|
|
protocolnew("protocols" "kde-server-decoration" true)
|
|
protocolnew("protocols" "wlr-data-control-unstable-v1" true)
|
|
protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-focus-grab-v1" true)
|
|
protocolnew("protocols" "wlr-layer-shell-unstable-v1" true)
|
|
protocolnew("protocols" "xx-color-management-v4" true)
|
|
protocolnew("protocols" "frog-color-management-v1" true)
|
|
protocolnew("protocols" "wayland-drm" true)
|
|
protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-ctm-control-v1" true)
|
|
protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-surface-v1" true)
|
|
protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-lock-notify-v1" true)
|
|
protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-toplevel-mapping-v1"
|
|
true)
|
|
|
|
protocolnew("staging/tearing-control" "tearing-control-v1" false)
|
|
protocolnew("staging/fractional-scale" "fractional-scale-v1" false)
|
|
protocolnew("unstable/xdg-output" "xdg-output-unstable-v1" false)
|
|
protocolnew("staging/cursor-shape" "cursor-shape-v1" false)
|
|
protocolnew("unstable/idle-inhibit" "idle-inhibit-unstable-v1" false)
|
|
protocolnew("unstable/relative-pointer" "relative-pointer-unstable-v1" false)
|
|
protocolnew("unstable/xdg-decoration" "xdg-decoration-unstable-v1" false)
|
|
protocolnew("staging/alpha-modifier" "alpha-modifier-v1" false)
|
|
protocolnew("staging/ext-foreign-toplevel-list" "ext-foreign-toplevel-list-v1"
|
|
false)
|
|
protocolnew("unstable/pointer-gestures" "pointer-gestures-unstable-v1" false)
|
|
protocolnew("unstable/keyboard-shortcuts-inhibit"
|
|
"keyboard-shortcuts-inhibit-unstable-v1" false)
|
|
protocolnew("unstable/text-input" "text-input-unstable-v3" false)
|
|
protocolnew("unstable/pointer-constraints" "pointer-constraints-unstable-v1"
|
|
false)
|
|
protocolnew("staging/xdg-activation" "xdg-activation-v1" false)
|
|
protocolnew("staging/ext-idle-notify" "ext-idle-notify-v1" false)
|
|
protocolnew("staging/ext-session-lock" "ext-session-lock-v1" false)
|
|
protocolnew("stable/tablet" "tablet-v2" false)
|
|
protocolnew("stable/presentation-time" "presentation-time" false)
|
|
protocolnew("stable/xdg-shell" "xdg-shell" false)
|
|
protocolnew("unstable/primary-selection" "primary-selection-unstable-v1" false)
|
|
protocolnew("staging/xwayland-shell" "xwayland-shell-v1" false)
|
|
protocolnew("stable/viewporter" "viewporter" false)
|
|
protocolnew("stable/linux-dmabuf" "linux-dmabuf-v1" false)
|
|
protocolnew("staging/drm-lease" "drm-lease-v1" false)
|
|
protocolnew("staging/linux-drm-syncobj" "linux-drm-syncobj-v1" false)
|
|
protocolnew("staging/xdg-dialog" "xdg-dialog-v1" false)
|
|
protocolnew("staging/single-pixel-buffer" "single-pixel-buffer-v1" false)
|
|
protocolnew("staging/security-context" "security-context-v1" false)
|
|
protocolnew("staging/content-type" "content-type-v1" false)
|
|
protocolnew("staging/color-management" "color-management-v1" false)
|
|
protocolnew("staging/xdg-toplevel-tag" "xdg-toplevel-tag-v1" false)
|
|
protocolnew("staging/xdg-system-bell" "xdg-system-bell-v1" false)
|
|
protocolnew("staging/ext-workspace" "ext-workspace-v1" false)
|
|
protocolnew("staging/ext-data-control" "ext-data-control-v1" false)
|
|
protocolnew("staging/pointer-warp" "pointer-warp-v1" false)
|
|
protocolnew("staging/fifo" "fifo-v1" false)
|
|
protocolnew("staging/commit-timing" "commit-timing-v1" false)
|
|
|
|
protocolwayland()
|
|
|
|
# tools
|
|
add_subdirectory(hyprctl)
|
|
|
|
if(NO_HYPRPM)
|
|
message(STATUS "hyprpm is disabled")
|
|
else()
|
|
add_subdirectory(hyprpm)
|
|
message(STATUS "hyprpm is enabled (NO_HYPRPM not defined)")
|
|
endif()
|
|
|
|
# binary and symlink
|
|
install(TARGETS Hyprland)
|
|
|
|
install(
|
|
CODE "execute_process( \
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink \
|
|
${CMAKE_INSTALL_FULL_BINDIR}/Hyprland \
|
|
\"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/hyprland\" \
|
|
)")
|
|
# session file
|
|
install(FILES ${CMAKE_SOURCE_DIR}/example/hyprland.desktop
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/wayland-sessions)
|
|
|
|
# allow Hyprland to find assets
|
|
add_compile_definitions(DATAROOTDIR="${CMAKE_INSTALL_FULL_DATAROOTDIR}")
|
|
|
|
# installable assets
|
|
file(GLOB_RECURSE INSTALLABLE_ASSETS "assets/install/*")
|
|
list(FILTER INSTALLABLE_ASSETS EXCLUDE REGEX "meson.build")
|
|
install(FILES ${INSTALLABLE_ASSETS}
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr)
|
|
|
|
# default config
|
|
install(FILES ${CMAKE_SOURCE_DIR}/example/hyprland.conf
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr)
|
|
|
|
# portal config
|
|
install(FILES ${CMAKE_SOURCE_DIR}/assets/hyprland-portals.conf
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/xdg-desktop-portal)
|
|
|
|
# man pages
|
|
file(GLOB_RECURSE MANPAGES "docs/*.1")
|
|
install(FILES ${MANPAGES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
|
|
|
# pkgconfig entry
|
|
install(FILES ${CMAKE_BINARY_DIR}/hyprland.pc
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
|
|
|
|
# protocol headers
|
|
set(HEADERS_PROTO "${CMAKE_CURRENT_SOURCE_DIR}/protocols")
|
|
install(
|
|
DIRECTORY ${HEADERS_PROTO}
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hyprland
|
|
FILES_MATCHING
|
|
PATTERN "*.h*")
|
|
|
|
# hyprland headers
|
|
set(HEADERS_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src")
|
|
install(
|
|
DIRECTORY ${HEADERS_SRC}
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hyprland
|
|
FILES_MATCHING
|
|
PATTERN "*.h"
|
|
PATTERN "*.hpp"
|
|
PATTERN "*.inc")
|
|
|
|
if(BUILD_TESTING OR BUILD_HYPRTESTER)
|
|
message(STATUS "Building hyprtester")
|
|
|
|
add_subdirectory(hyprtester)
|
|
endif()
|
|
|
|
if(BUILD_TESTING)
|
|
message(STATUS "Testing is enabled")
|
|
|
|
enable_testing()
|
|
add_custom_target(tests)
|
|
|
|
add_test(
|
|
NAME "Main Test"
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/hyprtester
|
|
COMMAND hyprtester)
|
|
|
|
add_dependencies(tests hyprtester)
|
|
else()
|
|
message(STATUS "Testing is disabled")
|
|
endif()
|