...
1# This is the legacy minimum version flatbuffers supported for a while.
2cmake_minimum_required(VERSION 3.8...3.25.2)
3
4# Attempt to read the current version of flatbuffers by looking at the latest tag.
5include(CMake/Version.cmake)
6
7project(FlatBuffers
8 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
9 LANGUAGES CXX)
10
11# generate compile_commands.json
12set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
13
14# NOTE: Code coverage only works on Linux & OSX.
15option(FLATBUFFERS_CODE_COVERAGE "Enable the code coverage build option." OFF)
16option(FLATBUFFERS_BUILD_TESTS "Enable the build of tests and samples." ON)
17option(FLATBUFFERS_INSTALL "Enable the installation of targets." ON)
18option(FLATBUFFERS_BUILD_FLATLIB "Enable the build of the flatbuffers library"
19 ON)
20option(FLATBUFFERS_BUILD_FLATC "Enable the build of the flatbuffers compiler"
21 ON)
22option(FLATBUFFERS_STATIC_FLATC "Build flatbuffers compiler with -static flag"
23 OFF)
24option(FLATBUFFERS_BUILD_FLATHASH "Enable the build of flathash" OFF)
25option(FLATBUFFERS_BUILD_BENCHMARKS "Enable the build of flatbenchmark."
26 OFF)
27option(FLATBUFFERS_BUILD_GRPCTEST "Enable the build of grpctest" OFF)
28option(FLATBUFFERS_BUILD_SHAREDLIB
29 "Enable the build of the flatbuffers shared library"
30 OFF)
31option(FLATBUFFERS_LIBCXX_WITH_CLANG "Force libc++ when using Clang" ON)
32# NOTE: Sanitizer check only works on Linux & OSX (gcc & llvm).
33option(FLATBUFFERS_CODE_SANITIZE
34 "Add '-fsanitize' flags to 'flattests' and 'flatc' targets."
35 OFF)
36option(FLATBUFFERS_PACKAGE_REDHAT
37 "Build an rpm using the 'package' target."
38 OFF)
39option(FLATBUFFERS_PACKAGE_DEBIAN
40 "Build an deb using the 'package' target."
41 OFF)
42option(FLATBUFFERS_BUILD_CPP17
43 "Enable the build of c++17 test target. \"
44 Requirements: Clang6, GCC7, MSVC2017 (_MSC_VER >= 1914) or higher."
45 OFF)
46option(FLATBUFFERS_BUILD_LEGACY
47 "Run C++ code generator with '--cpp-std c++0x' switch."
48 OFF)
49option(FLATBUFFERS_ENABLE_PCH
50 "Enable precompile headers support for 'flatbuffers' and 'flatc'. \"
51 Only work if CMake supports 'target_precompile_headers'. \"
52 This can speed up compilation time."
53 OFF)
54option(FLATBUFFERS_SKIP_MONSTER_EXTRA
55 "Skip generating monster_extra.fbs that contains non-supported numerical\"
56 types." OFF)
57option(FLATBUFFERS_STRICT_MODE
58 "Build flatbuffers with all warnings as errors (-Werror or /WX)."
59 OFF)
60
61if(NOT DEFINED FLATBUFFERS_CPP_STD)
62 set(FLATBUFFERS_CPP_STD 11)
63endif()
64
65set(MSVC_LIKE OFF)
66if(MSVC OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
67 set(MSVC_LIKE ON)
68endif()
69
70if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
71 set(IS_CLANG ON)
72else()
73 set(IS_CLANG OFF)
74endif()
75
76if(DEFINED FLATBUFFERS_COMPILATION_TIMINGS)
77 message("Recording Compilation Timings to ${FLATBUFFERS_COMPILATION_TIMINGS}")
78 file(REMOVE ${FLATBUFFERS_COMPILATION_TIMINGS})
79 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}")
80 set_property(GLOBAL PROPERTY RULE_LAUNCH_CUSTOM "time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}")
81 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}")
82endif()
83
84if(NOT FLATBUFFERS_BUILD_FLATC AND FLATBUFFERS_BUILD_TESTS)
85 message(WARNING
86 "Cannot build tests without building the compiler. Tests will be disabled.")
87 set(FLATBUFFERS_BUILD_TESTS OFF)
88endif()
89
90if(DEFINED FLATBUFFERS_MAX_PARSING_DEPTH)
91 # Override the default recursion depth limit.
92 add_definitions(-DFLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH})
93 message(STATUS "FLATBUFFERS_MAX_PARSING_DEPTH: ${FLATBUFFERS_MAX_PARSING_DEPTH}")
94endif()
95
96# Auto-detect locale-narrow 'strtod_l' and 'strtoull_l' functions.
97if(NOT DEFINED FLATBUFFERS_LOCALE_INDEPENDENT)
98 include(CheckCXXSymbolExists)
99
100 set(FLATBUFFERS_LOCALE_INDEPENDENT 0)
101 if(MSVC_LIKE)
102 check_cxx_symbol_exists(_strtof_l stdlib.h FLATBUFFERS_HAS_STRTOF_L)
103 check_cxx_symbol_exists(_strtoui64_l stdlib.h FLATBUFFERS_HAS_STRTOULL_L)
104 else()
105 check_cxx_symbol_exists(strtof_l stdlib.h FLATBUFFERS_HAS_STRTOF_L)
106 check_cxx_symbol_exists(strtoull_l stdlib.h FLATBUFFERS_HAS_STRTOULL_L)
107 endif()
108 if(FLATBUFFERS_HAS_STRTOF_L AND FLATBUFFERS_HAS_STRTOULL_L)
109 set(FLATBUFFERS_LOCALE_INDEPENDENT 1)
110 endif()
111endif()
112add_definitions(-DFLATBUFFERS_LOCALE_INDEPENDENT=$<BOOL:${FLATBUFFERS_LOCALE_INDEPENDENT}>)
113
114if(NOT WIN32)
115 check_symbol_exists(realpath "stdlib.h" HAVE_REALPATH)
116 if(NOT HAVE_REALPATH)
117 add_definitions(-DFLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION)
118 endif()
119endif()
120
121set(FlatBuffers_Library_SRCS
122 include/flatbuffers/allocator.h
123 include/flatbuffers/array.h
124 include/flatbuffers/base.h
125 include/flatbuffers/buffer.h
126 include/flatbuffers/buffer_ref.h
127 include/flatbuffers/default_allocator.h
128 include/flatbuffers/detached_buffer.h
129 include/flatbuffers/code_generator.h
130 include/flatbuffers/file_manager.h
131 include/flatbuffers/flatbuffer_builder.h
132 include/flatbuffers/flatbuffers.h
133 include/flatbuffers/flexbuffers.h
134 include/flatbuffers/flex_flat_util.h
135 include/flatbuffers/hash.h
136 include/flatbuffers/idl.h
137 include/flatbuffers/minireflect.h
138 include/flatbuffers/reflection.h
139 include/flatbuffers/reflection_generated.h
140 include/flatbuffers/registry.h
141 include/flatbuffers/stl_emulation.h
142 include/flatbuffers/string.h
143 include/flatbuffers/struct.h
144 include/flatbuffers/table.h
145 include/flatbuffers/util.h
146 include/flatbuffers/vector.h
147 include/flatbuffers/vector_downward.h
148 include/flatbuffers/verifier.h
149 src/idl_parser.cpp
150 src/idl_gen_text.cpp
151 src/reflection.cpp
152 src/util.cpp
153)
154
155set(FlatBuffers_Compiler_SRCS
156 ${FlatBuffers_Library_SRCS}
157 src/idl_gen_binary.cpp
158 src/idl_gen_text.cpp
159 src/idl_gen_cpp.cpp
160 src/idl_gen_csharp.cpp
161 src/idl_gen_dart.cpp
162 src/idl_gen_kotlin.cpp
163 src/idl_gen_go.cpp
164 src/idl_gen_java.cpp
165 src/idl_gen_ts.cpp
166 src/idl_gen_php.cpp
167 src/idl_gen_python.cpp
168 src/idl_gen_lobster.cpp
169 src/idl_gen_rust.cpp
170 src/idl_gen_fbs.cpp
171 src/idl_gen_grpc.cpp
172 src/idl_gen_json_schema.cpp
173 src/idl_gen_swift.cpp
174 src/file_name_saving_file_manager.cpp
175 src/file_binary_writer.cpp
176 src/file_writer.cpp
177 src/idl_namer.h
178 src/namer.h
179 src/flatc.cpp
180 src/flatc_main.cpp
181 src/bfbs_gen.h
182 src/bfbs_gen_lua.h
183 src/bfbs_gen_nim.h
184 src/bfbs_namer.h
185 include/flatbuffers/code_generators.h
186 src/binary_annotator.h
187 src/binary_annotator.cpp
188 src/annotated_binary_text_gen.h
189 src/annotated_binary_text_gen.cpp
190 src/bfbs_gen_lua.cpp
191 src/bfbs_gen_nim.cpp
192 src/code_generators.cpp
193 grpc/src/compiler/schema_interface.h
194 grpc/src/compiler/cpp_generator.h
195 grpc/src/compiler/cpp_generator.cc
196 grpc/src/compiler/go_generator.h
197 grpc/src/compiler/go_generator.cc
198 grpc/src/compiler/java_generator.h
199 grpc/src/compiler/java_generator.cc
200 grpc/src/compiler/python_generator.h
201 grpc/src/compiler/python_generator.cc
202 grpc/src/compiler/swift_generator.h
203 grpc/src/compiler/swift_generator.cc
204 grpc/src/compiler/ts_generator.h
205 grpc/src/compiler/ts_generator.cc
206)
207
208set(FlatHash_SRCS
209 include/flatbuffers/hash.h
210 src/flathash.cpp
211)
212
213set(FlatBuffers_Tests_SRCS
214 ${FlatBuffers_Library_SRCS}
215 src/idl_gen_fbs.cpp
216 tests/evolution_test.cpp
217 tests/flexbuffers_test.cpp
218 tests/fuzz_test.cpp
219 tests/json_test.cpp
220 tests/key_field_test.cpp
221 tests/monster_test.cpp
222 tests/optional_scalars_test.cpp
223 tests/parser_test.cpp
224 tests/proto_test.cpp
225 tests/reflection_test.cpp
226 tests/test.cpp
227 tests/test_assert.h
228 tests/test_assert.cpp
229 tests/test_builder.h
230 tests/test_builder.cpp
231 tests/util_test.cpp
232 tests/native_type_test_impl.h
233 tests/native_type_test_impl.cpp
234 tests/alignment_test.h
235 tests/alignment_test.cpp
236 tests/64bit/offset64_test.h
237 tests/64bit/offset64_test.cpp
238 include/flatbuffers/code_generators.h
239 src/code_generators.cpp
240)
241
242set(FlatBuffers_Tests_CPP17_SRCS
243 ${FlatBuffers_Library_SRCS}
244 tests/test_assert.h
245 tests/test_assert.cpp
246 tests/cpp17/test_cpp17.cpp
247)
248
249set(FlatBuffers_Sample_Binary_SRCS
250 samples/sample_binary.cpp
251)
252
253set(FlatBuffers_Sample_Text_SRCS
254 ${FlatBuffers_Library_SRCS}
255 samples/sample_text.cpp
256)
257
258set(FlatBuffers_Sample_BFBS_SRCS
259 ${FlatBuffers_Library_SRCS}
260 samples/sample_bfbs.cpp
261)
262
263set(FlatBuffers_GRPCTest_SRCS
264 include/flatbuffers/flatbuffers.h
265 include/flatbuffers/grpc.h
266 include/flatbuffers/util.h
267 src/util.cpp
268 tests/monster_test.grpc.fb.h
269 tests/test_assert.h
270 tests/test_builder.h
271 tests/monster_test.grpc.fb.cc
272 tests/test_assert.cpp
273 tests/test_builder.cpp
274 grpc/tests/grpctest.cpp
275 grpc/tests/message_builder_test.cpp
276)
277
278# TODO(dbaileychess): Figure out how this would now work. I posted a question on
279# https://stackoverflow.com/questions/71772330/override-target-compile-options-via-cmake-command-line.
280# Append FLATBUFFERS_CXX_FLAGS to CMAKE_CXX_FLAGS.
281if(DEFINED FLATBUFFERS_CXX_FLAGS)
282 message(STATUS "extend CXX_FLAGS with ${FLATBUFFERS_CXX_FLAGS}")
283 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLATBUFFERS_CXX_FLAGS}")
284endif()
285message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
286
287function(add_fsanitize_to_target _target _sanitizer)
288 if(WIN32)
289 target_compile_definitions(${_target} PRIVATE FLATBUFFERS_MEMORY_LEAK_TRACKING)
290 message(STATUS "Sanitizer MSVC::_CrtDumpMemoryLeaks added to ${_target}")
291 else()
292 # FLATBUFFERS_CODE_SANITIZE: boolean {ON,OFF,YES,NO} or string with list of sanitizer.
293 # List of sanitizer is string starts with '=': "=address,undefined,thread,memory".
294 if(IS_CLANG OR (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.9))
295 set(_sanitizer_flags "=address,undefined")
296 if(_sanitizer MATCHES "=.*")
297 # override default by user-defined sanitizer list
298 set(_sanitizer_flags ${_sanitizer})
299 endif()
300 target_compile_options(${_target} PRIVATE
301 -g -fsigned-char -fno-omit-frame-pointer
302 "-fsanitize${_sanitizer_flags}")
303 target_link_libraries(${_target} PRIVATE
304 "-fsanitize${_sanitizer_flags}")
305 set_target_properties(${_target} PROPERTIES POSITION_INDEPENDENT_CODE ON)
306 message(STATUS "Sanitizer ${_sanitizer_flags} added to ${_target}")
307 endif()
308 endif()
309endfunction()
310
311function(add_pch_to_target _target _pch_header)
312 # the command is available since cmake 3.16
313 if(COMMAND target_precompile_headers)
314 target_precompile_headers(${_target} PRIVATE ${_pch_header})
315 if(NOT MSVC)
316 set_source_files_properties(src/util.cpp PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
317 endif()
318 endif()
319endfunction()
320
321include_directories(include)
322include_directories(grpc)
323
324# Creates an interface library that stores the configuration settings that each
325# target links too. This is a compromise between setting configuration globally
326# with add_compile_options() and the more targetted target_compile_options().
327# This way each target in this file can share settings and override them if
328# needed.
329add_library(ProjectConfig INTERFACE)
330target_compile_features(ProjectConfig
331 INTERFACE
332 cxx_std_${FLATBUFFERS_CPP_STD}
333)
334
335# Force the standard to be met.
336set(CMAKE_CXX_STANDARD_REQUIRED ON)
337
338# We shouldn't rely on any compiler-extensions to make things work.
339set(CMAKE_CXX_EXTENSIONS OFF)
340
341if(MSVC_LIKE)
342 target_compile_options(ProjectConfig
343 INTERFACE
344 /W4
345 $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
346 /WX # Treat all compiler warnings as errors
347 >
348 /wd4512 # C4512: assignment operator could not be generated
349 /wd4316 # C4316: object allocated on the heap may not be aligned
350 /wd4456 # C4456: hides previous local declaration
351 $<$<CXX_COMPILER_ID:Clang>:
352 /D_CRT_SECURE_NO_WARNINGS
353 >
354 )
355else()
356 target_compile_options(ProjectConfig
357 INTERFACE
358 -Wall
359 $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
360 -Werror # Treat all compiler warnings as errors
361
362 -fno-rtti # Disable runtime type information
363
364 $<$<CXX_COMPILER_ID:GNU>:
365 # False positive string overflow
366 # https://github.com/google/flatbuffers/issues/7366
367 -Wno-error=stringop-overflow
368 >
369 >
370 -pedantic
371 -Wextra
372 -Wno-unused-parameter
373 -Wold-style-cast
374 -fsigned-char
375 -Wnon-virtual-dtor
376
377 # This isn't working for some reason: $<$<CXX_COMPILER_ID:CLANG>:
378 $<$<BOOL:${IS_CLANG}>:
379 -Wnewline-eof
380 -Wno-unknown-warning-option
381 -Wmissing-declarations
382 -Wzero-as-null-pointer-constant
383 $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,3.8>:
384 -Wimplicit-fallthrough
385 -Wextra-semi
386 $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
387 -Werror=unused-private-field
388 >
389 >
390 >
391
392 $<$<CXX_COMPILER_ID:GNU>:
393 $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.4>:
394 -Wunused-result
395 -Wunused-parameter
396 -Werror=unused-parameter
397 -Wmissing-declarations
398 >
399 $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.7>:
400 -Wzero-as-null-pointer-constant
401 >
402 $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,7.0>:
403 -faligned-new
404 $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
405 -Werror=implicit-fallthrough=2
406 >
407 >
408 $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,8.0>:
409 -Wextra-semi
410 >
411 >
412
413 $<$<BOOL:${FLATBUFFERS_CODE_COVERAGE}>:
414 -g
415 -fprofile-arcs
416 -ftest-coverage
417 >
418 )
419
420 if(FLATBUFFERS_CODE_COVERAGE)
421 target_link_options(ProjectConfig
422 INTERFACE
423 -fprofile-arcs
424 -ftest-coverage
425 )
426 endif()
427endif()
428
429if(FLATBUFFERS_BUILD_FLATLIB)
430 add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})
431
432 # Attach header directory for when build via add_subdirectory().
433 target_include_directories(flatbuffers
434 INTERFACE
435 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
436 )
437 target_link_libraries(flatbuffers PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
438
439 if(FLATBUFFERS_ENABLE_PCH)
440 add_pch_to_target(flatbuffers include/flatbuffers/pch/pch.h)
441 endif()
442endif()
443
444if(FLATBUFFERS_BUILD_FLATC)
445 add_executable(flatc ${FlatBuffers_Compiler_SRCS})
446 if(FLATBUFFERS_ENABLE_PCH)
447 add_pch_to_target(flatc include/flatbuffers/pch/flatc_pch.h)
448 endif()
449
450 target_link_libraries(flatc PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
451 target_compile_options(flatc
452 PRIVATE
453 $<$<AND:$<BOOL:${MSVC_LIKE}>,$<CONFIG:Release>>:
454 /MT
455 >
456 )
457
458 if(FLATBUFFERS_CODE_SANITIZE AND NOT WIN32)
459 add_fsanitize_to_target(flatc ${FLATBUFFERS_CODE_SANITIZE})
460 endif()
461 if(NOT FLATBUFFERS_FLATC_EXECUTABLE)
462 set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>)
463 endif()
464 if(FLATBUFFERS_STATIC_FLATC AND NOT MSVC)
465 target_link_libraries(flatc PRIVATE -static)
466 endif()
467endif()
468
469if(FLATBUFFERS_BUILD_FLATHASH)
470 add_executable(flathash ${FlatHash_SRCS})
471 target_link_libraries(flathash PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
472endif()
473
474if(FLATBUFFERS_BUILD_SHAREDLIB)
475 add_library(flatbuffers_shared SHARED ${FlatBuffers_Library_SRCS})
476 target_link_libraries(flatbuffers_shared PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
477 # FlatBuffers use calendar-based versioning and do not provide any ABI
478 # stability guarantees. Therefore, always use the full version as SOVERSION
479 # in order to avoid breaking reverse dependencies on upgrades.
480 set(FlatBuffers_Library_SONAME_FULL "${PROJECT_VERSION}")
481 set_target_properties(flatbuffers_shared PROPERTIES
482 OUTPUT_NAME flatbuffers
483 SOVERSION "${FlatBuffers_Library_SONAME_FULL}"
484 VERSION "${FlatBuffers_Library_SONAME_FULL}")
485 if(FLATBUFFERS_ENABLE_PCH)
486 add_pch_to_target(flatbuffers_shared include/flatbuffers/pch/pch.h)
487 endif()
488endif()
489
490function(compile_schema SRC_FBS OPT OUT_GEN_FILE)
491 get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
492 string(REGEX REPLACE "\\.fbs$" "_generated.h" GEN_HEADER ${SRC_FBS})
493 add_custom_command(
494 OUTPUT ${GEN_HEADER}
495 COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}"
496 ${OPT}
497 -o "${SRC_FBS_DIR}"
498 "${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
499 DEPENDS flatc
500 COMMENT "flatc generation: `${SRC_FBS}` -> `${GEN_HEADER}`"
501 )
502 set(${OUT_GEN_FILE} ${GEN_HEADER} PARENT_SCOPE)
503endfunction()
504
505function(compile_schema_for_test SRC_FBS OPT)
506 compile_schema("${SRC_FBS}" "${OPT}" GEN_FILE)
507 target_sources(flattests PRIVATE ${GEN_FILE})
508endfunction()
509
510function(compile_schema_for_samples SRC_FBS OPT)
511 compile_schema("${SRC_FBS}" "${OPT}" GEN_FILE)
512 target_sources(flatsample PRIVATE ${GEN_FILE})
513endfunction()
514
515if(FLATBUFFERS_BUILD_TESTS)
516 add_executable(flattests ${FlatBuffers_Tests_SRCS})
517 target_link_libraries(flattests PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
518 target_include_directories(flattests PUBLIC
519 # Ideally everything is fully qualified from the root directories
520 ${CMAKE_CURRENT_SOURCE_DIR}
521 ${CMAKE_CURRENT_BINARY_DIR}
522 # TODO(derekbailey): update includes to fully qualify src/ and tests/
523 src
524 tests
525 ${CMAKE_CURRENT_BINARY_DIR}/tests
526 )
527
528 # Have tests load data from the source directory, not the build directory.
529 add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)
530
531 # The flattest target needs some generated files
532 SET(FLATC_OPT --cpp --gen-mutable --gen-object-api --reflect-names)
533 SET(FLATC_OPT_COMP ${FLATC_OPT};--gen-compare)
534
535 compile_schema_for_test(tests/alignment_test.fbs "${FLATC_OPT_COMP}")
536 compile_schema_for_test(tests/arrays_test.fbs "${FLATC_OPT_COMP};--scoped-enums")
537 compile_schema_for_test(tests/native_inline_table_test.fbs "${FLATC_OPT_COMP}")
538 compile_schema_for_test(tests/native_type_test.fbs "${FLATC_OPT}")
539 compile_schema_for_test(tests/key_field/key_field_sample.fbs "${FLATC_OPT_COMP}")
540 compile_schema_for_test(tests/64bit/test_64bit.fbs "${FLATC_OPT_COMP};--bfbs-gen-embed")
541 compile_schema_for_test(tests/64bit/evolution/v1.fbs "${FLATC_OPT_COMP}")
542 compile_schema_for_test(tests/64bit/evolution/v2.fbs "${FLATC_OPT_COMP}")
543 compile_schema_for_test(tests/union_underlying_type_test.fbs "${FLATC_OPT_COMP}")
544
545 if(FLATBUFFERS_CODE_SANITIZE)
546 add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})
547 endif()
548
549 include_directories(${CMAKE_CURRENT_BINARY_DIR}/samples)
550
551 add_executable(flatsamplebinary ${FlatBuffers_Sample_Binary_SRCS})
552 add_executable(flatsampletext ${FlatBuffers_Sample_Text_SRCS})
553 add_executable(flatsamplebfbs ${FlatBuffers_Sample_BFBS_SRCS})
554
555 # Add a library so there is a single target that the generated samples can
556 # link too.
557 add_library(flatsample INTERFACE)
558
559 # Since flatsample has no sources, we have to explicitly set the linker lang.
560 set_target_properties(flatsample PROPERTIES LINKER_LANGUAGE CXX)
561
562 compile_schema_for_samples(samples/monster.fbs "${FLATC_OPT_COMP}")
563
564 target_link_libraries(flatsamplebinary PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
565 target_link_libraries(flatsampletext PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
566 target_link_libraries(flatsamplebfbs PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
567
568 if(FLATBUFFERS_BUILD_CPP17)
569 add_executable(flattests_cpp17 ${FlatBuffers_Tests_CPP17_SRCS})
570 target_link_libraries(flattests_cpp17 PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
571 target_include_directories(flattests_cpp17 PUBLIC src tests)
572 target_compile_features(flattests_cpp17 PRIVATE cxx_std_17) # requires cmake 3.8
573
574 if(FLATBUFFERS_CODE_SANITIZE)
575 add_fsanitize_to_target(flattests_cpp17 ${FLATBUFFERS_CODE_SANITIZE})
576 endif()
577 endif(FLATBUFFERS_BUILD_CPP17)
578endif()
579
580if(FLATBUFFERS_BUILD_GRPCTEST)
581 if(NOT GRPC_INSTALL_PATH)
582 message(SEND_ERROR "GRPC_INSTALL_PATH variable is not defined. See grpc/README.md")
583 endif()
584 if(NOT PROTOBUF_DOWNLOAD_PATH)
585 message(SEND_ERROR "PROTOBUF_DOWNLOAD_PATH variable is not defined. See grpc/README.md")
586 endif()
587 INCLUDE_DIRECTORIES(${GRPC_INSTALL_PATH}/include)
588 INCLUDE_DIRECTORIES(${PROTOBUF_DOWNLOAD_PATH}/src)
589 find_package(Threads REQUIRED)
590 list(APPEND CMAKE_PREFIX_PATH ${GRPC_INSTALL_PATH})
591 find_package(absl CONFIG REQUIRED)
592 find_package(protobuf CONFIG REQUIRED)
593 find_package(gRPC CONFIG REQUIRED)
594 add_executable(grpctest ${FlatBuffers_GRPCTest_SRCS})
595 target_link_libraries(grpctext
596 PRIVATE
597 $<BUILD_INTERFACE:ProjectConfig>
598 gRPC::grpc++_unsecure
599 gRPC::gpr
600 pthread
601 dl
602 )
603endif()
604
605if(FLATBUFFERS_INSTALL)
606 include(GNUInstallDirs)
607
608 install(DIRECTORY include/flatbuffers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
609
610 set(FB_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/flatbuffers")
611
612 configure_file(CMake/flatbuffers-config-version.cmake.in flatbuffers-config-version.cmake @ONLY)
613 install(
614 FILES
615 "CMake/flatbuffers-config.cmake"
616 "CMake/BuildFlatBuffers.cmake"
617 "${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-config-version.cmake"
618 DESTINATION ${FB_CMAKE_DIR}
619 )
620
621 if(FLATBUFFERS_BUILD_FLATLIB)
622 install(
623 TARGETS flatbuffers EXPORT FlatBuffersTargets
624 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
625 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
626 )
627
628 install(EXPORT FlatBuffersTargets
629 FILE FlatBuffersTargets.cmake
630 NAMESPACE flatbuffers::
631 DESTINATION ${FB_CMAKE_DIR}
632 )
633 endif()
634
635 if(FLATBUFFERS_BUILD_FLATC)
636 install(
637 TARGETS flatc EXPORT FlatcTargets
638 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
639 )
640
641 install(
642 EXPORT FlatcTargets
643 FILE FlatcTargets.cmake
644 NAMESPACE flatbuffers::
645 DESTINATION ${FB_CMAKE_DIR}
646 )
647 endif()
648
649 if(FLATBUFFERS_BUILD_SHAREDLIB)
650 install(
651 TARGETS flatbuffers_shared EXPORT FlatBuffersSharedTargets
652 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
653 RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
654 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
655 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
656 )
657
658 install(
659 EXPORT FlatBuffersSharedTargets
660 FILE FlatBuffersSharedTargets.cmake
661 NAMESPACE flatbuffers::
662 DESTINATION ${FB_CMAKE_DIR}
663 )
664 endif()
665
666 if(FLATBUFFERS_BUILD_SHAREDLIB OR FLATBUFFERS_BUILD_FLATLIB)
667 configure_file(CMake/flatbuffers.pc.in flatbuffers.pc @ONLY)
668 install(
669 FILES "${CMAKE_CURRENT_BINARY_DIR}/flatbuffers.pc"
670 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
671 )
672 endif()
673endif()
674
675if(FLATBUFFERS_BUILD_TESTS)
676 enable_testing()
677
678 add_test(NAME flattests COMMAND flattests)
679 if(FLATBUFFERS_BUILD_CPP17)
680 add_test(NAME flattests_cpp17 COMMAND flattests_cpp17)
681 endif()
682 if(FLATBUFFERS_BUILD_GRPCTEST)
683 add_test(NAME grpctest COMMAND grpctest)
684 endif()
685endif()
686
687include(CMake/BuildFlatBuffers.cmake)
688
689if(UNIX)
690 # Use of CPack only supported on Linux systems.
691 if(FLATBUFFERS_PACKAGE_DEBIAN)
692 include(CMake/PackageDebian.cmake)
693 include(CPack)
694 endif()
695 if (FLATBUFFERS_PACKAGE_REDHAT)
696 include(CMake/PackageRedhat.cmake)
697 include(CPack)
698 endif()
699endif()
700
701# Include for running Google Benchmarks.
702if(FLATBUFFERS_BUILD_BENCHMARKS)
703 add_subdirectory(benchmarks)
704endif()
705
706# Add FlatBuffers::FlatBuffers interface, needed for FetchContent_Declare
707add_library(FlatBuffers INTERFACE)
708add_library(FlatBuffers::FlatBuffers ALIAS FlatBuffers)
709target_include_directories(
710 FlatBuffers
711 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
712 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/include>)
View as plain text