-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathCMakeLists.txt
163 lines (140 loc) · 8.02 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
cmake_minimum_required(VERSION 3.16.5) # For support C++17 standard.
project(ProtocolAnalyzer CXX)
# Select CPP standard.
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Select output binary paths.
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# Info about a compiler.
message("[info] Compiler is '${CMAKE_CXX_COMPILER_ID}'.")
# Select Analyzer Framework Module paths to source and include files.
set(FRAMEWORK_INCLUDES_PATH ${PROJECT_SOURCE_DIR}/include/framework)
set(FRAMEWORK_SOURCES_PATH ${PROJECT_SOURCE_DIR}/src/framework)
# Select Analyzer Scanner Module paths to source and include files.
set(SCANNER_INCLUDES_PATH ${PROJECT_SOURCE_DIR}/include/scanner)
set(SCANNER_SOURCES_PATH ${PROJECT_SOURCE_DIR}/src/scanner)
# Select path to tests sources.
set(TESTS ${PROJECT_SOURCE_DIR}/test)
set(DISABLE_WARNINGS "-Wno-unknown-pragmas -Wno-unused-parameter -Wno-zero-as-null-pointer-constant -Wno-deprecated-declarations")
set(DISABLE_WARNINGS_GCC "-Wno-variadic-macros -Wno-unknown-pragmas")
set(DISABLE_WARNINGS_CLANG "-Wno-return-std-move-in-c++11 -Wno-c++98-compat -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-documentation")
set(DISABLE_WARNINGS_INTEL "-diag-disable=161,1478")
set(DISABLE_WARNINGS_DEBUG "-Wno-unused-result -Wno-unused-variable")
set(DISABLE_WARNINGS_DEBUG_CLANG "-Wno-unused-macros -Wno-padded -Wno-weak-vtables -Wno-cast-align")
set(ADDITIONAL_FLAGS "-fsanitize=address -fsanitize=leak -fsanitize=undefined")
#set(ADDITIONAL_FLAGS "-fsanitize=thread")
#set(ADDITIONAL_FLAGS "-fsanitize=dataflow")
#set(ADDITIONAL_FLAGS "-fsanitize=memory -fno-omit-frame-pointer")
# Choose compile flags.
set(CMAKE_CXX_FLAGS_DEBUG "-std=c++17 -O0 -g -DDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-std=c++17 -O2 -g -DRELEASE -DNDEBUG")
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -static-libstdc++ -static-libgcc -Wall -Wextra -Wpedantic ${DISABLE_WARNINGS} ${DISABLE_WARNINGS_GCC} ${DISABLE_WARNINGS_DEBUG}")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${DISABLE_WARNINGS} ${DISABLE_WARNINGS_GCC}")
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fstandalone-debug -Weverything -Wthread-safety ${ADDITIONAL_FLAGS} ${DISABLE_WARNINGS} ${DISABLE_WARNINGS_CLANG} ${DISABLE_WARNINGS_DEBUG} ${DISABLE_WARNINGS_DEBUG_CLANG}")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${DISABLE_WARNINGS} ${DISABLE_WARNINGS_CLANG}")
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -w3 -Wall -Wcheck ${DISABLE_WARNINGS_INTEL}")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -xSSE4.2 -axAVX,CORE-AVX2 ${DISABLE_WARNINGS_INTEL}")
else()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
endif()
# Output compile flags.
if (${CMAKE_BUILD_TYPE} MATCHES "Release")
message("[info] Compiler flags: ${CMAKE_CXX_FLAGS_RELEASE}.")
else()
message("[info] Compiler flags: ${CMAKE_CXX_FLAGS_DEBUG}.")
endif()
# Select Analyzer Framework source files.
file(GLOB FSOURCES ${FRAMEWORK_SOURCES_PATH}/*.cpp
${FRAMEWORK_SOURCES_PATH}/common/*.cpp
${FRAMEWORK_SOURCES_PATH}/network/*.cpp)
# Select Analyzer Framework include files.
file(GLOB FHEADERS ${FRAMEWORK_SOURCES_PATH}/*.hpp
${FRAMEWORK_SOURCES_PATH}/common/*.hpp
${FRAMEWORK_SOURCES_PATH}/network/*.hpp)
# Ignore several source files.
list(FILTER FSOURCES EXCLUDE REGEX ".*BinaryDataEngineIterator.cpp$")
list(FILTER FSOURCES EXCLUDE REGEX ".*Task.cpp$")
list(FILTER FSOURCES EXCLUDE REGEX ".*TaskManager.cpp$")
list(FILTER FHEADERS EXCLUDE REGEX ".*BinaryDataEngineIterator.hpp$")
list(FILTER FHEADERS EXCLUDE REGEX ".*Task.hpp$")
# Build Analyzer Framework library.
add_library(AnalyzerFramework STATIC ${FSOURCES} ${FHEADERS})
# Link external libraries.
target_link_libraries(AnalyzerFramework pthread ssl crypto)
# Add include path of the Analyzer Framework library.
include_directories(${FRAMEWORK_INCLUDES_PATH})
# Select Analyzer Scanner source files.
file(GLOB SSOURCES ${SCANNER_SOURCES_PATH}/*.cpp)
# Select Analyzer Scanner include files.
file(GLOB SHEADERS ${SCANNER_INCLUDES_PATH}/*.hpp)
# Build Analyzer Scanner Executable.
add_executable(NetProtoFuzz ${SSOURCES} ${SHEADERS})
# Link Analyzer Framework library.
target_link_libraries(NetProtoFuzz AnalyzerFramework)
if (DEFINED ENV{WITH_TESTS})
# Build test suites for Analyzer Framework library.
set(SSL_TEST ${TESTS}/test_ssl.cpp)
set(SOCKET_TEST ${TESTS}/test_socket.cpp)
set(NETLINK_TEST ${TESTS}/test_netlink.cpp)
set(COMMON_TEST ${TESTS}/test_common.cpp)
set(BINARY_DATA_ENGINE_TEST ${TESTS}/test_binary_data_engine.cpp)
set(INTEGER_VALUE_TEST ${TESTS}/test_integer_value.cpp)
set(BINARY_STRUCTURED_DATA_ENGINE_TEST ${TESTS}/test_binary_structured_data_engine.cpp)
set(TIMING_TEST ${TESTS}/test_timing.cpp)
set(LOGGING_TEST ${TESTS}/test_logging.cpp)
set(ANYTHING_TEST ${TESTS}/test_anything.cpp)
set(CALLBACKS_TEST ${TESTS}/test_callbacks.cpp)
set(URI_PARSER_TEST ${TESTS}/test_uri_parser.cpp)
set(NOTIFICATION_TEST ${TESTS}/test_notification.cpp)
set(HTTP2_NEGOTIATION_TEST ${TESTS}/test_http2_negotiation.cpp)
add_executable(test_ssl ${SSL_TEST})
add_executable(test_socket ${SOCKET_TEST})
add_executable(test_netlink ${NETLINK_TEST})
add_executable(test_common ${COMMON_TEST})
add_executable(test_timing ${TIMING_TEST})
add_executable(test_binary_data_engine ${BINARY_DATA_ENGINE_TEST})
add_executable(test_integer_value ${INTEGER_VALUE_TEST})
add_executable(test_binary_structured_data_engine ${BINARY_STRUCTURED_DATA_ENGINE_TEST})
add_executable(test_logging ${LOGGING_TEST})
add_executable(test_anything ${ANYTHING_TEST})
add_executable(test_callbacks ${CALLBACKS_TEST})
add_executable(test_uri_parser ${URI_PARSER_TEST})
add_executable(test_notification ${NOTIFICATION_TEST})
add_executable(test_http2_negotiation ${HTTP2_NEGOTIATION_TEST})
set_target_properties(
test_ssl
test_socket
test_netlink
test_common
test_timing
test_binary_data_engine
test_integer_value
test_binary_structured_data_engine
test_logging
test_anything
test_callbacks
test_uri_parser
test_notification
test_http2_negotiation
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}/test_binaries
)
target_link_libraries(test_ssl AnalyzerFramework)
target_link_libraries(test_socket AnalyzerFramework)
target_link_libraries(test_netlink AnalyzerFramework)
target_link_libraries(test_common AnalyzerFramework)
target_link_libraries(test_binary_data_engine AnalyzerFramework)
target_link_libraries(test_integer_value AnalyzerFramework)
target_link_libraries(test_binary_structured_data_engine AnalyzerFramework)
target_link_libraries(test_timing AnalyzerFramework)
target_link_libraries(test_anything AnalyzerFramework)
target_link_libraries(test_logging AnalyzerFramework)
target_link_libraries(test_callbacks AnalyzerFramework)
target_link_libraries(test_uri_parser AnalyzerFramework)
target_link_libraries(test_notification AnalyzerFramework)
target_link_libraries(test_http2_negotiation AnalyzerFramework)
endif()