-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
254 lines (209 loc) · 6.55 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
cmake_minimum_required(VERSION 3.14)
enable_language(CXX)
#--------------------------------------------------------------------------------------------------
# variables
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test)
set(RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/resources)
set(RESOURCE_DIR_TARGET ${CMAKE_BINARY_DIR}/resources)
set(PROJECT_NAME Reddot)
set(TEST_NAME UnitTest)
#--------------------------------------------------------------------------------------------------
# project
project(${PROJECT_NAME})
#--------------------------------------------------------------------------------------------------
# builds
# project
file(GLOB_RECURSE PROJECT_SOURCE_FILES ${SRC_DIR}/*.*)
file(GLOB_RECURSE RESOURCE_FILES ${RESOURCE_DIR}/*.*)
add_executable(${PROJECT_NAME} ${PROJECT_SOURCE_FILES} ${RESOURCE_FILES})
if (MSVC)
# enable VS-Solution filters support
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(ALL_FILES ${PROJECT_SOURCE_FILES} ${RESOURCE_FILES})
# group files by filters for the Visual Studio
foreach(FILE ${ALL_FILES})
if(FILE IN_LIST PROJECT_SOURCE_FILES)
set(RELATIVE_DIR ${SRC_DIR})
set(SOURCE_GROUP "Source Files")
elseif(FILE IN_LIST RESOURCE_FILES)
set(RELATIVE_DIR ${RESOURCE_DIR})
set(SOURCE_GROUP "Resource Files")
endif()
file(RELATIVE_PATH REL_FILE ${RELATIVE_DIR} ${FILE})
get_filename_component(FOLDER ${REL_FILE} PATH)
string(REPLACE "/" "\\" GROUP "${FOLDER}")
if("${FILE}" MATCHES ".*\\.cpp")
source_group("${SOURCE_GROUP}\\${GROUP}" FILES "${FILE}")
elseif("${FILE}" MATCHES ".*\\.html")
source_group("${SOURCE_GROUP}\\${GROUP}" FILES "${FILE}")
elseif("${FILE}" MATCHES ".*\\.h")
source_group("Header Files\\${GROUP}" FILES "${FILE}")
elseif("${FILE}" MATCHES ".*\\.*")
source_group("${SOURCE_GROUP}\\${GROUP}" FILES "${FILE}")
endif()
endforeach()
endif(MSVC)
# resources
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${RESOURCE_DIR}
$<TARGET_FILE_DIR:${PROJECT_NAME}>/resources
COMMENT "Copying resources to build directory"
)
# tests
file(GLOB_RECURSE TEST_SOURCE_FILES ${TEST_DIR}/*.*)
add_executable(${TEST_NAME} ${TEST_SOURCE_FILES})
if (MSVC)
# enable VS-Solution filters support
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# group files by filters for the Visual Studio
foreach(FILE ${TEST_SOURCE_FILES})
file(RELATIVE_PATH REL_FILE ${TEST_DIR} ${FILE})
get_filename_component(FOLDER ${REL_FILE} PATH)
string(REPLACE "/" "\\" GROUP "${FOLDER}")
if ("${FILE}" MATCHES ".*\\.cpp")
source_group("Source Files\\${GROUP}" FILES "${FILE}")
elseif("${FILE}" MATCHES ".*\\.html")
source_group("Resource Files\\${GROUP}" FILES "${FILE}")
elseif("${FILE}" MATCHES ".*\\.h")
source_group("Header Files\\${GROUP}" FILES "${FILE}")
else()
source_group("Resource Files\\${GROUP}" FILES "${FILE}")
endif()
endforeach()
endif (MSVC)
# properties
set_target_properties(${PROJECT_NAME} ${TEST_NAME}
PROPERTIES
CXX_STANDARD 23
CXX_STANDARD_REQUIRED ON
)
#--------------------------------------------------------------------------------------------------
# gtest
#
find_package(GTest REQUIRED)
# add src to the include directories for the test target
target_include_directories(${TEST_NAME}
PRIVATE
${SRC_DIR}
${GTEST_INCLUDE_DIRS}
${GTEST_LIBRARY}
${GTEST_INCLUDE_DIR}
${GTEST_MAIN_LIBRARY}
)
# link test target against gtest libraries
target_link_libraries(${TEST_NAME}
PRIVATE
GTest::gtest
GTest::gtest_main
#GTest::gmock
#GTest::gmock_main
)
# libs
SET(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS program_options)
find_package(OpenSSL REQUIRED)
if (MSVC)
find_package(unofficial-libmysql REQUIRED)
find_package(Poco REQUIRED COMPONENTS Foundation Net NetSSL Crypto Data DataMySQL)
set(LIBS_DIRS
${BOOST_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIR}
${POCO_INCLUDE_DIRS}
)
set(LIBS_LINK
${BOOST_LIBRARIES}
Boost::boost
Boost::program_options
unofficial::libmysql::libmysql
OpenSSL::SSL
OpenSSL::Crypto
Poco::Foundation
Poco::Net
Poco::NetSSL
Poco::Crypto
Poco::Data
Poco::DataMySQL
)
else ()
find_package(Poco REQUIRED COMPONENTS Foundation Net NetSSL Crypto Data)
find_library(MYSQL_LIBRARY
NAMES mysqlclient libmysqlclient
)
find_path(MYSQL_INCLUDE_DIR
NAMES mysql.h
PATH_SUFFIXES mysql
)
find_library(POCO_DATAMYSQL_LIBRARY
NAMES PocoDataMySQL libPocoDataMySQL
)
if (NOT MYSQL_LIBRARY)
message(FATAL_ERROR "Can't find MySQL lib")
endif ()
if (NOT MYSQL_INCLUDE_DIR)
message(FATAL_ERROR "Can't find MySQL headers")
endif ()
if (NOT POCO_DATAMYSQL_LIBRARY)
message(FATAL_ERROR "Can't find PocoDataMySQL lib")
endif ()
set(LIBS_DIRS
${BOOST_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIR}
${POCO_INCLUDE_DIRS}
${MYSQL_INCLUDE_DIR}
)
set(LIBS_LINK
${BOOST_LIBRARIES}
Boost::boost
Boost::program_options
Poco::Foundation
Poco::Net
Poco::NetSSL
Poco::Crypto
Poco::Data
${MYSQL_LIBRARY}
${POCO_DATAMYSQL_LIBRARY}
)
endif (MSVC)
target_include_directories(${PROJECT_NAME} PRIVATE ${LIBS_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBS_LINK})
target_include_directories(${TEST_NAME} PRIVATE ${LIBS_DIRS})
target_link_libraries(${TEST_NAME} PRIVATE ${LIBS_LINK})
#--------------------------------------------------------------------------------------------------
# compiler settings
if (MSVC)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
add_compile_options("/std:c++latest")
target_compile_options(${PROJECT_NAME} PRIVATE
/W4
)
target_compile_options(${TEST_NAME} PRIVATE
/W4
)
else ()
target_compile_options(${PROJECT_NAME} PRIVATE
-std=c++23 -Wall -Wextra -pedantic -Werror -Wno-pessimizing-move
)
target_compile_options(${TEST_NAME} PRIVATE
-std=c++23 -Wall -Wextra -pedantic -Werror -Wno-pessimizing-move
)
endif (MSVC)
#--------------------------------------------------------------------------------------------------
# deb pkg
if (UNIX)
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
set(CPACK_GENERATOR DEB)
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_CONTACT 155024765+ProphetRu@users.noreply.github.com)
include(CPack)
endif (UNIX)
#--------------------------------------------------------------------------------------------------
# testing
enable_testing()
include(GoogleTest)
gtest_discover_tests(${TEST_NAME})