Hyprland/CMakeLists.txt

224 lines
8.1 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 git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND git rev-parse HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
2022-12-09 16:57:39 +03:00
COMMAND sh -c "git show ${GIT_COMMIT_HASH} | head -n 5 | tail -n 1 | sed -e 's/#//g' -e 's/\"//g'"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_MESSAGE
OUTPUT_STRIP_TRAILING_WHITESPACE)
2022-04-22 19:33:30 +03:00
execute_process(
2022-10-22 09:23:52 +03:00
COMMAND sh -c "git diff-index --quiet HEAD -- || echo \"dirty\""
2022-04-22 19:33:30 +03:00
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_DIRTY
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND sh -c "git describe --tags"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE)
2022-04-22 19:14:25 +03:00
#
#
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
add_executable(Hyprland ${SRCFILES})
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)
add_compile_options(-fsanitize=address)
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()
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...")
pkg_check_modules(LIBSYSTEMD libsystemd)
2023-01-11 19:41:03 +03:00
check_include_file("systemd/sd-daemon.h" SYSTEMDH)
if(LIBSYSTEMD_FOUND AND SYSTEMDH)
add_compile_definitions(USES_SYSTEMD)
target_link_libraries(Hyprland "${LIBSYSTEMD_LIBRARIES}")
else()
2023-01-11 19:41:03 +03:00
message(WARNING "Systemd support requested but libsystemd or systemd headers were not found")
endif()
endif()
target_compile_definitions(Hyprland
PRIVATE
"GIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\""
"GIT_BRANCH=\"${GIT_BRANCH}\""
"GIT_COMMIT_MESSAGE=\"${GIT_COMMIT_MESSAGE}\""
"GIT_DIRTY=\"${GIT_DIRTY}\""
"GIT_TAG=\"${GIT_TAG}\"")
2022-04-22 19:14:25 +03:00
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
2022-12-12 17:38:50 +03:00
${CMAKE_SOURCE_DIR}/subprojects/wlroots/build/libwlroots.so.12032 # 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
${CMAKE_SOURCE_DIR}/subprojects/udis86/build/libudis86/liblibudis86.a
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)