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 )
2023-03-15 00:50:30 +03:00
project ( Hyprland
2022-03-16 22:50:55 +03:00
D E S C R I P T I O N " A M o d e r n C + + W a y l a n d C o m p o s i t o r "
2023-01-06 17:21:42 +03:00
V E R S I O N $ { V E R }
2022-03-16 22:50:55 +03:00
)
2023-04-27 00:59:16 +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 (
2023-10-10 22:21:57 +03:00
C O M M A N D . / s c r i p t s / g e n e r a t e V e r s i o n . s h
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R } )
2022-04-22 19:14:25 +03:00
#
#
2023-10-14 20:48:05 +03:00
# udis
add_subdirectory ( "subprojects/udis86" )
# wlroots
message ( STATUS "Setting up wlroots" )
include ( ExternalProject )
string ( TOLOWER ${ CMAKE_BUILD_TYPE } BUILDTYPE_LOWER )
ExternalProject_Add (
w l r o o t s
P R E F I X $ { C M A K E _ S O U R C E _ D I R } / s u b p r o j e c t s / w l r o o t s
S O U R C E _ D I R $ { C M A K E _ S O U R C E _ D I R } / s u b p r o j e c t s / w l r o o t s
P A T C H _ C O M M A N D s e d - E - i - e " s / ( s o v e r s i o n = 1 2 ) ( [ ^ 0 3 2 ] | $ $ ) / s o v e r s i o n = 1 2 0 3 2 / g " m e s o n . b u i l d
C O N F I G U R E _ C O M M A N D m e s o n s e t u p b u i l d - - b u i l d t y p e = $ { B U I L D T Y P E _ L O W E R } - D w e r r o r = f a l s e - D e x a m p l e s = f a l s e - D r e n d e r e r s = g l e s 2 $ < I F : $ < B O O L : $ { W I T H _ A S A N } > , - D b _ s a n i t i z e = a d d r e s s , - D b _ s a n i t i z e = n o n e > & & m e s o n s e t u p b u i l d - - b u i l d t y p e = $ { B U I L D T Y P E _ L O W E R } - D w e r r o r = f a l s e - D e x a m p l e s = f a l s e - D r e n d e r e r s = g l e s 2 $ < I F : $ < B O O L : $ { W I T H _ A S A N } > , - D b _ s a n i t i z e = a d d r e s s , - D b _ s a n i t i z e = n o n e > - - r e c o n f i g u r e
B U I L D _ C O M M A N D n i n j a - C b u i l d
B U I L D _ A L W A Y S t r u e
B U I L D _ I N _ S O U R C E t r u e
B U I L D _ B Y P R O D U C T S $ { C M A K E _ S O U R C E _ D I R } / s u b p r o j e c t s / w l r o o t s / b u i l d / l i b w l r o o t s . s o . 1 2 0 3 2
I N S T A L L _ C O M M A N D e c h o " w l r o o t s : i n s t a l l n o t n e e d e d "
)
2023-04-27 00:59:16 +03:00
find_program ( WaylandScanner NAMES wayland-scanner )
message ( STATUS "Found WaylandScanner at ${WaylandScanner}" )
execute_process (
C O M M A N D p k g - c o n f i g - - v a r i a b l e = p k g d a t a d i r w a y l a n d - p r o t o c o l s
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R }
O U T P U T _ V A R I A B L E W A Y L A N D _ P R O T O C O L S _ D I R
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
message ( STATUS "Found wayland-protocols at ${WAYLAND_PROTOCOLS_DIR}" )
2023-03-15 00:50:30 +03:00
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" )
2023-03-15 00:50:30 +03:00
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" )
2023-03-15 00:50:30 +03:00
endif ( )
2022-10-27 13:26:35 +03:00
2023-03-15 00:50:30 +03:00
include_directories (
.
2023-09-04 20:56:02 +03:00
" s r c / "
2023-03-15 00:50:30 +03:00
" s u b p r o j e c t s / w l r o o t s / i n c l u d e / "
" s u b p r o j e c t s / w l r o o t s / b u i l d / i n c l u d e / "
2023-04-27 00:59:16 +03:00
" s u b p r o j e c t s / u d i s 8 6 / "
" p r o t o c o l s / " )
2022-11-22 00:20:51 +03:00
set ( CMAKE_CXX_STANDARD 23 )
2023-03-15 00:50:30 +03:00
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 )
2023-03-15 00:50:30 +03:00
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 )
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
2023-03-15 00:50:30 +03:00
file ( GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp" )
2022-03-16 22:50:55 +03:00
add_executable ( Hyprland ${ SRCFILES } )
2023-10-14 20:48:05 +03:00
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 )
add_compile_options ( -fsanitize=address )
endif ( )
2023-03-16 18:40:50 +03:00
2023-07-20 19:29:37 +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 ( )
2023-10-12 00:27:53 +03:00
check_include_file ( "execinfo.h" EXECINFOH )
if ( EXECINFOH )
message ( STATUS "Configuration supports execinfo" )
add_compile_definitions ( HAS_EXECINFO )
endif ( )
2023-02-20 17:15:15 +03:00
include ( CheckLibraryExists )
check_library_exists ( execinfo backtrace "" HAVE_LIBEXECINFO )
if ( HAVE_LIBEXECINFO )
2023-05-02 16:38:36 +03:00
target_link_libraries ( Hyprland execinfo )
2023-02-20 17:15:15 +03:00
endif ( )
2023-03-15 00:50:30 +03:00
if ( LEGACY_RENDERER )
2022-04-13 18:34:13 +03:00
message ( STATUS "Using the legacy GLES2 renderer!" )
2023-03-15 00:50:30 +03:00
add_compile_definitions ( LEGACY_RENDERER )
endif ( )
2022-04-13 18:34:13 +03:00
2023-03-15 00:50:30 +03:00
if ( NO_XWAYLAND )
2022-04-20 16:58:02 +03:00
message ( STATUS "Using the NO_XWAYLAND flag, disabling XWayland!" )
2023-03-15 00:50:30 +03:00
add_compile_definitions ( NO_XWAYLAND )
else ( )
2022-10-27 13:26:35 +03:00
message ( STATUS "XWAYLAND Enabled (NO_XWAYLAND not defined) checking deps..." )
2023-05-02 16:38:36 +03:00
pkg_check_modules ( xcbdep REQUIRED IMPORTED_TARGET xcb )
target_link_libraries ( Hyprland PkgConfig::xcbdep )
2023-03-15 00:50:30 +03:00
endif ( )
2022-03-16 22:50:55 +03:00
2023-03-15 00:50:30 +03:00
if ( NO_SYSTEMD )
2023-01-05 22:17:55 +03:00
message ( STATUS "SYSTEMD support is disabled..." )
2023-03-15 00:50:30 +03:00
else ( )
2023-01-05 22:17:55 +03:00
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 )
2023-03-15 00:50:30 +03:00
if ( LIBSYSTEMD_FOUND AND SYSTEMDH )
add_compile_definitions ( USES_SYSTEMD )
2023-01-05 22:17:55 +03:00
target_link_libraries ( Hyprland "${LIBSYSTEMD_LIBRARIES}" )
2023-03-15 00:50:30 +03:00
else ( )
2023-01-11 19:41:03 +03:00
message ( WARNING "Systemd support requested but libsystemd or systemd headers were not found" )
2023-03-15 00:50:30 +03:00
endif ( )
endif ( )
2023-01-05 22:17:55 +03:00
2023-03-15 00:50:30 +03:00
target_compile_definitions ( Hyprland
P R I V A T E
" G I T _ C O M M I T _ H A S H = \ " $ { G I T _ C O M M I T _ H A S H } \ " "
" G I T _ B R A N C H = \ " $ { G I T _ B R A N C H } \ " "
" G I T _ C O M M I T _ M E S S A G E = \ " $ { G I T _ C O M M I T _ M E S S A G E } \ " "
2023-04-27 16:28:40 +03:00
" G I T _ D I R T Y = \ " $ { G I T _ D I R T Y } \ " "
" G I T _ T A G = \ " $ { G I T _ T A G } \ " " )
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 )
2023-09-04 20:56:02 +03:00
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 )
2023-04-27 00:59:16 +03:00
function ( protocol protoPath protoName external )
if ( external )
execute_process (
C O M M A N D $ { W a y l a n d S c a n n e r } s e r v e r - h e a d e r $ { p r o t o P a t h } p r o t o c o l s / $ { p r o t o N a m e } - p r o t o c o l . h
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R } )
execute_process (
C O M M A N D $ { W a y l a n d S c a n n e r } p r i v a t e - c o d e $ { p r o t o P a t h } p r o t o c o l s / $ { p r o t o N a m e } - p r o t o c o l . c
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R } )
target_sources ( Hyprland PRIVATE protocols/ ${ protoName } -protocol.c )
else ( )
execute_process (
C O M M A N D $ { W a y l a n d S c a n n e r } s e r v e r - h e a d e r $ { W A Y L A N D _ P R O T O C O L S _ D I R } / $ { p r o t o P a t h } p r o t o c o l s / $ { p r o t o N a m e } - p r o t o c o l . h
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R } )
execute_process (
C O M M A N D $ { W a y l a n d S c a n n e r } p r i v a t e - c o d e $ { W A Y L A N D _ P R O T O C O L S _ D I R } / $ { p r o t o P a t h } p r o t o c o l s / $ { p r o t o N a m e } - p r o t o c o l . c
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R } )
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
$ { C M A K E _ S O U R C E _ D I R } / s u b p r o j e c t s / w l r o o t s / b u i l d / l i b w l r o o t s . s o . 1 2 0 3 2 # wlroots is provided by us
2023-05-02 16:38:36 +03:00
O p e n G L : : E G L
O p e n G L : : G L
T h r e a d s : : T h r e a d s
2023-10-14 20:48:05 +03:00
l i b u d i s 8 6
2022-03-16 22:50:55 +03:00
)
2023-04-27 00:59:16 +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 )
2023-06-23 22:14:04 +03:00
protocol ( "unstable/xdg-output/xdg-output-unstable-v1.xml" "xdg-output-unstable-v1" false )
2023-04-27 00:59:16 +03:00
protocol ( "staging/fractional-scale/fractional-scale-v1.xml" "fractional-scale-v1" false )
2023-09-28 23:48:33 +03:00
protocol ( "staging/tearing-control/tearing-control-v1.xml" "tearing-control-v1" false )
2023-04-27 00:59:16 +03:00
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 )
2023-10-14 20:48:05 +03:00
# hyprctl
add_subdirectory ( hyprctl )