Hyprland/CMakeLists.txt

251 lines
9.0 KiB
CMake
Raw Normal View History

2023-02-09 11:57:26 +03:00
cmake_minimum_required(VERSION 3.19)
2023-01-11 19:41:03 +03:00
include(CheckIncludeFile)
2023-01-06 17:21:42 +03:00
# Get version
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/props.json PROPS)
string(JSON VER GET ${PROPS} version)
project(Hyprland
2022-03-16 22:50:55 +03:00
DESCRIPTION "A Modern C++ Wayland Compositor"
2023-01-06 17:21:42 +03:00
VERSION ${VER}
2022-03-16 22:50:55 +03:00
)
set(HYPRLAND_VERSION ${VER})
set(PREFIX ${CMAKE_INSTALL_PREFIX})
configure_file(hyprland.pc.in hyprland.pc @ONLY)
2022-03-16 22:50:55 +03:00
set(CMAKE_MESSAGE_LOG_LEVEL "STATUS")
2022-10-27 13:26:35 +03:00
message(STATUS "Gathering git info")
2022-03-16 22:50:55 +03:00
2022-04-22 19:14:25 +03:00
# Get git info
# hash and branch
execute_process(
COMMAND ./scripts/generateVersion.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
2022-04-22 19:14:25 +03:00
#
#
# 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
PREFIX ${CMAKE_SOURCE_DIR}/subprojects/wlroots
SOURCE_DIR ${CMAKE_SOURCE_DIR}/subprojects/wlroots
2024-01-01 20:29:03 +03:00
PATCH_COMMAND sed -E -i -e "s/(soversion = .*$)/soversion = 13032/g" meson.build
CONFIGURE_COMMAND meson setup --reconfigure build --buildtype=${BUILDTYPE_LOWER} -Dwerror=false -Dxwayland=$<IF:$<BOOL:${NO_XWAYLAND}>,disabled,enabled> -Dexamples=false -Drenderers=gles2 $<IF:$<BOOL:${WITH_ASAN}>,-Db_sanitize=address,-Db_sanitize=none>
BUILD_COMMAND ninja -C build
BUILD_ALWAYS true
BUILD_IN_SOURCE true
2023-11-24 13:59:02 +03:00
BUILD_BYPRODUCTS ${CMAKE_SOURCE_DIR}/subprojects/wlroots/build/libwlroots.so.13032
INSTALL_COMMAND echo "wlroots: install not needed"
)
find_program(WaylandScanner NAMES wayland-scanner)
message(STATUS "Found WaylandScanner at ${WaylandScanner}")
execute_process(
COMMAND pkg-config --variable=pkgdatadir wayland-protocols
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE WAYLAND_PROTOCOLS_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Found wayland-protocols at ${WAYLAND_PROTOCOLS_DIR}")
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG)
2022-10-27 13:26:35 +03:00
message(STATUS "Configuring Hyprland in Debug with CMake")
add_compile_definitions(HYPRLAND_DEBUG)
else()
add_compile_options(-O3)
2022-10-27 13:26:35 +03:00
message(STATUS "Configuring Hyprland in Release with CMake")
endif()
2022-10-27 13:26:35 +03:00
include_directories(
.
"src/"
"subprojects/wlroots/include/"
"subprojects/wlroots/build/include/"
"subprojects/udis86/"
"protocols/")
set(CMAKE_CXX_STANDARD 23)
add_compile_definitions(WLR_USE_UNSTABLE)
2023-04-26 19:23:50 +03:00
add_compile_options(-Wall -Wextra -Wno-unused-parameter -Wno-unused-value -Wno-missing-field-initializers -Wno-narrowing -Wno-pointer-arith)
add_link_options(-rdynamic)
set(CMAKE_ENABLE_EXPORTS TRUE)
2022-10-27 13:26:35 +03:00
message(STATUS "Checking deps...")
2022-03-16 22:50:55 +03:00
find_package(Threads REQUIRED)
find_package(PkgConfig REQUIRED)
Unbreak CMake build on FreeBSD (#2209) * cmake: unbreak on non-GNU after 474ada9267cc CMake Error at CMakeLists.txt:121 (target_link_libraries): The keyword signature for target_link_libraries has already been used with the target "Hyprland". All uses of target_link_libraries with a target must be either all-keyword or all-plain. The uses of the keyword signature are here: * CMakeLists.txt:107 (target_link_libraries) Fixes https://github.com/hyprwm/Hyprland/issues/1780 * cmake: always link with dependencies via imported targets On BSD systems base compiler by default only looks for headers and libraries from base system. For dependencies from packages extra flags are necessary. ld: error: unable to find library -lxcb ld: error: unable to find library -lpixman-1 ld: error: unable to find library -lOpenGL ld: error: unable to find library -lGLESv2 * make: use same make in recursive calls On BSDs `make` is BSD make while `gmake` is GNU make * make: work around GNU vs. BSD sed -i incompatibility https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=254091 * make: replace GNU make extension with POSIX sh `$(shell ...)` in GNU make is similar to `${:!..!}` in BSD make * make: fall back when nproc isn't available Only FreeBSD added nproc for compatibility with Linux. * make: unbreak hyprctl on Clang-based systems /bin/sh: g++: not found error: invalid value 'c++23' in '-std=c++23' * make: create lib/ before copying libwlroots.so there $ make install PREFIX=/tmp/test [...] cp: directory /tmp/test/lib does not exist * make: pass cp(1) flags before arguments cp: -f is not a directory * make: replace install -Dt with mkdir install: illegal option -- t * make: replace cp --parents with cpio -dump cp: illegal option -- - * make: limit pkg-config workaround to Linux when run as root /usr/share/pkgconfig doesn't exist on BSDs or may not be writable.
2023-05-02 16:38:36 +03:00
find_package(OpenGL REQUIRED)
pkg_check_modules(deps REQUIRED IMPORTED_TARGET wayland-server wayland-client wayland-cursor wayland-protocols cairo libdrm xkbcommon libinput pango pangocairo pixman-1) # we do not check for wlroots, as we provide it ourselves
2022-03-16 22:50:55 +03:00
file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp")
2022-03-16 22:50:55 +03:00
2023-11-18 02:26:54 +03:00
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)
2022-03-16 22:50:55 +03:00
2023-03-16 18:40:50 +03:00
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG)
message(STATUS "Setting debug flags")
2023-06-01 18:08:11 +03:00
if (WITH_ASAN)
2023-07-16 18:06:05 +03:00
message(STATUS "Enabling ASan")
2023-06-01 18:08:11 +03:00
target_link_libraries(Hyprland asan)
target_compile_options(Hyprland PUBLIC -fsanitize=address)
2023-06-01 18:08:11 +03:00
endif()
2023-03-16 18:40:50 +03:00
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()
2023-06-01 18:08:11 +03:00
add_compile_options(-pg -no-pie -fno-builtin)
2023-03-16 18:40:50 +03:00
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)
Unbreak CMake build on FreeBSD (#2209) * cmake: unbreak on non-GNU after 474ada9267cc CMake Error at CMakeLists.txt:121 (target_link_libraries): The keyword signature for target_link_libraries has already been used with the target "Hyprland". All uses of target_link_libraries with a target must be either all-keyword or all-plain. The uses of the keyword signature are here: * CMakeLists.txt:107 (target_link_libraries) Fixes https://github.com/hyprwm/Hyprland/issues/1780 * cmake: always link with dependencies via imported targets On BSD systems base compiler by default only looks for headers and libraries from base system. For dependencies from packages extra flags are necessary. ld: error: unable to find library -lxcb ld: error: unable to find library -lpixman-1 ld: error: unable to find library -lOpenGL ld: error: unable to find library -lGLESv2 * make: use same make in recursive calls On BSDs `make` is BSD make while `gmake` is GNU make * make: work around GNU vs. BSD sed -i incompatibility https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=254091 * make: replace GNU make extension with POSIX sh `$(shell ...)` in GNU make is similar to `${:!..!}` in BSD make * make: fall back when nproc isn't available Only FreeBSD added nproc for compatibility with Linux. * make: unbreak hyprctl on Clang-based systems /bin/sh: g++: not found error: invalid value 'c++23' in '-std=c++23' * make: create lib/ before copying libwlroots.so there $ make install PREFIX=/tmp/test [...] cp: directory /tmp/test/lib does not exist * make: pass cp(1) flags before arguments cp: -f is not a directory * make: replace install -Dt with mkdir install: illegal option -- t * make: replace cp --parents with cpio -dump cp: illegal option -- - * make: limit pkg-config workaround to Linux when run as root /usr/share/pkgconfig doesn't exist on BSDs or may not be writable.
2023-05-02 16:38:36 +03:00
target_link_libraries(Hyprland execinfo)
endif()
if(LEGACY_RENDERER)
2022-04-13 18:34:13 +03:00
message(STATUS "Using the legacy GLES2 renderer!")
add_compile_definitions(LEGACY_RENDERER)
endif()
2022-04-13 18:34:13 +03:00
if(NO_XWAYLAND)
2022-04-20 16:58:02 +03:00
message(STATUS "Using the NO_XWAYLAND flag, disabling XWayland!")
add_compile_definitions(NO_XWAYLAND)
else()
2022-10-27 13:26:35 +03:00
message(STATUS "XWAYLAND Enabled (NO_XWAYLAND not defined) checking deps...")
Unbreak CMake build on FreeBSD (#2209) * cmake: unbreak on non-GNU after 474ada9267cc CMake Error at CMakeLists.txt:121 (target_link_libraries): The keyword signature for target_link_libraries has already been used with the target "Hyprland". All uses of target_link_libraries with a target must be either all-keyword or all-plain. The uses of the keyword signature are here: * CMakeLists.txt:107 (target_link_libraries) Fixes https://github.com/hyprwm/Hyprland/issues/1780 * cmake: always link with dependencies via imported targets On BSD systems base compiler by default only looks for headers and libraries from base system. For dependencies from packages extra flags are necessary. ld: error: unable to find library -lxcb ld: error: unable to find library -lpixman-1 ld: error: unable to find library -lOpenGL ld: error: unable to find library -lGLESv2 * make: use same make in recursive calls On BSDs `make` is BSD make while `gmake` is GNU make * make: work around GNU vs. BSD sed -i incompatibility https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=254091 * make: replace GNU make extension with POSIX sh `$(shell ...)` in GNU make is similar to `${:!..!}` in BSD make * make: fall back when nproc isn't available Only FreeBSD added nproc for compatibility with Linux. * make: unbreak hyprctl on Clang-based systems /bin/sh: g++: not found error: invalid value 'c++23' in '-std=c++23' * make: create lib/ before copying libwlroots.so there $ make install PREFIX=/tmp/test [...] cp: directory /tmp/test/lib does not exist * make: pass cp(1) flags before arguments cp: -f is not a directory * make: replace install -Dt with mkdir install: illegal option -- t * make: replace cp --parents with cpio -dump cp: illegal option -- - * make: limit pkg-config workaround to Linux when run as root /usr/share/pkgconfig doesn't exist on BSDs or may not be writable.
2023-05-02 16:38:36 +03:00
pkg_check_modules(xcbdep REQUIRED IMPORTED_TARGET xcb)
target_link_libraries(Hyprland PkgConfig::xcbdep)
endif()
2022-03-16 22:50:55 +03:00
if(NO_SYSTEMD)
message(STATUS "SYSTEMD support is disabled...")
else()
message(STATUS "SYSTEMD support is requested (NO_SYSTEMD not defined) checking deps...")
2023-01-11 19:41:03 +03:00
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()
2022-03-16 22:50:55 +03:00
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>)
2022-10-27 13:26:35 +03:00
message(STATUS "Setting link libraries")
2023-07-20 18:53:50 +03:00
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()
2022-03-16 22:50:55 +03:00
target_link_libraries(Hyprland
2023-11-24 13:59:02 +03:00
${CMAKE_SOURCE_DIR}/subprojects/wlroots/build/libwlroots.so.13032 # wlroots is provided by us
Unbreak CMake build on FreeBSD (#2209) * cmake: unbreak on non-GNU after 474ada9267cc CMake Error at CMakeLists.txt:121 (target_link_libraries): The keyword signature for target_link_libraries has already been used with the target "Hyprland". All uses of target_link_libraries with a target must be either all-keyword or all-plain. The uses of the keyword signature are here: * CMakeLists.txt:107 (target_link_libraries) Fixes https://github.com/hyprwm/Hyprland/issues/1780 * cmake: always link with dependencies via imported targets On BSD systems base compiler by default only looks for headers and libraries from base system. For dependencies from packages extra flags are necessary. ld: error: unable to find library -lxcb ld: error: unable to find library -lpixman-1 ld: error: unable to find library -lOpenGL ld: error: unable to find library -lGLESv2 * make: use same make in recursive calls On BSDs `make` is BSD make while `gmake` is GNU make * make: work around GNU vs. BSD sed -i incompatibility https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=254091 * make: replace GNU make extension with POSIX sh `$(shell ...)` in GNU make is similar to `${:!..!}` in BSD make * make: fall back when nproc isn't available Only FreeBSD added nproc for compatibility with Linux. * make: unbreak hyprctl on Clang-based systems /bin/sh: g++: not found error: invalid value 'c++23' in '-std=c++23' * make: create lib/ before copying libwlroots.so there $ make install PREFIX=/tmp/test [...] cp: directory /tmp/test/lib does not exist * make: pass cp(1) flags before arguments cp: -f is not a directory * make: replace install -Dt with mkdir install: illegal option -- t * make: replace cp --parents with cpio -dump cp: illegal option -- - * make: limit pkg-config workaround to Linux when run as root /usr/share/pkgconfig doesn't exist on BSDs or may not be writable.
2023-05-02 16:38:36 +03:00
OpenGL::EGL
OpenGL::GL
Threads::Threads
libudis86
2022-03-16 22:50:55 +03:00
)
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)
2023-07-24 19:50:17 +03:00
protocol("staging/cursor-shape/cursor-shape-v1.xml" "cursor-shape-v1" false)
# tools
add_subdirectory(hyprctl)
add_subdirectory(hyprpm)