-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
147 lines (123 loc) · 3.68 KB
/
CMakeLists.txt
File metadata and controls
147 lines (123 loc) · 3.68 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
cmake_minimum_required(VERSION 3.16)
project(PacketScope LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Qt options
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# Force build type to Release if not set
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
# Sanitizer options
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)
option(ENABLE_TSAN "Enable ThreadSanitizer" OFF)
if(ENABLE_ASAN AND ENABLE_TSAN)
message(FATAL_ERROR "ASAN and TSAN cannot be enabled at the same time")
endif()
# Dependencies
set(CMAKE_PREFIX_PATH "/opt/Qt/6.10.1/gcc_64")
find_package(Qt6 REQUIRED COMPONENTS Widgets)
find_package(Threads REQUIRED)
find_package(PcapPlusPlus REQUIRED)
find_package(spdlog REQUIRED)
# Sources
set(SOURCES
src/main.cpp
src/core/PacketCapture.cpp
src/core/PacketProcessor.cpp
src/core/PacketStore.cpp
src/core/PipelineController.cpp
src/ui/MainWindow.cpp
src/ui/PacketListModel.cpp
)
# Headers which are includes Q_OBJECT
set(MOC_HEADERS
include/ui/MainWindow.hpp
include/ui/PacketListModel.hpp
)
qt_wrap_cpp(MOC_SOURCES ${MOC_HEADERS})
add_executable(packet-scope
${SOURCES}
${MOC_SOURCES}
)
# Warning & optimization flags
set(COMMON_WARNINGS
-Wall
-Wextra
-Wpedantic
-Wsign-conversion
-Wimplicit-fallthrough
-Wconversion
)
set(DEBUG_FLAGS -g -O0)
set(RELEASE_FLAGS -O3)
set(DEBUG_LINK_FLAGS "")
target_compile_options(packet-scope PRIVATE
$<$<CONFIG:Debug>:${COMMON_WARNINGS} ${DEBUG_FLAGS}>
$<$<CONFIG:Release>:${RELEASE_FLAGS}>
)
# Sanitizers (append to debug flags)
if(ENABLE_ASAN)
list(APPEND DEBUG_FLAGS -fsanitize=address)
list(APPEND DEBUG_LINK_FLAGS -fsanitize=address)
endif()
if(ENABLE_TSAN)
list(APPEND DEBUG_FLAGS -fsanitize=thread)
list(APPEND DEBUG_LINK_FLAGS -fsanitize=thread)
endif()
# Apply flags
target_compile_options(packet-scope PRIVATE
$<$<CONFIG:Debug>:${COMMON_WARNINGS} ${DEBUG_FLAGS}>
$<$<CONFIG:Release>:${RELEASE_FLAGS}>
)
if(DEBUG_LINK_FLAGS)
target_link_options(packet-scope PRIVATE
$<$<CONFIG:Debug>:${DEBUG_LINK_FLAGS}>
)
endif()
# Include directories
target_include_directories(packet-scope
PRIVATE
${PROJECT_SOURCE_DIR}/include
)
# Link libraries
target_link_libraries(packet-scope
PRIVATE
Qt6::Widgets
PcapPlusPlus::Pcap++
Threads::Threads
spdlog::spdlog
)
# Doxygen Documentation
option(BUILD_DOCS "Build Doxygen documentation" OFF)
find_package(Doxygen QUIET)
if(BUILD_DOCS AND DOXYGEN_FOUND)
add_custom_target(doc_doxygen ALL
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Generating API documentation with Doxygen"
VERBATIM
)
elseif(NOT BUILD_DOCS)
message(STATUS "BUILD_DOCS is OFF.")
else()
message(STATUS "Doxygen not found. Documentation target will not be available.")
endif()
# Build summary
message(STATUS "")
message(STATUS "========= PacketScope Build Configuration =========")
message(STATUS "Build type : ${CMAKE_BUILD_TYPE}")
message(STATUS "C++ standard : C++${CMAKE_CXX_STANDARD}")
message(STATUS "Compiler : ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
message(STATUS "Docs enabled : ${BUILD_DOCS}")
message(STATUS "ASAN enabled : ${ENABLE_ASAN}")
message(STATUS "TSAN enabled : ${ENABLE_TSAN}")
if(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
message(STATUS "Debug flags : ${COMMON_WARNINGS} ${DEBUG_FLAGS}")
endif()
if(CMAKE_BUILD_TYPE STREQUAL "RELEASE")
message(STATUS "Release flags : ${RELEASE_FLAGS}")
endif()
message(STATUS "")