11cmake_minimum_required (VERSION 3.20 )
22project (bitchat)
33
4+ # General settings
45set (CMAKE_CXX_STANDARD 20)
56set (CMAKE_CXX_STANDARD_REQUIRED ON )
67set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
78
9+ # Testing option
10+ option (ENABLE_ASAN "Enable Address Sanitizer" OFF )
11+ option (ENABLE_TESTS "Enable Tests" OFF )
12+ option (BUILD_EXECUTABLE "Build The Main Executable" ON )
13+
14+ # UI type option
15+ set (BITCHAT_GUI "CONSOLE" CACHE STRING "UI Type: CONSOLE or DUMMY" )
16+ set_property (CACHE BITCHAT_GUI PROPERTY STRINGS "CONSOLE" "DUMMY" )
17+
18+ if (ENABLE_TESTS)
19+ enable_testing ()
20+ endif ()
21+
822# Set output directories
923set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /bin)
1024set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /lib)
@@ -13,14 +27,14 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
1327# Include CPM for dependency management
1428include (cmake/CPM.cmake )
1529
16- # Library options
17- set (BUILD_SHARED_LIBS OFF )
18- set (BUILD_STATIC_LIBS ON )
30+ # Include custom functions
31+ include (cmake/functions.cmake )
32+
33+ # Include noise-c configuration
34+ include (cmake/noise-c.cmake )
1935
20- # LZ4 options
21- set (LZ4_BUILD_CLI OFF )
22- set (LZ4_BUILD_LEGACY_LZ4C OFF )
23- set (LZ4_BUNDLED_MODE OFF )
36+ # Include lz4 configuration
37+ include (cmake/lz4.cmake )
2438
2539# Platform-specific settings
2640if (APPLE )
@@ -39,94 +53,152 @@ elseif(UNIX AND NOT APPLE)
3953endif ()
4054
4155# Add dependencies via CPM
42- CPMAddPackage (
43- NAME uuid
44- GITHUB_REPOSITORY rkg82/uuid-v4
45- GIT_TAG dd2f75c027d033586e9eb62b484748cb4bfc515d
46- )
47-
4856CPMAddPackage (
4957 NAME spdlog
5058 GITHUB_REPOSITORY gabime/spdlog
5159 VERSION 1.15.3
5260)
5361
54- CPMAddPackage (
55- NAME lz4
56- GITHUB_REPOSITORY lz4/lz4
57- VERSION 1.10.0
58- SOURCE_SUBDIR "build/cmake"
59- )
62+ CPMAddPackage ("gh:nlohmann/json@3.12.0" )
63+
64+ # Add Google Test only if tests are enabled
65+ if (ENABLE_TESTS)
66+ CPMAddPackage ( "gh:google/googletest@1.17.0" )
67+ endif ( )
6068
6169# Find OpenSSL
6270find_package (OpenSSL REQUIRED )
6371
64- # Include directories
65- include_directories (
66- ${CMAKE_CURRENT_SOURCE_DIR} /include
72+ # Common libraries
73+ set (COMMON_LIBRARIES
74+ spdlog::spdlog
75+ nlohmann_json::nlohmann_json
76+ noise-c
77+ lz4
78+ OpenSSL::SSL
79+ OpenSSL::Crypto
6780)
6881
6982# Source files
70- set (SOURCES
71- main.cpp
72- src/bitchat/protocol/packet_utils.cpp
73- src/bitchat/compression/compression_manager.cpp
74- src/bitchat/crypto/crypto_manager.cpp
75- src/bitchat/protocol/packet_serializer.cpp
76- src/bitchat/core/bitchat_manager.cpp
83+ set (COMMON_SOURCES
84+ ${CMAKE_SOURCE_DIR} /src/bitchat/core/bitchat_data.cpp
85+ ${CMAKE_SOURCE_DIR} /src/bitchat/core/bitchat_manager.cpp
86+ ${CMAKE_SOURCE_DIR} /src/bitchat/helpers/compression_helper.cpp
87+ ${CMAKE_SOURCE_DIR} /src/bitchat/helpers/datetime_helper.cpp
88+ ${CMAKE_SOURCE_DIR} /src/bitchat/helpers/noise_helper.cpp
89+ ${CMAKE_SOURCE_DIR} /src/bitchat/helpers/protocol_helper.cpp
90+ ${CMAKE_SOURCE_DIR} /src/bitchat/helpers/string_helper.cpp
91+ ${CMAKE_SOURCE_DIR} /src/bitchat/identity/identity_models.cpp
92+ ${CMAKE_SOURCE_DIR} /src/bitchat/noise/noise_hybrid_key_exchange.cpp
93+ ${CMAKE_SOURCE_DIR} /src/bitchat/noise/noise_post_quantum_key_exchange.cpp
94+ ${CMAKE_SOURCE_DIR} /src/bitchat/noise/noise_protocol.cpp
95+ ${CMAKE_SOURCE_DIR} /src/bitchat/noise/noise_protocol_migration.cpp
96+ ${CMAKE_SOURCE_DIR} /src/bitchat/noise/noise_pq_handshake_pattern.cpp
97+ ${CMAKE_SOURCE_DIR} /src/bitchat/noise/noise_security_error.cpp
98+ ${CMAKE_SOURCE_DIR} /src/bitchat/noise/noise_session_default.cpp
99+ ${CMAKE_SOURCE_DIR} /src/bitchat/protocol/message_padding.cpp
100+ ${CMAKE_SOURCE_DIR} /src/bitchat/protocol/packet_serializer.cpp
101+ ${CMAKE_SOURCE_DIR} /src/bitchat/protocol/packet.cpp
102+ ${CMAKE_SOURCE_DIR} /src/bitchat/runners/bluetooth_announce_runner.cpp
103+ ${CMAKE_SOURCE_DIR} /src/bitchat/runners/cleanup_runner.cpp
104+ ${CMAKE_SOURCE_DIR} /src/bitchat/services/crypto_service.cpp
105+ ${CMAKE_SOURCE_DIR} /src/bitchat/services/identity_service.cpp
106+ ${CMAKE_SOURCE_DIR} /src/bitchat/services/message_service.cpp
107+ ${CMAKE_SOURCE_DIR} /src/bitchat/services/network_service.cpp
108+ ${CMAKE_SOURCE_DIR} /src/bitchat/services/noise_service.cpp
109+ ${CMAKE_SOURCE_DIR} /src/bitchat/ui/dummy_ui.cpp
110+ ${CMAKE_SOURCE_DIR} /src/bitchat/ui/console_ui.cpp
77111)
78112
113+ set (SOURCES ${COMMON_SOURCES} )
114+
115+ if (BUILD_EXECUTABLE)
116+ set (SOURCES ${SOURCES} src/main.cpp)
117+ endif ()
118+
79119# Platform-specific source files
80120if (PLATFORM_APPLE)
81- set (SOURCES ${SOURCES} src/platforms/apple /bluetooth.mm src/platforms/apple /bluetooth_bridge.mm)
121+ set (SOURCES ${SOURCES}
122+ src/platforms/apple /bluetooth_factory.mm
123+ src/platforms/apple /bluetooth.mm
124+ src/platforms/apple /bluetooth_bridge.mm
125+ )
126+
82127 set_source_files_properties (src/platforms/apple/bluetooth.mm PROPERTIES COMPILE_FLAGS "-x objective-c++" )
83128 set_source_files_properties (src/platforms/apple/bluetooth_bridge.mm PROPERTIES COMPILE_FLAGS "-x objective-c++" )
129+ set_source_files_properties (src/platforms/apple/bluetooth_factory.mm PROPERTIES COMPILE_FLAGS "-x objective-c++" )
84130elseif (PLATFORM_LINUX)
85- set (SOURCES ${SOURCES} src/platforms/linux /bluetooth.cpp src/platforms/linux /bluetooth_factory.cpp)
131+ set (SOURCES ${SOURCES}
132+ src/platforms/linux /bluetooth.cpp
133+ src/platforms/linux /bluetooth_factory.cpp
134+ )
86135endif ()
87136
88- # Create executable
89- add_executable (bitchat ${SOURCES} )
137+ # Create executable only if BUILD_EXECUTABLE is enabled
138+ if (BUILD_EXECUTABLE)
139+ add_executable (bitchat ${SOURCES} )
90140
91- # Link libraries
92- target_link_libraries (bitchat
93- spdlog::spdlog
94- OpenSSL::SSL
95- OpenSSL::Crypto
96- lz4_static
97- )
141+ # Include directories
142+ target_include_directories (bitchat PRIVATE
143+ ${CMAKE_CURRENT_SOURCE_DIR} /include
144+ ${CMAKE_CURRENT_SOURCE_DIR} /vendor
145+ )
146+
147+ # Add UI macro
148+ target_compile_definitions (bitchat PRIVATE BITCHAT_GUI_${BITCHAT_GUI} )
149+
150+ # Link libraries
151+ target_link_libraries (bitchat ${COMMON_LIBRARIES} )
152+ endif ()
98153
99154# Platform-specific linking
100- if (PLATFORM_APPLE)
101- target_link_libraries (bitchat
102- ${FRAMEWORK_COREBLUETOOTH}
103- ${FRAMEWORK_FOUNDATION}
104- ${FRAMEWORK_IOKIT}
105- ${FRAMEWORK_COREFOUNDATION}
106- )
107- elseif (PLATFORM_LINUX)
108- target_link_libraries (bitchat ${BLUEZ_LIBRARIES} )
109- target_include_directories (bitchat PRIVATE ${BLUEZ_INCLUDE_DIRS} )
155+ if (BUILD_EXECUTABLE)
156+ if (PLATFORM_APPLE)
157+ target_link_libraries (bitchat
158+ ${FRAMEWORK_COREBLUETOOTH}
159+ ${FRAMEWORK_FOUNDATION}
160+ ${FRAMEWORK_IOKIT}
161+ ${FRAMEWORK_COREFOUNDATION}
162+ )
163+ elseif (PLATFORM_LINUX)
164+ target_link_libraries (bitchat ${BLUEZ_LIBRARIES} )
165+ target_include_directories (bitchat PRIVATE ${BLUEZ_INCLUDE_DIRS} )
166+ endif ()
167+ endif ()
168+
169+ # Apply compiler flags to main executable
170+ if (BUILD_EXECUTABLE)
171+ apply_compiler_flags (bitchat )
172+
173+ # AddressSanitizer option
174+ if (ENABLE_ASAN)
175+ message (STATUS "Building with AddressSanitizer enabled" )
176+ set (ASAN_FLAGS -fsanitize=address -fno-omit-frame-pointer)
177+ target_compile_options (bitchat PRIVATE ${ASAN_FLAGS} )
178+ target_link_options (bitchat PRIVATE -fsanitize=address )
179+ endif ()
110180endif ()
111181
112- # Compiler-specific flags
113- if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
114- target_compile_options (bitchat PRIVATE -Wall -Wextra -Wpedantic )
115- elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
116- target_compile_options (bitchat PRIVATE -Wall -Wextra -Wpedantic )
117- elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
118- target_compile_options (bitchat PRIVATE /W4 )
182+ if (ENABLE_TESTS)
183+ add_subdirectory (tests )
119184endif ()
120185
121186# Install target
122- install (TARGETS bitchat
123- RUNTIME DESTINATION bin
124- LIBRARY DESTINATION lib
125- ARCHIVE DESTINATION lib
126- )
187+ if (BUILD_EXECUTABLE)
188+ install (TARGETS bitchat
189+ RUNTIME DESTINATION bin
190+ LIBRARY DESTINATION lib
191+ ARCHIVE DESTINATION lib
192+ )
193+ endif ()
127194
128195# Print configuration info
129196message (STATUS "Platform: ${CMAKE_SYSTEM_NAME} " )
130197message (STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} " )
131198message (STATUS "C++ Standard: ${CMAKE_CXX_STANDARD} " )
132199message (STATUS "Build Type: ${CMAKE_BUILD_TYPE} " )
200+ message (STATUS "Testing enabled: ${ENABLE_TESTS} " )
201+ message (STATUS "Building executable: ${BUILD_EXECUTABLE} " )
202+
203+ # CPack configuration
204+ include (cmake/cpack.cmake )
0 commit comments