mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-22 15:25:58 +01:00
9e4b2efe7e
* remove unnecessary include * cmake: use pkg_get_variable We can find wayland-scanner executable and wayland-protocols dir by taking advantage of this function, so no need to use find_program or manually call pkgconf executable. * cmake: remove explicit rdynamic option CMAKE_ENABLE_EXPORTS=ON already implies rdynamic so it's redundant to set the latter explicitly. Also, CMAKE_ENABLE_EXPORTS is superseded by CMAKE_EXECUTABLE_ENABLE_EXPORTS in cmake 3.27. * cmake: make xcb-errors dep optional xcb-errors is being used in wlroots, where it's optional. So make it optional in hyprland as well
263 lines
9.2 KiB
CMake
Executable file
263 lines
9.2 KiB
CMake
Executable file
cmake_minimum_required(VERSION 3.27)
|
|
include(CheckIncludeFile)
|
|
|
|
# Get version
|
|
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/props.json PROPS)
|
|
string(JSON VER GET ${PROPS} version)
|
|
|
|
project(Hyprland
|
|
DESCRIPTION "A Modern C++ Wayland Compositor"
|
|
VERSION ${VER}
|
|
)
|
|
|
|
set(HYPRLAND_VERSION ${VER})
|
|
set(PREFIX ${CMAKE_INSTALL_PREFIX})
|
|
configure_file(hyprland.pc.in hyprland.pc @ONLY)
|
|
|
|
set(CMAKE_MESSAGE_LOG_LEVEL "STATUS")
|
|
|
|
message(STATUS "Gathering git info")
|
|
|
|
# Get git info
|
|
# hash and branch
|
|
execute_process(
|
|
COMMAND ./scripts/generateVersion.sh
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
#
|
|
#
|
|
|
|
# udis
|
|
add_subdirectory("subprojects/udis86")
|
|
|
|
# wlroots
|
|
message(STATUS "Setting up wlroots")
|
|
|
|
include(ExternalProject)
|
|
|
|
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()
|
|
|
|
ExternalProject_Add(
|
|
wlroots-hyprland
|
|
PREFIX ${CMAKE_SOURCE_DIR}/subprojects/wlroots-hyprland
|
|
SOURCE_DIR ${CMAKE_SOURCE_DIR}/subprojects/wlroots-hyprland
|
|
CONFIGURE_COMMAND meson setup --reconfigure build --buildtype=${BUILDTYPE_LOWER} -Dwerror=false -Dxwayland=$<IF:$<BOOL:${NO_XWAYLAND}>,disabled,enabled> -Dexamples=false -Drenderers=gles2 -Dbackends=drm,libinput $<IF:$<BOOL:${WITH_ASAN}>,-Db_sanitize=address,-Db_sanitize=none>
|
|
BUILD_COMMAND ninja -C build
|
|
BUILD_ALWAYS true
|
|
BUILD_IN_SOURCE true
|
|
BUILD_BYPRODUCTS ${CMAKE_SOURCE_DIR}/subprojects/wlroots-hyprland/build/libwlroots.a
|
|
INSTALL_COMMAND echo "wlroots-hyprland: install not needed"
|
|
)
|
|
|
|
find_package(PkgConfig REQUIRED)
|
|
|
|
pkg_get_variable(WaylandScanner wayland-scanner wayland_scanner)
|
|
message(STATUS "Found WaylandScanner at ${WaylandScanner}")
|
|
pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
|
|
message(STATUS "Found wayland-protocols at ${WAYLAND_PROTOCOLS_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()
|
|
|
|
include_directories(
|
|
.
|
|
"src/"
|
|
"subprojects/wlroots-hyprland/include/"
|
|
"subprojects/wlroots-hyprland/build/include/"
|
|
"subprojects/udis86/"
|
|
"protocols/")
|
|
set(CMAKE_CXX_STANDARD 23)
|
|
add_compile_definitions(WLR_USE_UNSTABLE)
|
|
add_compile_options(-Wall -Wextra -Wno-unused-parameter -Wno-unused-value -Wno-missing-field-initializers -Wno-narrowing -Wno-pointer-arith)
|
|
|
|
set(CMAKE_EXECUTABLE_ENABLE_EXPORTS TRUE)
|
|
|
|
message(STATUS "Checking deps...")
|
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
if(LEGACY_RENDERER)
|
|
set(GLES_VERSION "GLES2")
|
|
else()
|
|
set(GLES_VERSION "GLES3")
|
|
endif()
|
|
find_package(OpenGL REQUIRED COMPONENTS ${GLES_VERSION})
|
|
|
|
pkg_check_modules(deps REQUIRED IMPORTED_TARGET
|
|
xkbcommon
|
|
wayland-server wayland-client wayland-cursor wayland-protocols
|
|
cairo pango pangocairo pixman-1
|
|
libdrm libinput hwdata libseat libdisplay-info libliftoff libudev gbm
|
|
hyprlang>=0.3.2 hyprcursor
|
|
)
|
|
|
|
file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "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})
|
|
add_dependencies(Hyprland wlroots-hyprland)
|
|
|
|
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(-pg -no-pie -fno-builtin)
|
|
add_link_options(-pg -no-pie -fno-builtin)
|
|
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()
|
|
|
|
if(LEGACY_RENDERER)
|
|
message(STATUS "Using the legacy GLES2 renderer!")
|
|
add_compile_definitions(LEGACY_RENDERER)
|
|
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 xwayland xcb-util xcb-render xcb-image xcb-xfixes xcb-icccm xcb-composite xcb-res xcb-ewmh)
|
|
pkg_check_modules(xcb_errors IMPORTED_TARGET xcb-errors)
|
|
target_link_libraries(Hyprland PkgConfig::xdeps)
|
|
if(xcb_errors_FOUND)
|
|
target_link_libraries(Hyprland PkgConfig::xcb_errors)
|
|
endif()
|
|
endif()
|
|
|
|
if(NO_SYSTEMD)
|
|
message(STATUS "SYSTEMD support is disabled...")
|
|
else()
|
|
message(STATUS "SYSTEMD support is requested (NO_SYSTEMD not defined) checking deps...")
|
|
check_include_file("systemd/sd-daemon.h" SYSTEMDH)
|
|
if(SYSTEMDH)
|
|
pkg_check_modules(LIBSYSTEMD libsystemd)
|
|
if (LIBSYSTEMD_FOUND)
|
|
add_compile_definitions(USES_SYSTEMD)
|
|
target_link_libraries(Hyprland "${LIBSYSTEMD_LIBRARIES}")
|
|
message(STATUS "Systemd found")
|
|
else()
|
|
message(WARNING "Systemd support requested but systemd libraries were not found")
|
|
endif()
|
|
else()
|
|
message(WARNING "Systemd support requested but systemd headers were not found")
|
|
endif()
|
|
endif()
|
|
|
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
|
include(CPack)
|
|
|
|
message(STATUS "Setting precompiled headers")
|
|
|
|
target_precompile_headers(Hyprland PRIVATE $<$<COMPILE_LANGUAGE:CXX>:src/pch/pch.hpp>)
|
|
|
|
message(STATUS "Setting link libraries")
|
|
|
|
target_link_libraries(Hyprland rt PkgConfig::deps)
|
|
|
|
function(protocol protoPath protoName external)
|
|
if (external)
|
|
execute_process(
|
|
COMMAND ${WaylandScanner} server-header ${protoPath} protocols/${protoName}-protocol.h
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
execute_process(
|
|
COMMAND ${WaylandScanner} private-code ${protoPath} protocols/${protoName}-protocol.c
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
target_sources(Hyprland PRIVATE protocols/${protoName}-protocol.c)
|
|
else()
|
|
execute_process(
|
|
COMMAND ${WaylandScanner} server-header ${WAYLAND_PROTOCOLS_DIR}/${protoPath} protocols/${protoName}-protocol.h
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
execute_process(
|
|
COMMAND ${WaylandScanner} private-code ${WAYLAND_PROTOCOLS_DIR}/${protoPath} protocols/${protoName}-protocol.c
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
target_sources(Hyprland PRIVATE protocols/${protoName}-protocol.c)
|
|
endif()
|
|
endfunction()
|
|
|
|
target_link_libraries(Hyprland
|
|
${CMAKE_SOURCE_DIR}/subprojects/wlroots-hyprland/build/libwlroots.a
|
|
OpenGL::EGL
|
|
OpenGL::GL
|
|
Threads::Threads
|
|
libudis86
|
|
)
|
|
|
|
protocol("protocols/idle.xml" "idle" true)
|
|
protocol("protocols/pointer-constraints-unstable-v1.xml" "pointer-constraints-unstable-v1" true)
|
|
protocol("protocols/tablet-unstable-v2.xml" "tablet-unstable-v2" true)
|
|
protocol("protocols/wlr-foreign-toplevel-management-unstable-v1.xml" "wlr-foreign-toplevel-management-unstable-v1" true)
|
|
protocol("protocols/wlr-layer-shell-unstable-v1.xml" "wlr-layer-shell-unstable-v1" true)
|
|
protocol("protocols/wlr-output-power-management-unstable-v1.xml" "wlr-output-power-management-unstable-v1" true)
|
|
protocol("protocols/wlr-screencopy-unstable-v1.xml" "wlr-screencopy-unstable-v1" true)
|
|
protocol("subprojects/hyprland-protocols/protocols/hyprland-global-shortcuts-v1.xml" "hyprland-global-shortcuts-v1" true)
|
|
protocol("subprojects/hyprland-protocols/protocols/hyprland-toplevel-export-v1.xml" "hyprland-toplevel-export-v1" true)
|
|
protocol("stable/xdg-shell/xdg-shell.xml" "xdg-shell" false)
|
|
protocol("unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml" "linux-dmabuf-unstable-v1" false)
|
|
protocol("unstable/xdg-output/xdg-output-unstable-v1.xml" "xdg-output-unstable-v1" false)
|
|
protocol("staging/fractional-scale/fractional-scale-v1.xml" "fractional-scale-v1" false)
|
|
protocol("staging/tearing-control/tearing-control-v1.xml" "tearing-control-v1" false)
|
|
protocol("unstable/text-input/text-input-unstable-v1.xml" "text-input-unstable-v1" false)
|
|
protocol("staging/cursor-shape/cursor-shape-v1.xml" "cursor-shape-v1" false)
|
|
|
|
# tools
|
|
add_subdirectory(hyprctl)
|
|
add_subdirectory(hyprpm)
|