-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
265 lines (237 loc) · 10.5 KB
/
Copy pathCMakeLists.txt
File metadata and controls
265 lines (237 loc) · 10.5 KB
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
cmake_minimum_required(VERSION 3.10)
project(mwb_client CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
option(MWB_ENABLE_SANITIZERS "Build with compiler sanitizers for debug hardening" OFF)
set(MWB_SANITIZERS "address,undefined" CACHE STRING "Comma-separated sanitizer list used when MWB_ENABLE_SANITIZERS=ON")
if (MWB_ENABLE_SANITIZERS AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
include(CheckCXXSourceCompiles)
set(CMAKE_REQUIRED_FLAGS "-fsanitize=${MWB_SANITIZERS}")
check_cxx_source_compiles("int main() { return 0; }" MWB_SANITIZER_RUNTIME_AVAILABLE)
unset(CMAKE_REQUIRED_FLAGS)
if (NOT MWB_SANITIZER_RUNTIME_AVAILABLE)
message(FATAL_ERROR "MWB_ENABLE_SANITIZERS=ON, but the requested sanitizer runtime is not linkable by this compiler")
endif()
endif()
function(mwb_apply_sanitizers target)
if (MWB_ENABLE_SANITIZERS AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(${target} PRIVATE
-O1
-g
-fno-omit-frame-pointer
-fsanitize=${MWB_SANITIZERS}
)
set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " -fsanitize=${MWB_SANITIZERS}")
endif()
endfunction()
# Find OpenSSL for AES decryption/encryption matching PowerToys MWB
find_package(OpenSSL REQUIRED)
find_package(ZLIB REQUIRED)
find_package(X11 REQUIRED)
add_executable(mwb_client
src/AndroidRelay.cpp
src/AppConfig.cpp
src/AppState.cpp
src/ClientRuntime.cpp
src/Discovery.cpp
src/InputDispatcher.cpp
src/LibeiInputCaptureBridge.cpp
src/LocalAndroidInputBridge.cpp
src/main.cpp
src/PeerRecovery.cpp
src/SecretStore.cpp
src/TopologyModel.cpp
src/ClipboardManager.cpp
src/CryptoHelper.cpp
src/InputManager.cpp
src/MediaKeyBridge.cpp
src/NetworkManager.cpp
)
target_include_directories(mwb_client PRIVATE src)
target_include_directories(mwb_client PRIVATE ${OPENSSL_INCLUDE_DIR})
target_include_directories(mwb_client PRIVATE ${X11_INCLUDE_DIR})
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(mwb_client PRIVATE
-Wall
-Wextra
-Wpedantic
-Wformat=2
-Werror=format-security
-fstack-protector-strong
)
target_compile_definitions(mwb_client PRIVATE
$<$<AND:$<NOT:$<CONFIG:Debug>>,$<NOT:$<BOOL:${MWB_ENABLE_SANITIZERS}>>>:_FORTIFY_SOURCE=3>
_GLIBCXX_ASSERTIONS
)
set_property(TARGET mwb_client APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-z,relro,-z,now")
endif()
mwb_apply_sanitizers(mwb_client)
target_link_libraries(mwb_client PRIVATE
OpenSSL::SSL
OpenSSL::Crypto
ZLIB::ZLIB
${X11_LIBRARIES}
pthread
)
include(CTest)
find_package(PkgConfig QUIET)
if (PkgConfig_FOUND)
pkg_check_modules(LIBEI_INPUT_CAPTURE QUIET libei-1.0 gio-unix-2.0 gio-2.0 glib-2.0)
pkg_check_modules(LIBINPUT_GESTURES QUIET libinput)
endif()
if (LIBEI_INPUT_CAPTURE_FOUND)
target_compile_definitions(mwb_client PRIVATE MWB_HAVE_LIBEI_INPUT_CAPTURE=1)
target_include_directories(mwb_client PRIVATE ${LIBEI_INPUT_CAPTURE_INCLUDE_DIRS})
target_link_libraries(mwb_client PRIVATE ${LIBEI_INPUT_CAPTURE_LDFLAGS})
endif()
if (LIBINPUT_GESTURES_FOUND)
message(STATUS "Native libinput gesture monitor enabled")
target_compile_definitions(mwb_client PRIVATE MWB_HAVE_LIBINPUT_GESTURES=1)
target_include_directories(mwb_client PRIVATE ${LIBINPUT_GESTURES_INCLUDE_DIRS})
target_link_libraries(mwb_client PRIVATE ${LIBINPUT_GESTURES_LDFLAGS})
else()
message(STATUS "Native libinput gesture monitor disabled; install libinput-devel to enable it")
endif()
if (BUILD_TESTING)
find_program(PYTHON3_EXECUTABLE python3)
add_executable(mwb_client_unit_tests
tests/test_main.cpp
src/AndroidRelay.cpp
src/AppConfig.cpp
src/AppState.cpp
src/Discovery.cpp
src/PeerRecovery.cpp
)
target_include_directories(mwb_client_unit_tests PRIVATE src)
target_compile_options(mwb_client_unit_tests PRIVATE -Wall -Wextra -Wpedantic)
target_link_libraries(mwb_client_unit_tests PRIVATE OpenSSL::Crypto pthread)
mwb_apply_sanitizers(mwb_client_unit_tests)
add_executable(mwb_input_mapping_tests
tests/test_input_mapping.cpp
)
target_include_directories(mwb_input_mapping_tests PRIVATE src)
target_compile_options(mwb_input_mapping_tests PRIVATE -Wall -Wextra -Wpedantic)
mwb_apply_sanitizers(mwb_input_mapping_tests)
add_executable(mwb_inject_mouse_abs_tests
tests/test_inject_mouse_abs.cpp
)
target_include_directories(mwb_inject_mouse_abs_tests PRIVATE src)
target_compile_options(mwb_inject_mouse_abs_tests PRIVATE -Wall -Wextra -Wpedantic)
mwb_apply_sanitizers(mwb_inject_mouse_abs_tests)
add_executable(mwb_input_device_capability_tests
tests/test_input_device_capabilities.cpp
)
target_include_directories(mwb_input_device_capability_tests PRIVATE src)
target_compile_options(mwb_input_device_capability_tests PRIVATE -Wall -Wextra -Wpedantic)
mwb_apply_sanitizers(mwb_input_device_capability_tests)
add_executable(mwb_input_latency_tests
tests/test_input_latency.cpp
)
target_include_directories(mwb_input_latency_tests PRIVATE src)
target_compile_options(mwb_input_latency_tests PRIVATE -Wall -Wextra -Wpedantic)
mwb_apply_sanitizers(mwb_input_latency_tests)
add_executable(mwb_topology_model_tests
tests/test_topology_model.cpp
src/TopologyModel.cpp
)
target_include_directories(mwb_topology_model_tests PRIVATE src)
target_compile_options(mwb_topology_model_tests PRIVATE -Wall -Wextra -Wpedantic)
mwb_apply_sanitizers(mwb_topology_model_tests)
add_executable(mwb_mouse_trace_tests
tests/test_mouse_trace.cpp
src/InputManager.cpp
src/MediaKeyBridge.cpp
)
target_include_directories(mwb_mouse_trace_tests PRIVATE src)
target_compile_options(mwb_mouse_trace_tests PRIVATE -Wall -Wextra -Wpedantic)
target_link_libraries(mwb_mouse_trace_tests PRIVATE pthread)
mwb_apply_sanitizers(mwb_mouse_trace_tests)
add_executable(mwb_media_key_bridge_tests
tests/test_media_key_bridge.cpp
src/MediaKeyBridge.cpp
)
target_include_directories(mwb_media_key_bridge_tests PRIVATE src)
target_compile_options(mwb_media_key_bridge_tests PRIVATE -Wall -Wextra -Wpedantic)
mwb_apply_sanitizers(mwb_media_key_bridge_tests)
add_executable(mwb_protocol_security_tests
tests/test_protocol_security.cpp
src/ClipboardManager.cpp
)
target_include_directories(mwb_protocol_security_tests PRIVATE src)
target_compile_options(mwb_protocol_security_tests PRIVATE -Wall -Wextra -Wpedantic)
target_link_libraries(mwb_protocol_security_tests PRIVATE
ZLIB::ZLIB
)
mwb_apply_sanitizers(mwb_protocol_security_tests)
add_executable(mwb_clipboard_socket_security_tests
tests/test_clipboard_socket_security.cpp
src/ClipboardManager.cpp
src/CryptoHelper.cpp
src/NetworkManager.cpp
)
target_include_directories(mwb_clipboard_socket_security_tests PRIVATE src)
target_compile_options(mwb_clipboard_socket_security_tests PRIVATE -Wall -Wextra -Wpedantic)
target_link_libraries(mwb_clipboard_socket_security_tests PRIVATE
OpenSSL::SSL
OpenSSL::Crypto
ZLIB::ZLIB
pthread
)
mwb_apply_sanitizers(mwb_clipboard_socket_security_tests)
add_test(NAME mwb_client_unit_tests COMMAND mwb_client_unit_tests)
add_test(NAME mwb_input_mapping_tests COMMAND mwb_input_mapping_tests)
add_test(NAME mwb_inject_mouse_abs_tests COMMAND mwb_inject_mouse_abs_tests)
add_test(NAME mwb_input_device_capability_tests COMMAND mwb_input_device_capability_tests)
add_test(NAME mwb_input_latency_tests COMMAND mwb_input_latency_tests)
add_test(NAME mwb_topology_model_tests COMMAND mwb_topology_model_tests)
if (PYTHON3_EXECUTABLE)
add_test(NAME mwb_topology_config_docs
COMMAND "${PYTHON3_EXECUTABLE}"
"${CMAKE_CURRENT_SOURCE_DIR}/tests/topology_config_docs_test.py"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/topology.md"
)
endif()
add_test(NAME mwb_mouse_trace_tests COMMAND mwb_mouse_trace_tests)
add_test(NAME mwb_media_key_bridge_tests COMMAND mwb_media_key_bridge_tests)
add_test(NAME mwb_protocol_security_tests COMMAND mwb_protocol_security_tests)
add_test(NAME mwb_clipboard_socket_security_tests COMMAND mwb_clipboard_socket_security_tests)
add_test(NAME mwb_client_help COMMAND mwb_client --help)
add_test(NAME mwb_client_doctor COMMAND mwb_client doctor --config "${CMAKE_CURRENT_BINARY_DIR}/missing-doctor-config.ini")
add_test(NAME mwb_client_topology_explain
COMMAND mwb_client topology explain "${CMAKE_CURRENT_SOURCE_DIR}/tests/simple.topology"
)
add_test(NAME mwb_client_doctor_categories
COMMAND ${CMAKE_COMMAND}
"-DMWB_CLIENT=$<TARGET_FILE:mwb_client>"
"-DCONFIG_PATH=${CMAKE_CURRENT_BINARY_DIR}/missing-doctor-config.ini"
-P "${CMAKE_CURRENT_SOURCE_DIR}/tests/doctor_categories.cmake"
)
add_test(NAME mwb_export_windows_pair_helper
COMMAND ${CMAKE_COMMAND}
"-DMWB_CLIENT=$<TARGET_FILE:mwb_client>"
"-DTEST_DIR=${CMAKE_CURRENT_BINARY_DIR}/export_windows_pair"
-P "${CMAKE_CURRENT_SOURCE_DIR}/tests/export_windows_pair_helper.cmake"
)
add_test(NAME mwb_client_doctor_invalid_config COMMAND mwb_client doctor --config "${CMAKE_CURRENT_SOURCE_DIR}/tests/invalid_config.ini")
set_tests_properties(mwb_client_doctor_invalid_config PROPERTIES WILL_FAIL TRUE)
endif()
if (PkgConfig_FOUND)
pkg_check_modules(MWB_TRAY_DEPS QUIET IMPORTED_TARGET gtk+-3.0 ayatana-appindicator3-0.1)
if (MWB_TRAY_DEPS_FOUND)
# Embed tray + GUI window into the main mwb_client binary
target_sources(mwb_client PRIVATE
src/TrayController.cpp
src/GuiMainWindow.cpp
src/MonitorLayoutWidget.cpp
)
target_compile_definitions(mwb_client PRIVATE MWB_HAVE_GTK_GUI=1)
target_link_libraries(mwb_client PRIVATE PkgConfig::MWB_TRAY_DEPS)
# Keep standalone mwb_tray as a fallback (no embedded runtime)
add_executable(mwb_tray src/TrayController.cpp)
target_link_libraries(mwb_tray PRIVATE PkgConfig::MWB_TRAY_DEPS)
mwb_apply_sanitizers(mwb_tray)
endif()
endif()