forked from MahletNigusse/write-after-read-protocol
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
484 lines (432 loc) · 13.4 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
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
# Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# We want release-1.8.0.zip in order to build these unit tests.
# If you have already downloaded it,
# invoke cmake with -DWITH_GMOCK=/path/to/release-1.8.0.zip
# or -DWITH_GMOCK=/path/to
#
# Alternatively, set an environment variable
# export WITH_GMOCK=/path/to/release-1.8.0.zip
#
# You can also do cmake -DENABLE_DOWNLOADS=1
# and we will download it from https://github.com/google/googletest/archive/
#
# Either way: we will unpack the zip, compile gmock-all.cc and gtest-all.cc
# and link them into the executables.
# Default location for where to download and build gmock/gtest.
IF(NOT DOWNLOAD_ROOT)
SET(DOWNLOAD_ROOT ${CMAKE_SOURCE_DIR}/source_downloads)
ENDIF()
# We want googletest version 1.8, which also contains googlemock.
SET(GMOCK_PACKAGE_NAME "release-1.8.0")
IF (DEFINED ENV{WITH_GMOCK} AND NOT DEFINED WITH_GMOCK)
FILE(TO_CMAKE_PATH "$ENV{WITH_GMOCK}" WITH_GMOCK)
ENDIF()
IF(LOCAL_GMOCK_ZIP
AND NOT ${LOCAL_GMOCK_ZIP} MATCHES ".*${GMOCK_PACKAGE_NAME}\\.zip")
SET(LOCAL_GMOCK_ZIP 0)
ENDIF()
IF (WITH_GMOCK)
## Did we get a full path name, including file name?
IF (${WITH_GMOCK} MATCHES ".*\\.zip")
GET_FILENAME_COMPONENT(GMOCK_DIR ${WITH_GMOCK} PATH)
GET_FILENAME_COMPONENT(GMOCK_ZIP ${WITH_GMOCK} NAME)
FIND_FILE(LOCAL_GMOCK_ZIP
NAMES ${GMOCK_ZIP}
PATHS ${GMOCK_DIR}
NO_DEFAULT_PATH
)
ELSE()
## Did we get a path name to the directory of the .zip file?
## Check for both release-x.y.z.zip and googletest-release-x.y.z.zip
FIND_FILE(LOCAL_GMOCK_ZIP
NAMES "${GMOCK_PACKAGE_NAME}.zip" "googletest-${GMOCK_PACKAGE_NAME}.zip"
PATHS ${WITH_GMOCK}
NO_DEFAULT_PATH
)
## If WITH_GMOCK is a directory, use it for download.
SET(DOWNLOAD_ROOT ${WITH_GMOCK})
ENDIF()
MESSAGE(STATUS "Local gmock zip ${LOCAL_GMOCK_ZIP}")
ENDIF()
IF(NOT EXISTS DOWNLOAD_ROOT)
MAKE_DIRECTORY(${DOWNLOAD_ROOT})
ENDIF()
SET(GMOCK_SOURCE_DIR ${DOWNLOAD_ROOT}/googletest-${GMOCK_PACKAGE_NAME}/googlemock)
SET(GTEST_SOURCE_DIR ${DOWNLOAD_ROOT}/googletest-${GMOCK_PACKAGE_NAME}/googletest)
# We may have downloaded gmock/gtest already, building in a different directory.
IF(EXISTS ${GMOCK_SOURCE_DIR} OR EXISTS ${LOCAL_GMOCK_ZIP})
MESSAGE(STATUS "GMOCK_SOURCE_DIR:${GMOCK_SOURCE_DIR}")
SET(GMOCK_DOWNLOADED 1 CACHE INTERNAL "")
SET(GMOCK_FOUND 1 CACHE INTERNAL "")
# If source dir does not exist, reset dependent variables (might be set from before).
ELSE()
SET(LOCAL_GMOCK_ZIP 0 CACHE INTERNAL "")
SET(GMOCK_DOWNLOADED 0 CACHE INTERNAL "")
SET(GMOCK_FOUND 0 CACHE INTERNAL "")
SET(GMOCK_INCLUDE_DIRS 0 CACHE INTERNAL "")
ENDIF()
IF(LOCAL_GMOCK_ZIP AND NOT EXISTS ${GMOCK_SOURCE_DIR})
# Unpack tarball
EXECUTE_PROCESS(
COMMAND ${CMAKE_COMMAND} -E tar xfz "${LOCAL_GMOCK_ZIP}"
WORKING_DIRECTORY "${DOWNLOAD_ROOT}"
RESULT_VARIABLE tar_result
)
IF (tar_result MATCHES 0)
SET(GMOCK_FOUND 1 CACHE INTERNAL "")
ENDIF()
ENDIF()
OPTION(ENABLE_DOWNLOADS
"Download and build 3rd party source code components, e.g. googletest"
OFF)
# While experimenting, use local URL rather than google.
SET(GMOCK_TARBALL "googletest-${GMOCK_PACKAGE_NAME}.zip")
SET(GMOCK_DOWNLOAD_URL
"https://github.com/google/googletest/archive/${GMOCK_PACKAGE_NAME}.zip"
)
MACRO(HTTP_PROXY_HINT)
MESSAGE(STATUS
"If you are inside a firewall, you may need to use an https proxy: "
"export https_proxy=http://example.com:80")
ENDMACRO()
IF(NOT GMOCK_FOUND)
IF(NOT ENABLE_DOWNLOADS)
# Give warning
MESSAGE(STATUS
"Googletest was not found. gtest-based unit tests will be disabled. "
"You can run cmake . -DENABLE_DOWNLOADS=1 to automatically download "
"and build required components from source.")
HTTP_PROXY_HINT()
RETURN()
ENDIF()
# Download googletest source
IF(NOT EXISTS ${GMOCK_SOURCE_DIR})
IF(NOT EXISTS ${DOWNLOAD_ROOT}/${GMOCK_TARBALL})
# Download the tarball
# Use CMake builtin download capabilities
FILE(DOWNLOAD ${GMOCK_DOWNLOAD_URL}
${DOWNLOAD_ROOT}/${GMOCK_TARBALL} TIMEOUT 30 STATUS ERR)
IF(ERR EQUAL 0)
SET(DOWNLOAD_SUCCEEDED 1)
ELSE()
MESSAGE(STATUS "Download failed, error: ${ERR}")
# A failed DOWNLOAD leaves an empty file, remove it
FILE(REMOVE ${DOWNLOAD_ROOT}/${GMOCK_TARBALL})
ENDIF()
IF (DOWNLOAD_SUCCEEDED)
MESSAGE(STATUS
"Successfully downloaded ${GMOCK_DOWNLOAD_URL} to ${DOWNLOAD_ROOT}")
ELSE()
MESSAGE(STATUS
"To enable googletest, please download ${GMOCK_DOWNLOAD_URL} "
"to the directory ${DOWNLOAD_ROOT}")
HTTP_PROXY_HINT()
RETURN()
ENDIF()
ENDIF()
# Unpack tarball
EXECUTE_PROCESS(
COMMAND ${CMAKE_COMMAND} -E tar xfz "${DOWNLOAD_ROOT}/${GMOCK_TARBALL}"
WORKING_DIRECTORY "${DOWNLOAD_ROOT}"
)
ENDIF()
IF(EXISTS ${GMOCK_SOURCE_DIR})
SET(GMOCK_DOWNLOADED 1 CACHE INTERNAL "")
SET(GMOCK_FOUND 1 CACHE INTERNAL "")
ENDIF()
ENDIF()
IF(NOT GMOCK_FOUND)
RETURN()
ENDIF()
SET(GMOCK_INCLUDE_DIRS
${GMOCK_SOURCE_DIR}
${GMOCK_SOURCE_DIR}/include
${GTEST_SOURCE_DIR}
${GTEST_SOURCE_DIR}/include
CACHE INTERNAL "")
# Build gmock/gtest libraries.
INCLUDE_DIRECTORIES(SYSTEM
${GMOCK_SOURCE_DIR}
${GMOCK_SOURCE_DIR}/include
${GTEST_SOURCE_DIR}
${GTEST_SOURCE_DIR}/include
)
# Some tests require Boost.
INCLUDE_DIRECTORIES(SYSTEM ${BOOST_PATCHES_DIR} ${BOOST_INCLUDE_DIR})
MY_CHECK_CXX_COMPILER_FLAG("-fno-builtin-memcmp" HAVE_NO_BUILTIN_MEMCMP)
ADD_LIBRARY(gmock STATIC ${GMOCK_SOURCE_DIR}/src/gmock-all.cc)
ADD_LIBRARY(gtest STATIC ${GTEST_SOURCE_DIR}/src/gtest-all.cc)
SET(GTEST_LIBRARIES gmock gtest)
IF (WITH_SSL STREQUAL "bundled")
ADD_SUBDIRECTORY(yassl)
ENDIF()
INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/libbinlogevents/include
${ZLIB_INCLUDE_DIR}
${CMAKE_SOURCE_DIR}/regex
${CMAKE_SOURCE_DIR}/sql
${CMAKE_SOURCE_DIR}/sql/auth
${CMAKE_SOURCE_DIR}/storage/example
)
# main-wrapper libraries (with tap-compatible option).
ADD_LIBRARY(gunit_small STATIC
fake_costmodel.cc
gunit_test_main.cc
skip_trailing.cc
strnxfrm.cc
tap_event_listener.cc
thread_utils.cc
fake_table.cc
)
ADD_LIBRARY(gunit_large STATIC
gunit_test_main_server.cc
tap_event_listener.cc
test_utils.cc
thread_utils.cc
)
ADD_DEPENDENCIES(gunit_small GenError)
ADD_DEPENDENCIES(gunit_large GenError)
TARGET_LINK_LIBRARIES(gunit_small
mysys mysys_ssl mytap dbug strings ${GTEST_LIBRARIES})
TARGET_LINK_LIBRARIES(gunit_large
mysys mysys_ssl mytap dbug strings ${GTEST_LIBRARIES})
MESSAGE(STATUS "GTEST_LIBRARIES:${GTEST_LIBRARIES}")
# Add some defines.
ADD_DEFINITIONS(-DMYSQL_SERVER -DHAVE_REPLICATION -DEXTRA_CODE_FOR_UNIT_TESTING)
ADD_DEFINITIONS(-DERRMSG_DIR="${PROJECT_BINARY_DIR}/sql/share")
ADD_DEFINITIONS(-DDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}")
INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/compile_flags.cmake)
# Add tests (link them with gunit/gmock libraries)
SET(TESTS
alignment
bounded_queue
bounds_checked_array
bitmap
byteorder
calloc
cost_estimate
dbug
decimal
dynarray
filesort_buffer
filesort_compare
inplace_vector
key
like_range
mdl
my_bitmap
my_error
my_fileutils
my_murmur3
my_qsort_vs_stdsort
my_regex
my_snprintf
my_thread
mysys_base64
mysys_lf
mysys_my_atomic
mysys_my_b_vprintf
mysys_my_freopen
mysys_my_loadpath
mysys_my_malloc
mysys_my_pwrite
mysys_my_rdtsc
mysys_my_symlink
mysys_my_vsnprintf
mysys_my_write
nullable
opt_recperkey
partitioned_rwlock
prealloced_array
priority_queue
sql_list
sql_plist
sql_string
stl_alloc
strings_skip_trailing
strings_strnxfrm
strtoll
thread_utils
my_timer
timespec
my_alloc
pump_object_filter
)
IF (UNIX)
LIST(APPEND TESTS path auth_utils)
ENDIF()
IF(WIN32)
LIST(APPEND TESTS win_tests)
ENDIF()
# Add tests (link them with gunit/gmock libraries and the server libraries)
SET(SERVER_TESTS
copy_info
create_field
debug_sync
explain_filename
field
get_diagnostics
gis_algos
handler
insert_delayed
item
item_filter
item_func_case
item_func_now_local
item_timefunc
item_like
join_tab_sort
json_binary
json_dom
json_path
locking_service
log_throttle
make_sortkey
mdl_sync
my_decimal
opt_costmodel
opt_costconstants
opt_guessrecperkey
opt_range
opt_ref
opt_trace
select_lex_visitor
segfault
sql_table
strings_utf8
table_cache
tc_log_mmap
thd_manager
unique
security_context
initialize_password
)
## Merging tests into fewer executables saves *a lot* of
## link time and disk space ...
OPTION(MERGE_UNITTESTS "Merge tests into one executable" ON)
IF (MERGE_UNITTESTS)
SET(MERGE_LARGE_TESTS ${CMAKE_CURRENT_BINARY_DIR}/merge_large_tests.cc)
SET(MERGE_SMALL_TESTS ${CMAKE_CURRENT_BINARY_DIR}/merge_small_tests.cc)
SET_SOURCE_FILES_PROPERTIES(MERGE_SMALL_TESTS MERGE_LARGE_TESTS
PROPERTIES GENERATED 1)
## BOOST_HEAP_ASSERT generates if () ; else ;
IF(HAVE_EMPTY_BODY)
ADD_COMPILE_FLAGS(
${MERGE_SMALL_TESTS}
COMPILE_FLAGS "-Wno-empty-body"
)
ENDIF()
# Fixes "C1128: number of sections exceeded object file format limit" in MSVC
IF(WIN32)
ADD_COMPILE_FLAGS(
${MERGE_LARGE_TESTS}
COMPILE_FLAGS "/bigobj")
ENDIF()
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
FILE(WRITE ${MERGE_LARGE_TESTS} "// Merging large unit tests\n")
FILE(WRITE ${MERGE_SMALL_TESTS} "// Merging small unit tests\n")
FOREACH(test ${TESTS})
FILE(APPEND ${MERGE_SMALL_TESTS} "#include \"${test}-t.cc\"\n")
ENDFOREACH()
FOREACH(test ${SERVER_TESTS})
FILE(APPEND ${MERGE_LARGE_TESTS} "#include \"${test}-t.cc\"\n")
ENDFOREACH()
ADD_EXECUTABLE(merge_small_tests-t ${MERGE_SMALL_TESTS})
SET(SRC_FILES ${MERGE_LARGE_TESTS})
IF(WIN32)
LIST(APPEND SRC_FILES ../../sql/nt_servc.cc)
ENDIF()
LIST(APPEND SRC_FILES ../../storage/example/ha_example.cc)
ADD_COMPILE_FLAGS(
../../storage/example/ha_example.cc
COMPILE_FLAGS "-DDISABLE_DTRACE"
)
ADD_EXECUTABLE(merge_large_tests-t ${SRC_FILES})
TARGET_LINK_LIBRARIES(merge_small_tests-t
gunit_small sqlgunitlib strings dbug regex)
TARGET_LINK_LIBRARIES(merge_large_tests-t sql binlog rpl master slave sql)
TARGET_LINK_LIBRARIES(merge_large_tests-t
gunit_large strings dbug regex mysys)
TARGET_LINK_LIBRARIES(merge_large_tests-t sql binlog rpl master slave sql)
IF(WITH_PERFSCHEMA_STORAGE_ENGINE)
TARGET_LINK_LIBRARIES(merge_large_tests-t perfschema)
TARGET_LINK_LIBRARIES(merge_small_tests-t perfschema pfs_server_stubs)
ENDIF()
ADD_TEST(merge_large_tests merge_large_tests-t)
ADD_TEST(merge_small_tests merge_small_tests-t)
ENDIF(MERGE_UNITTESTS)
FOREACH(test ${TESTS})
ADD_EXECUTABLE(${test}-t ${test}-t.cc)
TARGET_LINK_LIBRARIES(${test}-t gunit_small sqlgunitlib strings dbug regex)
IF(WITH_PERFSCHEMA_STORAGE_ENGINE)
TARGET_LINK_LIBRARIES(${test}-t perfschema pfs_server_stubs)
ENDIF()
IF(MERGE_UNITTESTS)
SET_PROPERTY(TARGET ${test}-t PROPERTY EXCLUDE_FROM_ALL TRUE)
IF(WIN32)
SET_PROPERTY(TARGET ${test}-t PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
ENDIF()
ELSE()
ADD_TEST(${test} ${test}-t)
ENDIF()
ENDFOREACH()
# See comments about __builtin_memcmp in the source file.
IF(HAVE_NO_BUILTIN_MEMCMP)
ADD_COMPILE_FLAGS(
filesort_compare-t.cc
COMPILE_FLAGS "-fno-builtin-memcmp"
)
ENDIF()
## BOOST_HEAP_ASSERT generates if () ; else ;
IF(HAVE_EMPTY_BODY)
ADD_COMPILE_FLAGS(
bounded_queue-t.cc
COMPILE_FLAGS "-Wno-empty-body"
)
ENDIF()
FOREACH(test ${SERVER_TESTS})
SET(SRC_FILES ${test}-t.cc)
IF(WIN32)
LIST(APPEND SRC_FILES ../../sql/nt_servc.cc)
ENDIF()
IF(test MATCHES "table_cache")
LIST(APPEND SRC_FILES ../../storage/example/ha_example.cc)
ADD_COMPILE_FLAGS(
../../storage/example/ha_example.cc
COMPILE_FLAGS "-DDISABLE_DTRACE"
)
ENDIF()
ADD_EXECUTABLE(${test}-t ${SRC_FILES})
TARGET_LINK_LIBRARIES(${test}-t sql binlog rpl master slave sql)
TARGET_LINK_LIBRARIES(${test}-t gunit_large strings dbug regex mysys)
TARGET_LINK_LIBRARIES(${test}-t sql binlog rpl master slave sql)
IF(WITH_PERFSCHEMA_STORAGE_ENGINE)
TARGET_LINK_LIBRARIES(${test}-t perfschema)
ENDIF()
IF(MERGE_UNITTESTS)
SET_PROPERTY(TARGET ${test}-t PROPERTY EXCLUDE_FROM_ALL TRUE)
IF(WIN32)
SET_PROPERTY(TARGET ${test}-t PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
ENDIF()
ELSE()
ADD_TEST(${test} ${test}-t)
ENDIF()
ENDFOREACH()
## Most executables depend on libeay32.dll (through mysys_ssl).
COPY_OPENSSL_DLLS(copy_openssl_gunit)
ADD_SUBDIRECTORY(innodb)
ADD_SUBDIRECTORY(keyring)