-
-
Notifications
You must be signed in to change notification settings - Fork 176
/
Copy pathCMakeLists.txt
450 lines (407 loc) · 12.6 KB
/
CMakeLists.txt
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
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
cmake_minimum_required(VERSION 3.15.0)
IF (NOT WIN32)
set(ENV{VCPKG_FORCE_SYSTEM_BINARIES} "true")
ENDIF()
# Enable vcpkg
set(CMAKE_TOOLCHAIN_FILE
"${CMAKE_SOURCE_DIR}/external_imported/vcpkg/scripts/buildsystems/vcpkg.cmake")
# Set the triplet
if(WIN32)
set(VCPKG_TARGET_TRIPLET "x64-windows-static")
elseif(APPLE)
execute_process(
COMMAND uname -m
COMMAND tr -d '\n'
OUTPUT_VARIABLE ARCHITECTURE)
message(STATUS "Architecture: ${ARCHITECTURE}")
if(${ARCHITECTURE} STREQUAL "arm64") # Apple Silicon
set(VCPKG_TARGET_TRIPLET "arm64-osx")
else()
set(VCPKG_TARGET_TRIPLET "x64-osx")
endif()
else()
execute_process(
COMMAND uname -m
COMMAND tr -d '\n'
OUTPUT_VARIABLE ARCHITECTURE)
message(STATUS "Architecture: ${ARCHITECTURE}")
if(${ARCHITECTURE} STREQUAL "x86_64")
set(VCPKG_TARGET_TRIPLET "x64-linux")
elseif(${ARCHITECTURE} STREQUAL "x86_86")
set(VCPKG_TARGET_TRIPLET "x86-linux")
elseif(${ARCHITECTURE} STREQUAL "arm64")
set(VCPKG_TARGET_TRIPLET "arm64-linux")
elseif(${ARCHITECTURE} MATCHES "arm.*")
set(VCPKG_TARGET_TRIPLET "arm-linux")
else()
set(VCPKG_TARGET_TRIPLET "${ARCHITECTURE}-linux")
endif()
endif()
# Some hacks to fix vcpkg
if(WIN32)
set(Protobuf_PROTOC_EXECUTABLE
"${CMAKE_SOURCE_DIR}/external_imported/vcpkg/packages/protobuf_${VCPKG_TARGET_TRIPLET}/tools/protobuf/protoc.exe"
)
set(ZLIB_LIBRARY_RELEASE
"${CMAKE_CURRENT_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/lib/zlib.lib"
)
set(ZLIB_LIBRARY_DEBUG
"${CMAKE_CURRENT_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/debug/lib/zlibd.lib"
)
else()
set(Protobuf_PROTOC_EXECUTABLE
"${CMAKE_SOURCE_DIR}/external_imported/vcpkg/packages/protobuf_${VCPKG_TARGET_TRIPLET}/tools/protobuf/protoc"
)
endif()
project(EternalTCP VERSION 6.1.0)
include(CMakeFindDependencyMacro)
# Add cmake script directory.
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external_imported/sanitizers-cmake/cmake"
${CMAKE_MODULE_PATH})
# Required packages
find_package(OpenSSL REQUIRED)
find_package(Sanitizers REQUIRED)
find_package(Threads REQUIRED)
find_package(sodium REQUIRED)
set(Protobuf_USE_STATIC_LIBS ON)
set(protobuf_MSVC_STATIC_RUNTIME ON)
find_package(Protobuf REQUIRED)
find_package(ZLIB REQUIRED)
find_package(Unwind)
# Optional packages
find_package(UTempter)
if(LINUX)
find_package(SELinux)
endif()
if(MSVC)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
set(SENTRY_BUILD_RUNTIMESTATIC ON)
set(BUILD_SHARED_LIBS OFF)
add_subdirectory("external_imported/sentry-native")
add_subdirectory("external_imported/PlatformFolders")
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external_imported/cotire/CMake"
${CMAKE_MODULE_PATH})
include(cotire)
if(POLICY CMP0058)
cmake_policy(SET CMP0058 NEW) # Needed for cotire
endif()
option(CODE_COVERAGE "Enable code coverage" OFF)
option(DISABLE_CRASH_LOG "Disable installing easylogging crash handler" OFF)
add_definitions(-DET_VERSION="${PROJECT_VERSION}")
# For easylogging, disable default log file, enable crash log, ensure thread
# safe, and catch c++ exceptions
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -DELPP_NO_DEFAULT_LOG_FILE -DELPP_FEATURE_CRASH_LOG -DELPP_THREAD_SAFE -DSENTRY_BUILD_STATIC"
)
if(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g --coverage")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g --coverage")
endif(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
if(DISABLE_CRASH_LOG)
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -DELPP_DISABLE_DEFAULT_CRASH_HANDLING")
endif(DISABLE_CRASH_LOG)
if(UNIX)
# Enable debug info
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb3")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -ggdb3")
endif()
# Enable C++-17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(WIN32)
# Enable unicode
add_definitions(-DUNICODE)
add_definitions(-D_UNICODE)
endif()
# Using FreeBSD?
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
set(FREEBSD TRUE)
endif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
# Using NetBSD?
if(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
set(NETBSD TRUE)
endif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
option(FULL_PROTOBUF "Link to full protobuf library instead of protobuf-lite"
OFF)
if(FULL_PROTOBUF)
if(WIN32)
set(PROTOBUF_LIBS protobuf::libprotobuf)
else()
set(PROTOBUF_LIBS ${PROTOBUF_LIBRARIES})
endif()
else()
if(WIN32)
set(PROTOBUF_LIBS protobuf::libprotobuf-lite)
else()
set(PROTOBUF_LIBS ${PROTOBUF_LITE_LIBRARIES})
endif()
endif()
if(SELINUX_FOUND)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWITH_SELINUX")
else()
set(SELINUX_INCLUDE_DIR "")
set(SELINUX_LIBRARIES "")
endif()
if(UTEMPTER_FOUND)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWITH_UTEMPTER")
else()
set(UTEMPTER_INCLUDE_DIR "")
set(UTEMPTER_LIBRARIES "")
endif()
protobuf_generate_cpp(ET_SRCS ET_HDRS proto/ET.proto)
set_source_files_properties(${ET_SRCS} ${ET_HDRS} PROPERTIES GENERATED TRUE)
protobuf_generate_cpp(ETERMINAL_SRCS ETERMINAL_HDRS proto/ETerminal.proto)
set_source_files_properties(${ETERMINAL_SRCS} ${ETERMINAL_HDRS}
PROPERTIES GENERATED TRUE)
add_custom_target(generated-code DEPENDS ${ET_SRCS} ${ET_HDRS}
${ETERMINAL_SRCS} ${ETERMINAL_HDRS})
if(ANDROID)
set(CORE_LIBRARIES platform_folders OpenSSL::SSL ZLIB::ZLIB util)
elseif(FREEBSD)
set(CORE_LIBRARIES platform_folders OpenSSL::SSL ZLIB::ZLIB util execinfo)
elseif(NETBSD)
set(CORE_LIBRARIES platform_folders OpenSSL::SSL ZLIB::ZLIB util resolv
execinfo)
elseif(WIN32)
set(CORE_LIBRARIES platform_folders OpenSSL::SSL ZLIB::ZLIB Ws2_32 Shlwapi
dbghelp)
elseif(APPLE)
set(CORE_LIBRARIES platform_folders OpenSSL::SSL ZLIB::ZLIB util resolv)
else()
set(CORE_LIBRARIES platform_folders OpenSSL::SSL ZLIB::ZLIB unwind::unwind
util resolv atomic stdc++fs)
endif()
macro(DECORATE_TARGET TARGET_NAME)
add_sanitizers(${TARGET_NAME})
set_target_properties(${TARGET_NAME} PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT
"src/base/Headers.hpp")
if(CMAKE_CROSSCOMPILING)
# Doesn't work when cross-compiling
else()
cotire(${TARGET_NAME})
endif()
endmacro()
include_directories(
external_imported/easyloggingpp/src
external_imported/ThreadPool
external_imported/PlatformFolders
external_imported/Catch2/single_include
external_imported/cxxopts/include
external_imported/msgpack-c/include
external_imported/sentry-native/include
external_imported/json/single_include/nlohmann
external_imported/sole
external_imported/base64
external_imported/simpleini
external_imported/cpp-httplib
src/base
src/terminal
src/terminal/forwarding
src/htm
${PROTOBUF_INCLUDE_DIRS}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CURSES_INCLUDE_DIR}
${sodium_INCLUDE_DIR}
${SELINUX_INCLUDE_DIR}
${UTEMPTER_INCLUDE_DIR}
${OPENSSL_INCLUDE_DIR})
if(NOT ANDROID)
include_directories(external_imported/UniversalStacktrace/ust)
endif()
add_library(
et-lib STATIC
external_imported/easyloggingpp/src/easylogging++.h
external_imported/easyloggingpp/src/easylogging++.cc
src/base/BackedReader.hpp
src/base/BackedReader.cpp
src/base/BackedWriter.hpp
src/base/BackedWriter.cpp
src/base/ClientConnection.hpp
src/base/ClientConnection.cpp
src/base/Connection.hpp
src/base/Connection.cpp
src/base/CryptoHandler.hpp
src/base/CryptoHandler.cpp
src/base/ServerClientConnection.hpp
src/base/ServerClientConnection.cpp
src/base/ServerConnection.hpp
src/base/ServerConnection.cpp
src/base/SocketHandler.hpp
src/base/SocketHandler.cpp
src/base/PipeSocketHandler.hpp
src/base/PipeSocketHandler.cpp
src/base/TcpSocketHandler.hpp
src/base/TcpSocketHandler.cpp
src/base/UnixSocketHandler.hpp
src/base/UnixSocketHandler.cpp
src/base/LogHandler.hpp
src/base/LogHandler.cpp
src/base/DaemonCreator.hpp
src/base/DaemonCreator.cpp
src/base/RawSocketUtils.hpp
src/base/RawSocketUtils.cpp
src/base/WinsockContext.hpp
src/base/SubprocessToString.hpp
src/base/SubprocessToString.cpp
${ET_SRCS})
add_dependencies(et-lib generated-code)
decorate_target(et-lib)
add_library(
TerminalCommon STATIC
src/terminal/forwarding/PortForwardHandler.hpp
src/terminal/forwarding/PortForwardHandler.cpp
src/terminal/forwarding/ForwardSourceHandler.hpp
src/terminal/forwarding/ForwardSourceHandler.cpp
src/terminal/forwarding/ForwardDestinationHandler.hpp
src/terminal/forwarding/ForwardDestinationHandler.cpp
src/terminal/TerminalServer.hpp
src/terminal/TerminalServer.cpp
src/terminal/UserTerminalRouter.hpp
src/terminal/UserTerminalRouter.cpp
src/terminal/TerminalClient.hpp
src/terminal/TerminalClient.cpp
src/terminal/SshSetupHandler.hpp
src/terminal/SshSetupHandler.cpp
src/terminal/UserTerminalHandler.hpp
src/terminal/UserTerminalHandler.cpp
src/terminal/UserJumphostHandler.hpp
src/terminal/UserJumphostHandler.cpp
src/terminal/TelemetryService.hpp
src/terminal/TelemetryService.cpp
${ETERMINAL_SRCS}
${ETERMINAL_HDRS})
add_dependencies(TerminalCommon generated-code)
decorate_target(TerminalCommon)
add_executable(et src/terminal/TerminalClientMain.cpp)
target_link_libraries(
et
LINK_PUBLIC
TerminalCommon
et-lib
${CMAKE_THREAD_LIBS_INIT}
${PROTOBUF_LIBS}
${sodium_LIBRARY_RELEASE}
${UTEMPTER_LIBRARIES}
sentry::sentry
${CORE_LIBRARIES})
decorate_target(et)
if(WIN32)
install(
TARGETS et
DESTINATION "bin"
COMPONENT client)
set(CPACK_COMPONENTS_ALL client)
set(CPACK_COMPONENT_CLIENT_DISPLAY_NAME "Eternal Terminal Client")
else(WIN32)
add_executable(etserver src/terminal/TerminalServerMain.cpp)
target_link_libraries(
etserver
LINK_PUBLIC
TerminalCommon
et-lib
${CMAKE_THREAD_LIBS_INIT}
${PROTOBUF_LIBS}
${sodium_LIBRARY_RELEASE}
${SELINUX_LIBRARIES}
${UTEMPTER_LIBRARIES}
sentry::sentry
${CORE_LIBRARIES})
decorate_target(etserver)
add_executable(etterminal src/terminal/TerminalMain.cpp)
target_link_libraries(
etterminal
LINK_PUBLIC
TerminalCommon
et-lib
${CMAKE_THREAD_LIBS_INIT}
${PROTOBUF_LIBS}
${sodium_LIBRARY_RELEASE}
${SELINUX_LIBRARIES}
${UTEMPTER_LIBRARIES}
sentry::sentry
${CORE_LIBRARIES})
decorate_target(etterminal)
add_library(
HtmCommon STATIC
src/htm/TerminalHandler.cpp
src/htm/MultiplexerState.cpp
src/htm/IpcPairClient.cpp
src/htm/IpcPairEndpoint.cpp
src/htm/IpcPairServer.cpp
src/htm/HtmClient.cpp
src/htm/HtmServer.cpp)
add_dependencies(HtmCommon generated-code)
decorate_target(HtmCommon)
add_executable(htm src/htm/HtmClientMain.cpp)
target_link_libraries(
htm
LINK_PUBLIC
HtmCommon
et-lib
${CMAKE_THREAD_LIBS_INIT}
${PROTOBUF_LIBS}
${sodium_LIBRARY_RELEASE}
${SELINUX_LIBRARIES}
${UTEMPTER_LIBRARIES}
sentry::sentry
${CORE_LIBRARIES})
decorate_target(htm)
add_executable(htmd src/htm/HtmServerMain.cpp)
target_link_libraries(
htmd
LINK_PUBLIC
HtmCommon
et-lib
${CMAKE_THREAD_LIBS_INIT}
${PROTOBUF_LIBS}
${sodium_LIBRARY_RELEASE}
${SELINUX_LIBRARIES}
${UTEMPTER_LIBRARIES}
sentry::sentry
${CORE_LIBRARIES})
decorate_target(htmd)
enable_testing()
file(GLOB TEST_SRCS test/*Test.cpp)
add_executable(et-test ${TEST_SRCS} test/Main.cpp)
add_dependencies(et-test TerminalCommon et-lib)
target_link_libraries(
et-test
TerminalCommon
et-lib
${CMAKE_THREAD_LIBS_INIT}
${PROTOBUF_LIBS}
${sodium_LIBRARY_RELEASE}
${SELINUX_LIBRARIES}
${UTEMPTER_LIBRARIES}
sentry::sentry
${CORE_LIBRARIES})
add_test(et-test et-test)
decorate_target(et-test)
install(
TARGETS etserver etterminal et htm htmd
PERMISSIONS
OWNER_EXECUTE
OWNER_WRITE
OWNER_READ
GROUP_EXECUTE
GROUP_READ
WORLD_EXECUTE
WORLD_READ
DESTINATION "bin")
endif()
set(CPACK_PACKAGE_NAME "Eternal Terminal")
set(CPACK_PACKAGE_VENDOR "https://github.com/MisterTea/EternalTerminal")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
"Remote terminal for the busy and impatient")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
set(CPACK_PACKAGE_INSTALL_DIRECTORY "EternalTerminal")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
# This must always be last!
include(CPack)