• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_kotlin_kmp.cpp
164  src/idl_gen_go.cpp
165  src/idl_gen_java.cpp
166  src/idl_gen_ts.cpp
167  src/idl_gen_php.cpp
168  src/idl_gen_python.cpp
169  src/idl_gen_lobster.cpp
170  src/idl_gen_rust.cpp
171  src/idl_gen_fbs.cpp
172  src/idl_gen_grpc.cpp
173  src/idl_gen_json_schema.cpp
174  src/idl_gen_swift.cpp
175  src/file_name_saving_file_manager.cpp
176  src/file_binary_writer.cpp
177  src/file_writer.cpp
178  src/idl_namer.h
179  src/namer.h
180  src/flatc.cpp
181  src/flatc_main.cpp
182  src/bfbs_gen.h
183  src/bfbs_gen_lua.h
184  src/bfbs_gen_nim.h
185  src/bfbs_namer.h
186  include/codegen/idl_namer.h
187  include/codegen/namer.h
188  include/codegen/python.h
189  include/codegen/python.cc
190  include/flatbuffers/code_generators.h
191  src/binary_annotator.h
192  src/binary_annotator.cpp
193  src/annotated_binary_text_gen.h
194  src/annotated_binary_text_gen.cpp
195  src/bfbs_gen_lua.cpp
196  src/bfbs_gen_nim.cpp
197  src/code_generators.cpp
198  grpc/src/compiler/schema_interface.h
199  grpc/src/compiler/cpp_generator.h
200  grpc/src/compiler/cpp_generator.cc
201  grpc/src/compiler/go_generator.h
202  grpc/src/compiler/go_generator.cc
203  grpc/src/compiler/java_generator.h
204  grpc/src/compiler/java_generator.cc
205  grpc/src/compiler/python_generator.h
206  grpc/src/compiler/python_generator.cc
207  grpc/src/compiler/swift_generator.h
208  grpc/src/compiler/swift_generator.cc
209  grpc/src/compiler/ts_generator.h
210  grpc/src/compiler/ts_generator.cc
211)
212
213set(FlatHash_SRCS
214  include/flatbuffers/hash.h
215  src/flathash.cpp
216)
217
218set(FlatBuffers_Tests_SRCS
219  ${FlatBuffers_Library_SRCS}
220  src/idl_gen_fbs.cpp
221  tests/evolution_test.cpp
222  tests/flexbuffers_test.cpp
223  tests/fuzz_test.cpp
224  tests/json_test.cpp
225  tests/key_field_test.cpp
226  tests/monster_test.cpp
227  tests/optional_scalars_test.cpp
228  tests/parser_test.cpp
229  tests/proto_test.cpp
230  tests/reflection_test.cpp
231  tests/test.cpp
232  tests/test_assert.h
233  tests/test_assert.cpp
234  tests/test_builder.h
235  tests/test_builder.cpp
236  tests/util_test.cpp
237  tests/native_type_test_impl.h
238  tests/native_type_test_impl.cpp
239  tests/alignment_test.h
240  tests/alignment_test.cpp
241  tests/64bit/offset64_test.h
242  tests/64bit/offset64_test.cpp
243  include/flatbuffers/code_generators.h
244  src/code_generators.cpp
245)
246
247set(FlatBuffers_Tests_CPP17_SRCS
248  ${FlatBuffers_Library_SRCS}
249  tests/test_assert.h
250  tests/test_assert.cpp
251  tests/cpp17/test_cpp17.cpp
252)
253
254set(FlatBuffers_Sample_Binary_SRCS
255  samples/sample_binary.cpp
256)
257
258set(FlatBuffers_Sample_Text_SRCS
259  ${FlatBuffers_Library_SRCS}
260  samples/sample_text.cpp
261)
262
263set(FlatBuffers_Sample_BFBS_SRCS
264  ${FlatBuffers_Library_SRCS}
265  samples/sample_bfbs.cpp
266)
267
268set(FlatBuffers_GRPCTest_SRCS
269  include/flatbuffers/flatbuffers.h
270  include/flatbuffers/grpc.h
271  include/flatbuffers/util.h
272  src/util.cpp
273  tests/monster_test.grpc.fb.h
274  tests/test_assert.h
275  tests/test_builder.h
276  tests/monster_test.grpc.fb.cc
277  tests/test_assert.cpp
278  tests/test_builder.cpp
279  grpc/tests/grpctest.cpp
280  grpc/tests/message_builder_test.cpp
281)
282
283# TODO(dbaileychess): Figure out how this would now work. I posted a question on
284# https://stackoverflow.com/questions/71772330/override-target-compile-options-via-cmake-command-line.
285# Append FLATBUFFERS_CXX_FLAGS to CMAKE_CXX_FLAGS.
286if(DEFINED FLATBUFFERS_CXX_FLAGS)
287  message(STATUS "extend CXX_FLAGS with ${FLATBUFFERS_CXX_FLAGS}")
288  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLATBUFFERS_CXX_FLAGS}")
289endif()
290message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
291
292function(add_fsanitize_to_target _target _sanitizer)
293  if(WIN32)
294    target_compile_definitions(${_target} PRIVATE FLATBUFFERS_MEMORY_LEAK_TRACKING)
295    message(STATUS "Sanitizer MSVC::_CrtDumpMemoryLeaks added to ${_target}")
296  else()
297    # FLATBUFFERS_CODE_SANITIZE: boolean {ON,OFF,YES,NO} or string with list of sanitizer.
298    # List of sanitizer is string starts with '=': "=address,undefined,thread,memory".
299    if(IS_CLANG OR (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.9))
300      set(_sanitizer_flags "=address,undefined")
301      if(_sanitizer MATCHES "=.*")
302        # override default by user-defined sanitizer list
303        set(_sanitizer_flags ${_sanitizer})
304      endif()
305      target_compile_options(${_target} PRIVATE
306        -g -fsigned-char -fno-omit-frame-pointer
307        "-fsanitize${_sanitizer_flags}")
308      target_link_libraries(${_target} PRIVATE
309        "-fsanitize${_sanitizer_flags}")
310      set_target_properties(${_target} PROPERTIES POSITION_INDEPENDENT_CODE ON)
311      message(STATUS "Sanitizer ${_sanitizer_flags} added to ${_target}")
312    endif()
313  endif()
314endfunction()
315
316function(add_pch_to_target _target _pch_header)
317  # the command is available since cmake 3.16
318  if(COMMAND target_precompile_headers)
319    target_precompile_headers(${_target} PRIVATE ${_pch_header})
320    if(NOT MSVC)
321      set_source_files_properties(src/util.cpp PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
322    endif()
323  endif()
324endfunction()
325
326include_directories(include)
327include_directories(grpc)
328
329# Creates an interface library that stores the configuration settings that each
330# target links too. This is a compromise between setting configuration globally
331# with add_compile_options() and the more targetted target_compile_options().
332# This way each target in this file can share settings and override them if
333# needed.
334add_library(ProjectConfig INTERFACE)
335target_compile_features(ProjectConfig
336  INTERFACE
337    cxx_std_${FLATBUFFERS_CPP_STD}
338)
339
340# Force the standard to be met.
341set(CMAKE_CXX_STANDARD_REQUIRED ON)
342
343# We shouldn't rely on any compiler-extensions to make things work.
344set(CMAKE_CXX_EXTENSIONS OFF)
345
346if(MSVC_LIKE)
347  target_compile_options(ProjectConfig
348    INTERFACE
349      /W4
350      $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
351        /WX       # Treat all compiler warnings as errors
352      >
353      /wd4512   # C4512: assignment operator could not be generated
354      /wd4316   # C4316: object allocated on the heap may not be aligned
355      /wd4456   # C4456: hides previous local declaration
356      $<$<CXX_COMPILER_ID:Clang>:
357        /D_CRT_SECURE_NO_WARNINGS
358      >
359  )
360else()
361  target_compile_options(ProjectConfig
362    INTERFACE
363      -Wall
364      $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
365        -Werror   # Treat all compiler warnings as errors
366
367        -fno-rtti # Disable runtime type information
368
369        $<$<CXX_COMPILER_ID:GNU>:
370          # False positive string overflow
371          # https://github.com/google/flatbuffers/issues/7366
372          -Wno-error=stringop-overflow
373        >
374      >
375      -pedantic
376      -Wextra
377      -Wno-unused-parameter
378      -Wold-style-cast
379      -fsigned-char
380      -Wnon-virtual-dtor
381
382      # This isn't working for some reason: $<$<CXX_COMPILER_ID:CLANG>:
383      $<$<BOOL:${IS_CLANG}>:
384        -Wnewline-eof
385        -Wno-unknown-warning-option
386        -Wmissing-declarations
387        -Wzero-as-null-pointer-constant
388        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,3.8>:
389          -Wimplicit-fallthrough
390          -Wextra-semi
391          $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
392            -Werror=unused-private-field
393          >
394        >
395      >
396
397      $<$<CXX_COMPILER_ID:GNU>:
398        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.4>:
399          -Wunused-result
400          -Wunused-parameter
401          -Werror=unused-parameter
402          -Wmissing-declarations
403        >
404        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.7>:
405          -Wzero-as-null-pointer-constant
406        >
407        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,7.0>:
408          -faligned-new
409          $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
410            -Werror=implicit-fallthrough=2
411          >
412        >
413        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,8.0>:
414          -Wextra-semi
415        >
416      >
417
418      $<$<BOOL:${FLATBUFFERS_CODE_COVERAGE}>:
419        -g
420        -fprofile-arcs
421        -ftest-coverage
422      >
423    )
424
425  if(FLATBUFFERS_CODE_COVERAGE)
426    target_link_options(ProjectConfig
427      INTERFACE
428        -fprofile-arcs
429        -ftest-coverage
430    )
431  endif()
432endif()
433
434if(FLATBUFFERS_BUILD_FLATLIB)
435  add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})
436
437  # Attach header directory for when build via add_subdirectory().
438  target_include_directories(flatbuffers
439    INTERFACE
440      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
441  )
442  target_link_libraries(flatbuffers PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
443
444  if(FLATBUFFERS_ENABLE_PCH)
445    add_pch_to_target(flatbuffers include/flatbuffers/pch/pch.h)
446  endif()
447endif()
448
449if(FLATBUFFERS_BUILD_FLATC)
450  add_executable(flatc ${FlatBuffers_Compiler_SRCS})
451  if(FLATBUFFERS_ENABLE_PCH)
452    add_pch_to_target(flatc include/flatbuffers/pch/flatc_pch.h)
453  endif()
454
455  target_link_libraries(flatc PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
456  target_compile_options(flatc
457    PRIVATE
458      $<$<AND:$<BOOL:${MSVC_LIKE}>,$<CONFIG:Release>>:
459        /MT
460      >
461  )
462
463  if(FLATBUFFERS_CODE_SANITIZE AND NOT WIN32)
464    add_fsanitize_to_target(flatc ${FLATBUFFERS_CODE_SANITIZE})
465  endif()
466  if(NOT FLATBUFFERS_FLATC_EXECUTABLE)
467    set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>)
468  endif()
469  if(FLATBUFFERS_STATIC_FLATC AND NOT MSVC)
470    target_link_libraries(flatc PRIVATE -static)
471  endif()
472endif()
473
474if(FLATBUFFERS_BUILD_FLATHASH)
475  add_executable(flathash ${FlatHash_SRCS})
476  target_link_libraries(flathash PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
477endif()
478
479if(FLATBUFFERS_BUILD_SHAREDLIB)
480  add_library(flatbuffers_shared SHARED ${FlatBuffers_Library_SRCS})
481  target_link_libraries(flatbuffers_shared PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
482  # FlatBuffers use calendar-based versioning and do not provide any ABI
483  # stability guarantees. Therefore, always use the full version as SOVERSION
484  # in order to avoid breaking reverse dependencies on upgrades.
485  set(FlatBuffers_Library_SONAME_FULL "${PROJECT_VERSION}")
486  set_target_properties(flatbuffers_shared PROPERTIES
487                        OUTPUT_NAME flatbuffers
488                        SOVERSION "${FlatBuffers_Library_SONAME_FULL}"
489                        VERSION "${FlatBuffers_Library_SONAME_FULL}")
490  if(FLATBUFFERS_ENABLE_PCH)
491    add_pch_to_target(flatbuffers_shared include/flatbuffers/pch/pch.h)
492  endif()
493endif()
494
495function(compile_schema SRC_FBS OPT OUT_GEN_FILE)
496  get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
497  string(REGEX REPLACE "\\.fbs$" "_generated.h" GEN_HEADER ${SRC_FBS})
498  add_custom_command(
499    OUTPUT ${GEN_HEADER}
500    COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}"
501      ${OPT}
502      -o "${SRC_FBS_DIR}"
503      "${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
504    DEPENDS flatc ${SRC_FBS}
505    COMMENT "flatc generation: `${SRC_FBS}` -> `${GEN_HEADER}`"
506    )
507  set(${OUT_GEN_FILE} ${GEN_HEADER} PARENT_SCOPE)
508endfunction()
509
510function(compile_schema_for_test SRC_FBS OPT)
511  compile_schema("${SRC_FBS}" "${OPT}" GEN_FILE)
512  target_sources(flattests PRIVATE ${GEN_FILE})
513endfunction()
514
515function(compile_schema_for_samples SRC_FBS OPT)
516  compile_schema("${SRC_FBS}" "${OPT}" GEN_FILE)
517  target_sources(flatsample PRIVATE ${GEN_FILE})
518endfunction()
519
520if(FLATBUFFERS_BUILD_TESTS)
521  add_executable(flattests ${FlatBuffers_Tests_SRCS})
522  target_link_libraries(flattests PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
523  target_include_directories(flattests PUBLIC
524    # Ideally everything is fully qualified from the root directories
525    ${CMAKE_CURRENT_SOURCE_DIR}
526    ${CMAKE_CURRENT_BINARY_DIR}
527    # TODO(derekbailey): update includes to fully qualify src/ and tests/
528    src
529    tests
530    ${CMAKE_CURRENT_BINARY_DIR}/tests
531  )
532
533  # Have tests load data from the source directory, not the build directory.
534  add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)
535
536  # The flattest target needs some generated files
537  SET(FLATC_OPT --cpp --gen-mutable --gen-object-api --reflect-names)
538  SET(FLATC_OPT_COMP ${FLATC_OPT};--gen-compare)
539  SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)
540
541  compile_schema_for_test(tests/alignment_test.fbs "${FLATC_OPT_COMP}")
542  compile_schema_for_test(tests/arrays_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
543  compile_schema_for_test(tests/native_inline_table_test.fbs "${FLATC_OPT_COMP}")
544  compile_schema_for_test(tests/native_type_test.fbs "${FLATC_OPT}")
545  compile_schema_for_test(tests/key_field/key_field_sample.fbs "${FLATC_OPT_COMP}")
546  compile_schema_for_test(tests/64bit/test_64bit.fbs "${FLATC_OPT_COMP};--bfbs-gen-embed")
547  compile_schema_for_test(tests/64bit/evolution/v1.fbs "${FLATC_OPT_COMP}")
548  compile_schema_for_test(tests/64bit/evolution/v2.fbs "${FLATC_OPT_COMP}")
549  compile_schema_for_test(tests/union_underlying_type_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
550
551  if(FLATBUFFERS_CODE_SANITIZE)
552    add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})
553  endif()
554
555  include_directories(${CMAKE_CURRENT_BINARY_DIR}/samples)
556
557  add_executable(flatsamplebinary ${FlatBuffers_Sample_Binary_SRCS})
558  add_executable(flatsampletext ${FlatBuffers_Sample_Text_SRCS})
559  add_executable(flatsamplebfbs ${FlatBuffers_Sample_BFBS_SRCS})
560
561  # Add a library so there is a single target that the generated samples can
562  # link too.
563  if(MSVC OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20.0")
564    add_library(flatsample INTERFACE)
565  else()
566    add_library(flatsample STATIC)
567  endif()
568
569  # Since flatsample has no sources, we have to explicitly set the linker lang.
570  set_target_properties(flatsample PROPERTIES LINKER_LANGUAGE CXX)
571
572  compile_schema_for_samples(samples/monster.fbs "${FLATC_OPT_COMP}")
573
574  target_link_libraries(flatsamplebinary PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
575  target_link_libraries(flatsampletext PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
576  target_link_libraries(flatsamplebfbs PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
577
578  if(FLATBUFFERS_BUILD_CPP17)
579    add_executable(flattests_cpp17 ${FlatBuffers_Tests_CPP17_SRCS})
580    target_link_libraries(flattests_cpp17 PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
581    target_include_directories(flattests_cpp17 PUBLIC src tests)
582    target_compile_features(flattests_cpp17 PRIVATE cxx_std_17) # requires cmake 3.8
583
584    if(FLATBUFFERS_CODE_SANITIZE)
585      add_fsanitize_to_target(flattests_cpp17 ${FLATBUFFERS_CODE_SANITIZE})
586    endif()
587  endif(FLATBUFFERS_BUILD_CPP17)
588endif()
589
590if(FLATBUFFERS_BUILD_GRPCTEST)
591  if(NOT GRPC_INSTALL_PATH)
592    message(SEND_ERROR "GRPC_INSTALL_PATH variable is not defined. See grpc/README.md")
593  endif()
594  if(NOT PROTOBUF_DOWNLOAD_PATH)
595    message(SEND_ERROR "PROTOBUF_DOWNLOAD_PATH variable is not defined. See grpc/README.md")
596  endif()
597  INCLUDE_DIRECTORIES(${GRPC_INSTALL_PATH}/include)
598  INCLUDE_DIRECTORIES(${PROTOBUF_DOWNLOAD_PATH}/src)
599  find_package(Threads REQUIRED)
600  list(APPEND CMAKE_PREFIX_PATH ${GRPC_INSTALL_PATH})
601  find_package(absl CONFIG REQUIRED)
602  find_package(protobuf CONFIG REQUIRED)
603  find_package(gRPC CONFIG REQUIRED)
604  add_executable(grpctest ${FlatBuffers_GRPCTest_SRCS})
605  target_link_libraries(grpctest
606    PRIVATE
607      $<BUILD_INTERFACE:ProjectConfig>
608      gRPC::grpc++_unsecure
609      gRPC::gpr
610      pthread
611      dl
612  )
613endif()
614
615if(FLATBUFFERS_INSTALL)
616  include(GNUInstallDirs)
617
618  install(DIRECTORY include/flatbuffers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
619
620  set(FB_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/flatbuffers")
621
622  configure_file(CMake/flatbuffers-config-version.cmake.in flatbuffers-config-version.cmake @ONLY)
623  install(
624      FILES
625        "CMake/flatbuffers-config.cmake"
626        "CMake/BuildFlatBuffers.cmake"
627        "${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-config-version.cmake"
628      DESTINATION ${FB_CMAKE_DIR}
629  )
630
631  if(FLATBUFFERS_BUILD_FLATLIB)
632    install(
633      TARGETS flatbuffers EXPORT FlatBuffersTargets
634      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
635      INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
636    )
637
638    install(EXPORT FlatBuffersTargets
639      FILE FlatBuffersTargets.cmake
640      NAMESPACE flatbuffers::
641      DESTINATION ${FB_CMAKE_DIR}
642    )
643  endif()
644
645  if(FLATBUFFERS_BUILD_FLATC)
646    install(
647      TARGETS flatc EXPORT FlatcTargets
648      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
649    )
650
651    install(
652      EXPORT FlatcTargets
653      FILE FlatcTargets.cmake
654      NAMESPACE flatbuffers::
655      DESTINATION ${FB_CMAKE_DIR}
656    )
657  endif()
658
659  if(FLATBUFFERS_BUILD_SHAREDLIB)
660    install(
661      TARGETS flatbuffers_shared EXPORT FlatBuffersSharedTargets
662      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
663      RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
664      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
665      INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
666    )
667
668    install(
669      EXPORT FlatBuffersSharedTargets
670      FILE FlatBuffersSharedTargets.cmake
671      NAMESPACE flatbuffers::
672      DESTINATION ${FB_CMAKE_DIR}
673    )
674  endif()
675
676  if(FLATBUFFERS_BUILD_SHAREDLIB OR FLATBUFFERS_BUILD_FLATLIB)
677      configure_file(CMake/flatbuffers.pc.in flatbuffers.pc @ONLY)
678      install(
679        FILES "${CMAKE_CURRENT_BINARY_DIR}/flatbuffers.pc"
680        DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
681      )
682  endif()
683endif()
684
685if(FLATBUFFERS_BUILD_TESTS)
686  enable_testing()
687
688  add_test(NAME flattests COMMAND flattests)
689  if(FLATBUFFERS_BUILD_CPP17)
690    add_test(NAME flattests_cpp17 COMMAND flattests_cpp17)
691  endif()
692  if(FLATBUFFERS_BUILD_GRPCTEST)
693    add_test(NAME grpctest COMMAND grpctest)
694  endif()
695endif()
696
697include(CMake/BuildFlatBuffers.cmake)
698
699if(UNIX)
700    # Use of CPack only supported on Linux systems.
701    if(FLATBUFFERS_PACKAGE_DEBIAN)
702        include(CMake/PackageDebian.cmake)
703        include(CPack)
704    endif()
705    if (FLATBUFFERS_PACKAGE_REDHAT)
706        include(CMake/PackageRedhat.cmake)
707        include(CPack)
708    endif()
709endif()
710
711# Include for running Google Benchmarks.
712if(FLATBUFFERS_BUILD_BENCHMARKS)
713  add_subdirectory(benchmarks)
714endif()
715
716# Add FlatBuffers::FlatBuffers interface, needed for FetchContent_Declare
717add_library(FlatBuffers INTERFACE)
718add_library(FlatBuffers::FlatBuffers ALIAS FlatBuffers)
719target_include_directories(
720  FlatBuffers
721  INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
722            $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/include>)
723