1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
cmake_minimum_required(VERSION 3.19)
file(READ "${CMAKE_SOURCE_DIR}/VERSION" VER_RAW)
string(STRIP ${VER_RAW} HYPRWIRE_VERSION)
add_compile_definitions(HYPRWIRE_VERSION="${HYPRWIRE_VERSION}")
project(
hyprwire
VERSION ${HYPRWIRE_VERSION}
DESCRIPTION "A fast and consistent wire protocol for IPC")
include(CTest)
include(CheckIncludeFile)
include(GNUInstallDirs)
add_subdirectory(scanner)
set(PREFIX ${CMAKE_INSTALL_PREFIX})
set(INCLUDE ${CMAKE_INSTALL_FULL_INCLUDEDIR})
set(LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR})
find_package(PkgConfig REQUIRED)
pkg_check_modules(
deps
REQUIRED
IMPORTED_TARGET
hyprutils>=0.9.0
libffi
)
configure_file(hyprwire.pc.in hyprwire.pc @ONLY)
set(CMAKE_CXX_STANDARD 23)
add_compile_options(
-Wall
-Wextra
-Wno-unused-parameter
-Wno-unused-value
-Wno-missing-field-initializers
-Wpedantic)
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG)
message(STATUS "Configuring hyprwire in Debug")
add_compile_definitions(HYPRWIRE_DEBUG)
else()
add_compile_options(-O3)
message(STATUS "Configuring hyprwire in Release")
endif()
add_compile_definitions(HT_HIDDEN=public)
file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp" "include/*.hpp")
file(GLOB_RECURSE PUBLIC_HEADERS CONFIGURE_DEPENDS "include/*.hpp")
execute_process(COMMAND ./scripts/generateShaderIncludes.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
add_library(hyprwire SHARED ${SRCFILES})
target_include_directories(
hyprwire
PUBLIC "./include"
PRIVATE "./src" "${CMAKE_BINARY_DIR}")
set_target_properties(hyprwire PROPERTIES VERSION ${HYPRWIRE_VERSION} SOVERSION
3)
target_link_libraries(hyprwire PkgConfig::deps)
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(hyprwire PkgConfig::epoll)
endif()
# helper func
function(protocol proto_dir proto_name is_client out_base out_var)
if(is_client)
set(mode "--client")
set(suffix "client")
else()
set(mode "")
set(suffix "server")
endif()
set(outdir "${CMAKE_SOURCE_DIR}/tests/generated")
set(xml_in "${proto_dir}/${proto_name}.xml")
set(tmp_cpp "${outdir}/${proto_name}-${suffix}.cpp")
set(tmp_hpp "${outdir}/${proto_name}-${suffix}.hpp")
set(out_cpp "${outdir}/${out_base}-${suffix}.cpp")
set(out_hpp "${outdir}/${out_base}-${suffix}.hpp")
add_custom_command(
OUTPUT "${out_cpp}" "${out_hpp}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${outdir}"
COMMAND hyprwire-scanner ${mode} "${xml_in}" "${outdir}"
DEPENDS hyprwire-scanner "${xml_in}"
VERBATIM
COMMENT
"Generating ${suffix} protocol from ${proto_name}.xml -> ${out_base}-${suffix}.{cpp,hpp}"
)
set(${out_var}
"${out_cpp};${out_hpp}"
PARENT_SCOPE)
endfunction()
# tests
if(BUILD_TESTING)
message(STATUS "building tests is enabled")
enable_testing()
add_custom_target(tests)
message(STATUS "generating protocols")
protocol("${CMAKE_SOURCE_DIR}/tests" "protocol-v1" TRUE "test_protocol_v1"
CLIENT_GEN)
protocol("${CMAKE_SOURCE_DIR}/tests" "protocol-v1" FALSE "test_protocol_v1"
SERVER_GEN)
add_executable(client "${CMAKE_SOURCE_DIR}/tests/Client.cpp"
"tests/generated/test_protocol_v1-client.cpp")
target_link_libraries(client PRIVATE PkgConfig::deps hyprwire)
add_dependencies(tests client)
add_executable(server "${CMAKE_SOURCE_DIR}/tests/Server.cpp"
"tests/generated/test_protocol_v1-server.cpp")
target_link_libraries(server PRIVATE PkgConfig::deps hyprwire)
add_dependencies(tests server)
add_executable(fork "${CMAKE_SOURCE_DIR}/tests/Fork.cpp"
"tests/generated/test_protocol_v1-client.cpp"
"tests/generated/test_protocol_v1-server.cpp")
target_link_libraries(fork PRIVATE PkgConfig::deps hyprwire)
add_dependencies(tests fork)
else()
message(STATUS "building tests is disabled")
endif()
# Installation
install(TARGETS hyprwire)
install(DIRECTORY "include/hyprwire" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_BINARY_DIR}/hyprwire.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|