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