blob: 119855a95e6db394a279b27e086ffb25fd23da7b [file] [log] [blame]
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -08001cmake_minimum_required(VERSION 2.8)
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +07002# generate compile_commands.json
3set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
Vladimir Glavnyy5f32f942018-11-17 00:24:06 +07004include(CheckCXXSymbolExists)
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -08005
6project(FlatBuffers)
7
8# NOTE: Code coverage only works on Linux & OSX.
9option(FLATBUFFERS_CODE_COVERAGE "Enable the code coverage build option." OFF)
Stewart Miles3f851832014-09-10 16:01:13 -070010option(FLATBUFFERS_BUILD_TESTS "Enable the build of tests and samples." ON)
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +080011option(FLATBUFFERS_INSTALL "Enable the installation of targets." ON)
Wouter van Oortmerssen3101e322016-07-01 18:08:51 -070012option(FLATBUFFERS_BUILD_FLATLIB "Enable the build of the flatbuffers library"
13 ON)
14option(FLATBUFFERS_BUILD_FLATC "Enable the build of the flatbuffers compiler"
15 ON)
Alex Amesd5753212015-02-13 15:58:29 -080016option(FLATBUFFERS_BUILD_FLATHASH "Enable the build of flathash" ON)
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -070017option(FLATBUFFERS_BUILD_GRPCTEST "Enable the build of grpctest" OFF)
changneta15659e2016-09-07 01:12:04 +080018option(FLATBUFFERS_BUILD_SHAREDLIB
19 "Enable the build of the flatbuffers shared library"
20 OFF)
Kamil Rojewski6bfa1072018-07-19 18:40:28 +020021option(FLATBUFFERS_LIBCXX_WITH_CLANG "Force libc++ when using Clang" ON)
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +070022# NOTE: Sanitizer check only works on Linux & OSX (gcc & llvm).
Kamil Rojewski30c49482018-12-06 20:12:06 +010023option(FLATBUFFERS_CODE_SANITIZE
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +070024 "Add '-fsanitize' flags to 'flattests' and 'flatc' targets."
25 OFF)
Marc Butler4567b132019-02-22 06:06:04 +110026option(FLATBUFFERS_PACKAGE_REDHAT
27 "Build an rpm using the 'package' target."
28 OFF)
29option(FLATBUFFERS_PACKAGE_DEBIAN
30 "Build an deb using the 'package' target."
31 OFF)
Wouter van Oortmerssen9bf9b182019-02-25 11:42:37 -080032
Leander Bessa Beernaert3ec8d7f2015-01-02 13:51:31 +010033if(NOT FLATBUFFERS_BUILD_FLATC AND FLATBUFFERS_BUILD_TESTS)
34 message(WARNING
35 "Cannot build tests without building the compiler. Tests will be disabled.")
36 set(FLATBUFFERS_BUILD_TESTS OFF)
37endif()
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -080038
Vladimir Glavnyy925c1d72018-10-04 23:27:37 +070039if(DEFINED FLATBUFFERS_MAX_PARSING_DEPTH)
40 # Override the default recursion depth limit.
41 add_definitions(-DFLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH})
42 message(STATUS "FLATBUFFERS_MAX_PARSING_DEPTH: ${FLATBUFFERS_MAX_PARSING_DEPTH}")
43endif()
44
Vladimir Glavnyy5f32f942018-11-17 00:24:06 +070045# Auto-detect locale-narrow 'strtod_l' function.
46if(NOT DEFINED FLATBUFFERS_LOCALE_INDEPENDENT)
47 if(MSVC)
48 check_cxx_symbol_exists(_strtof_l stdlib.h FLATBUFFERS_LOCALE_INDEPENDENT)
49 else()
50 check_cxx_symbol_exists(strtof_l stdlib.h FLATBUFFERS_LOCALE_INDEPENDENT)
51 endif()
52endif()
53add_definitions(-DFLATBUFFERS_LOCALE_INDEPENDENT=$<BOOL:${FLATBUFFERS_LOCALE_INDEPENDENT}>)
54
Martell Malone79d3cb62015-07-22 13:18:59 +010055set(FlatBuffers_Library_SRCS
Lakedaemon8a64afa2016-04-13 23:21:18 +020056 include/flatbuffers/code_generators.h
Wouter van Oortmerssen88a85ff2017-06-15 20:54:04 -070057 include/flatbuffers/base.h
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -080058 include/flatbuffers/flatbuffers.h
Alex Amesd5753212015-02-13 15:58:29 -080059 include/flatbuffers/hash.h
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -080060 include/flatbuffers/idl.h
61 include/flatbuffers/util.h
Wouter van Oortmerssen81312c22015-05-21 16:33:29 -070062 include/flatbuffers/reflection.h
63 include/flatbuffers/reflection_generated.h
Stewart Milesa8923222017-07-13 06:27:39 -070064 include/flatbuffers/stl_emulation.h
Wouter van Oortmerssenaac6be12016-02-01 18:00:30 -080065 include/flatbuffers/flexbuffers.h
Wouter van Oortmerssen88a85ff2017-06-15 20:54:04 -070066 include/flatbuffers/registry.h
Wouter van Oortmerssen72a99ab2017-08-24 17:44:03 -070067 include/flatbuffers/minireflect.h
Wouter van Oortmerssen7b94eab2017-01-13 17:44:42 -080068 src/code_generators.cpp
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -080069 src/idl_parser.cpp
Martell Malone79d3cb62015-07-22 13:18:59 +010070 src/idl_gen_text.cpp
Wouter van Oortmerssen71012242015-07-31 13:55:53 -070071 src/reflection.cpp
Wouter van Oortmerssene98b1912016-03-30 17:34:52 -070072 src/util.cpp
Martell Malone79d3cb62015-07-22 13:18:59 +010073)
74
75set(FlatBuffers_Compiler_SRCS
76 ${FlatBuffers_Library_SRCS}
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -080077 src/idl_gen_cpp.cpp
Dan Field88912642018-05-18 14:06:15 -040078 src/idl_gen_dart.cpp
Wouter van Oortmerssen557c88c2014-09-16 17:37:17 -070079 src/idl_gen_general.cpp
rw74d5f372014-07-11 16:12:35 -070080 src/idl_gen_go.cpp
Kamil Rojewski30c49482018-12-06 20:12:06 +010081 src/idl_gen_js_ts.cpp
Shuhei Taunma5ce86822015-11-05 16:19:28 +090082 src/idl_gen_php.cpp
rw48dfc692014-12-16 00:32:11 -080083 src/idl_gen_python.cpp
aardappel48988092018-07-23 19:03:11 -070084 src/idl_gen_lobster.cpp
Derek Baileyba5eb3b2018-07-05 15:55:57 -070085 src/idl_gen_lua.cpp
Robert3c54fd92018-09-02 17:05:50 -070086 src/idl_gen_rust.cpp
Wouter van Oortmerssend38b9af2014-09-26 16:46:30 -070087 src/idl_gen_fbs.cpp
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -070088 src/idl_gen_grpc.cpp
schoetbif2020412017-07-10 17:05:59 +020089 src/idl_gen_json_schema.cpp
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -080090 src/flatc.cpp
Wouter van Oortmerssenb3953592017-01-25 13:41:34 -080091 src/flatc_main.cpp
Harsh Vardhan2e7806e2016-08-19 10:41:11 +053092 grpc/src/compiler/schema_interface.h
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -070093 grpc/src/compiler/cpp_generator.h
94 grpc/src/compiler/cpp_generator.cc
Ronak Jaina31ddd22016-12-06 02:50:38 +053095 grpc/src/compiler/go_generator.h
96 grpc/src/compiler/go_generator.cc
Yuri Finkelstein8518b3f2017-12-21 07:55:57 -100097 grpc/src/compiler/java_generator.h
98 grpc/src/compiler/java_generator.cc
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -080099)
100
Alex Amesd5753212015-02-13 15:58:29 -0800101set(FlatHash_SRCS
102 include/flatbuffers/hash.h
103 src/flathash.cpp
104)
105
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800106set(FlatBuffers_Tests_SRCS
Wouter van Oortmerssen71012242015-07-31 13:55:53 -0700107 ${FlatBuffers_Library_SRCS}
Wouter van Oortmerssend38b9af2014-09-26 16:46:30 -0700108 src/idl_gen_fbs.cpp
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800109 tests/test.cpp
Sumant Tambe49fed8c2018-09-24 12:03:31 -0700110 tests/test_assert.h
111 tests/test_assert.cpp
112 tests/test_builder.h
113 tests/test_builder.cpp
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800114 # file generate by running compiler on tests/monster_test.fbs
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800115 ${CMAKE_CURRENT_BINARY_DIR}/tests/monster_test_generated.h
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800116)
117
118set(FlatBuffers_Sample_Binary_SRCS
119 include/flatbuffers/flatbuffers.h
120 samples/sample_binary.cpp
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800121 # file generated by running compiler on samples/monster.fbs
122 ${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800123)
124
125set(FlatBuffers_Sample_Text_SRCS
Wouter van Oortmerssen7b94eab2017-01-13 17:44:42 -0800126 ${FlatBuffers_Library_SRCS}
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800127 samples/sample_text.cpp
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800128 # file generated by running compiler on samples/monster.fbs
129 ${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800130)
131
tira-misudba962e2018-12-13 20:59:27 +0100132set(FlatBuffers_Sample_BFBS_SRCS
133 ${FlatBuffers_Library_SRCS}
134 src/idl_gen_general.cpp
135 samples/sample_bfbs.cpp
136 # file generated by running compiler on samples/monster.fbs
137 ${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
138)
139
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700140set(FlatBuffers_GRPCTest_SRCS
141 include/flatbuffers/flatbuffers.h
142 include/flatbuffers/grpc.h
143 tests/monster_test.grpc.fb.h
Sumant Tambe49fed8c2018-09-24 12:03:31 -0700144 tests/test_assert.h
145 tests/test_builder.h
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700146 tests/monster_test.grpc.fb.cc
Sumant Tambe49fed8c2018-09-24 12:03:31 -0700147 tests/test_assert.cpp
148 tests/test_builder.cpp
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700149 grpc/tests/grpctest.cpp
Sumant Tambee7578542018-08-30 16:43:22 -0700150 grpc/tests/message_builder_test.cpp
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700151 # file generated by running compiler on samples/monster.fbs
152 ${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
153)
154
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800155# source_group(Compiler FILES ${FlatBuffers_Compiler_SRCS})
156# source_group(Tests FILES ${FlatBuffers_Tests_SRCS})
157
Andrew Hundt520d6842016-10-05 16:20:30 -0400158if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
Wouter van Oortmerssen606098c2016-10-17 13:06:11 -0700159 # do not apply any global settings if the toolchain
Andrew Hundt520d6842016-10-05 16:20:30 -0400160 # is being configured externally
Vladimir Glavnyy7d3930a2019-01-29 01:16:12 +0700161 message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}.")
Andrew Hundt520d6842016-10-05 16:20:30 -0400162elseif(APPLE)
Jason Sanmiya30c07f42016-07-22 19:04:23 -0700163 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
Per Grön9aeeddf2017-05-12 18:48:17 +0200164 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Wno-unused-parameter")
Frank Benkstein20396a12018-10-16 00:11:31 +0200165 set(FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wold-style-cast")
Wouter van Oortmerssen932b22f2015-05-27 16:57:21 -0700166elseif(CMAKE_COMPILER_IS_GNUCXX)
Tony Kelman4c160382016-04-01 21:42:23 -0700167 if(CYGWIN)
168 set(CMAKE_CXX_FLAGS
169 "${CMAKE_CXX_FLAGS} -std=gnu++11")
170 else(CYGWIN)
171 set(CMAKE_CXX_FLAGS
172 "${CMAKE_CXX_FLAGS} -std=c++0x")
173 endif(CYGWIN)
Wouter van Oortmerssenbc5fa9d2014-08-25 10:42:38 -0700174 set(CMAKE_CXX_FLAGS
Tony Kelman4c160382016-04-01 21:42:23 -0700175 "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Werror=shadow")
Frank Benkstein20396a12018-10-16 00:11:31 +0200176 set(FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wold-style-cast")
Kamil Rojewski474ba682018-02-12 17:37:51 +0100177 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.4)
178 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0)
179 set(CMAKE_CXX_FLAGS
Wouter van Oortmerssena821b152018-12-26 16:02:14 -0800180 "${CMAKE_CXX_FLAGS} -faligned-new -Werror=implicit-fallthrough=2")
Kamil Rojewski474ba682018-02-12 17:37:51 +0100181 endif()
maurice barnum697cad72016-02-11 00:03:53 +0000182 set(CMAKE_CXX_FLAGS
Juyeon Yoon09988612018-04-06 01:17:33 +0900183 "${CMAKE_CXX_FLAGS} -Wunused-result -Werror=unused-result -Wunused-parameter -Werror=unused-parameter")
maurice barnum697cad72016-02-11 00:03:53 +0000184 endif()
Will Gardnerce4d3312016-02-29 17:28:40 +0000185
186 # Certain platforms such as ARM do not use signed chars by default
187 # which causes issues with certain bounds checks.
188 set(CMAKE_CXX_FLAGS
189 "${CMAKE_CXX_FLAGS} -fsigned-char")
190
Jason Sanmiya985de212016-09-08 10:47:50 -0700191elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
Wouter van Oortmerssen932b22f2015-05-27 16:57:21 -0700192 set(CMAKE_CXX_FLAGS
Alex Amesf2627e12017-10-20 16:29:51 -0700193 "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra -Wno-unused-parameter")
Frank Benkstein20396a12018-10-16 00:11:31 +0200194 set(FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wold-style-cast")
Vladimir Glavnyy7d3930a2019-01-29 01:16:12 +0700195 if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.8)
Wouter van Oortmerssene237f532019-03-07 15:14:40 -0800196 list(APPEND FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wimplicit-fallthrough" "-Wextra-semi" "-Werror=unused-private-field") # enable warning
Vladimir Glavnyy7d3930a2019-01-29 01:16:12 +0700197 endif()
Kamil Rojewski6bfa1072018-07-19 18:40:28 +0200198 if(FLATBUFFERS_LIBCXX_WITH_CLANG)
199 if(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
200 set(CMAKE_CXX_FLAGS
201 "${CMAKE_CXX_FLAGS} -stdlib=libc++")
202 endif()
203 if(NOT ("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD" OR
204 "${CMAKE_SYSTEM_NAME}" MATCHES "Linux"))
205 set(CMAKE_EXE_LINKER_FLAGS
206 "${CMAKE_EXE_LINKER_FLAGS} -lc++abi")
207 endif()
Yuri26f15bc2016-03-02 17:15:42 -0800208 endif()
Will Gardnerce4d3312016-02-29 17:28:40 +0000209
210 # Certain platforms such as ARM do not use signed chars by default
211 # which causes issues with certain bounds checks.
212 set(CMAKE_CXX_FLAGS
213 "${CMAKE_CXX_FLAGS} -fsigned-char")
214
Wouter van Oortmerssen6561c7a2017-02-15 17:44:55 -0800215elseif(MSVC)
chronoxorf5387382017-03-10 21:27:30 +0300216 # Visual Studio pedantic build settings
Wouter van Oortmerssen238a8eb2017-03-29 12:01:11 -0700217 # warning C4512: assignment operator could not be generated
Wouter van Oortmerssene93a5652017-04-24 10:29:25 -0700218 # warning C4316: object allocated on the heap may not be aligned
219 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /WX /wd4512 /wd4316")
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800220endif()
221
222if(FLATBUFFERS_CODE_COVERAGE)
Stefan Eilemann52f4f452014-07-26 13:12:56 +0200223 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fprofile-arcs -ftest-coverage")
Wouter van Oortmerssen8f80fec2014-07-29 10:29:38 -0700224 set(CMAKE_EXE_LINKER_FLAGS
225 "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800226endif()
227
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +0700228function(add_fsanitize_to_target _target _sanitizer)
229 # FLATBUFFERS_CODE_SANITIZE: boolean {ON,OFF,YES,NO} or string with list of sanitizer.
230 # List of sanitizer is string starts with '=': "=address,undefined,thread,memory".
231 if((${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") OR
Vladimir Glavnyy9ad73bf2018-12-18 02:50:31 +0700232 ((${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9"))
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +0700233 )
234 set(_sanitizer_flags "=address,undefined")
235 if(_sanitizer MATCHES "=.*")
236 # override default by user-defined sanitizer list
237 set(_sanitizer_flags ${_sanitizer})
238 endif()
Kamil Rojewski30c49482018-12-06 20:12:06 +0100239 target_compile_options(${_target} PRIVATE
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +0700240 -g -fsigned-char -fno-omit-frame-pointer
241 "-fsanitize${_sanitizer_flags}")
242 target_link_libraries(${_target} PRIVATE
243 "-fsanitize${_sanitizer_flags}")
244 set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ON)
Vladimir Glavnyy5f32f942018-11-17 00:24:06 +0700245 message(STATUS "Sanitizer ${_sanitizer_flags} added to ${_target}")
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +0700246 endif()
247endfunction()
248
franramirez688da0f0962015-01-31 11:14:59 -0500249if(BIICODE)
franchuti68823f75f52015-04-01 12:35:37 +0200250 include(biicode/cmake/biicode.cmake)
franramirez688da0f0962015-01-31 11:14:59 -0500251 return()
franchuti68823f75f52015-04-01 12:35:37 +0200252endif()
franramirez688da0f0962015-01-31 11:14:59 -0500253
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800254include_directories(include)
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700255include_directories(grpc)
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800256
Martell Malone79d3cb62015-07-22 13:18:59 +0100257if(FLATBUFFERS_BUILD_FLATLIB)
Vladimir Glavnyy27e4f432018-08-07 04:59:29 +0700258 add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})
259 # CMake > 2.8.11: Attach header directory for when build via add_subdirectory().
260 target_include_directories(flatbuffers INTERFACE
261 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
Frank Benkstein20396a12018-10-16 00:11:31 +0200262 target_compile_options(flatbuffers PRIVATE "${FLATBUFFERS_PRIVATE_CXX_FLAGS}")
Martell Malone79d3cb62015-07-22 13:18:59 +0100263endif()
264
Leander Bessa Beernaert3ec8d7f2015-01-02 13:51:31 +0100265if(FLATBUFFERS_BUILD_FLATC)
Alex Amesd5753212015-02-13 15:58:29 -0800266 add_executable(flatc ${FlatBuffers_Compiler_SRCS})
Frank Benkstein20396a12018-10-16 00:11:31 +0200267 target_compile_options(flatc PRIVATE "${FLATBUFFERS_PRIVATE_CXX_FLAGS}")
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +0700268 if(FLATBUFFERS_CODE_SANITIZE AND NOT WIN32)
Vladimir Glavnyy0fb1d442018-10-30 01:29:05 +0700269 add_fsanitize_to_target(flatc ${FLATBUFFERS_CODE_SANITIZE})
270 endif()
Xiaolei Yu3a8bc302016-05-01 11:15:53 +0800271 if(NOT FLATBUFFERS_FLATC_EXECUTABLE)
272 set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>)
273 endif()
Wouter van Oortmerssencb2481e2017-05-10 15:42:23 -0700274 if(MSVC)
275 # Make flatc.exe not depend on runtime dlls for easy distribution.
276 target_compile_options(flatc PUBLIC $<$<CONFIG:Release>:/MT>)
277 endif()
Alex Amesd5753212015-02-13 15:58:29 -0800278endif()
279
Jason Sanmiyaf47660f2015-04-28 15:44:10 -0700280if(FLATBUFFERS_BUILD_FLATHASH)
Alex Amesd5753212015-02-13 15:58:29 -0800281 add_executable(flathash ${FlatHash_SRCS})
Leander Bessa Beernaert3ec8d7f2015-01-02 13:51:31 +0100282endif()
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800283
changneta15659e2016-09-07 01:12:04 +0800284if(FLATBUFFERS_BUILD_SHAREDLIB)
285 add_library(flatbuffers_shared SHARED ${FlatBuffers_Library_SRCS})
Sergey Avseyevca52bfe2017-11-10 01:39:32 +0300286
287 # Shared object version: "major.minor.micro"
288 # - micro updated every release when there is no API/ABI changes
289 # - minor updated when there are additions in API/ABI
290 # - major (ABI number) updated when there are changes in ABI (or removals)
291 set(FlatBuffers_Library_SONAME_MAJOR "1")
Wouter van Oortmerssen9e7e8cb2019-04-24 11:34:53 -0700292 set(FlatBuffers_Library_SONAME_FULL "${FlatBuffers_Library_SONAME_MAJOR}.11.0")
Sergey Avseyevca52bfe2017-11-10 01:39:32 +0300293 set_target_properties(flatbuffers_shared PROPERTIES OUTPUT_NAME flatbuffers
294 SOVERSION "${FlatBuffers_Library_SONAME_MAJOR}"
295 VERSION "${FlatBuffers_Library_SONAME_FULL}")
changneta15659e2016-09-07 01:12:04 +0800296endif()
297
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800298function(compile_flatbuffers_schema_to_cpp SRC_FBS)
Wouter van Oortmerssen4cdf3eb2014-10-24 14:26:29 -0700299 get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
Wouter van Oortmerssen7b805352014-09-23 11:55:42 -0700300 string(REGEX REPLACE "\\.fbs$" "_generated.h" GEN_HEADER ${SRC_FBS})
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800301 add_custom_command(
302 OUTPUT ${GEN_HEADER}
Wouter van Oortmerssen3101e322016-07-01 18:08:51 -0700303 COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}" -c --no-includes --gen-mutable
Thomas33791dc2018-09-22 01:53:59 +0200304 --gen-object-api --gen-compare -o "${SRC_FBS_DIR}"
Stewart Milesa8923222017-07-13 06:27:39 -0700305 --cpp-ptr-type flatbuffers::unique_ptr # Used to test with C++98 STLs
Wouter van Oortmerssen72a99ab2017-08-24 17:44:03 -0700306 --reflect-names
Wouter van Oortmerssen22743ca2017-05-24 15:21:26 -0700307 -I "${CMAKE_CURRENT_SOURCE_DIR}/tests/include_test"
Wouter van Oortmerssen3101e322016-07-01 18:08:51 -0700308 "${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800309 DEPENDS flatc)
310endfunction()
311
Wouter van Oortmerssen81312c22015-05-21 16:33:29 -0700312function(compile_flatbuffers_schema_to_binary SRC_FBS)
313 get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
314 string(REGEX REPLACE "\\.fbs$" ".bfbs" GEN_BINARY_SCHEMA ${SRC_FBS})
315 add_custom_command(
316 OUTPUT ${GEN_BINARY_SCHEMA}
Wouter van Oortmerssen3101e322016-07-01 18:08:51 -0700317 COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}" -b --schema -o "${SRC_FBS_DIR}"
318 "${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
Wouter van Oortmerssen81312c22015-05-21 16:33:29 -0700319 DEPENDS flatc)
320endfunction()
321
Stewart Miles3f851832014-09-10 16:01:13 -0700322if(FLATBUFFERS_BUILD_TESTS)
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800323 compile_flatbuffers_schema_to_cpp(tests/monster_test.fbs)
324 include_directories(${CMAKE_CURRENT_BINARY_DIR}/tests)
Stewart Miles3f851832014-09-10 16:01:13 -0700325 add_executable(flattests ${FlatBuffers_Tests_SRCS})
Zarian Waheed6d6271d2016-12-16 08:46:30 -0800326 set_property(TARGET flattests
327 PROPERTY COMPILE_DEFINITIONS FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
328 FLATBUFFERS_DEBUG_VERIFICATION_FAILURE=1)
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +0700329 if(FLATBUFFERS_CODE_SANITIZE)
330 if(WIN32)
331 target_compile_definitions(flattests PRIVATE FLATBUFFERS_MEMORY_LEAK_TRACKING)
332 message(STATUS "Sanitizer MSVC::_CrtDumpMemoryLeaks added to flattests")
333 else()
334 add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})
335 endif()
336 endif()
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800337
338 compile_flatbuffers_schema_to_cpp(samples/monster.fbs)
339 include_directories(${CMAKE_CURRENT_BINARY_DIR}/samples)
Stewart Miles3f851832014-09-10 16:01:13 -0700340 add_executable(flatsamplebinary ${FlatBuffers_Sample_Binary_SRCS})
341 add_executable(flatsampletext ${FlatBuffers_Sample_Text_SRCS})
tira-misudba962e2018-12-13 20:59:27 +0100342 add_executable(flatsamplebfbs ${FlatBuffers_Sample_BFBS_SRCS})
Stewart Miles3f851832014-09-10 16:01:13 -0700343endif()
Wouter van Oortmerssen26a30732014-01-27 16:52:49 -0800344
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700345if(FLATBUFFERS_BUILD_GRPCTEST)
346 if(CMAKE_COMPILER_IS_GNUCXX)
Lawrence Chanda67c0a2017-06-07 15:56:49 -0500347 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter -Wno-shadow")
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700348 endif()
Sumant Tambee7578542018-08-30 16:43:22 -0700349 if(NOT GRPC_INSTALL_PATH)
350 message(SEND_ERROR "GRPC_INSTALL_PATH variable is not defined. See grpc/README.md")
351 endif()
352 if(NOT PROTOBUF_DOWNLOAD_PATH)
353 message(SEND_ERROR "PROTOBUF_DOWNLOAD_PATH variable is not defined. See grpc/README.md")
354 endif()
355 INCLUDE_DIRECTORIES(${GRPC_INSTALL_PATH}/include)
356 INCLUDE_DIRECTORIES(${PROTOBUF_DOWNLOAD_PATH}/src)
357 LINK_DIRECTORIES(${GRPC_INSTALL_PATH}/lib)
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700358 add_executable(grpctest ${FlatBuffers_GRPCTest_SRCS})
Yuri Finkelstein61f4a462017-12-21 06:49:00 -1000359 target_link_libraries(grpctest grpc++_unsecure grpc_unsecure gpr pthread dl)
Wouter van Oortmerssen48f37f92016-04-13 18:16:05 -0700360endif()
361
Dmitry Volosnykhdaf0a422018-02-16 00:39:15 +0300362include(CMake/Version.cmake)
363
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800364if(FLATBUFFERS_INSTALL)
Sergey Avseyev2edb1dc2017-11-06 21:38:53 +0300365 include(GNUInstallDirs)
red19397e803c42017-11-16 21:51:25 +0100366
Sergey Avseyev2edb1dc2017-11-06 21:38:53 +0300367 install(DIRECTORY include/flatbuffers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
red19397e803c42017-11-16 21:51:25 +0100368
369 set(FB_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/flatbuffers")
370
Dmitry Volosnykhdaf0a422018-02-16 00:39:15 +0300371 configure_file(CMake/FlatbuffersConfigVersion.cmake.in FlatbuffersConfigVersion.cmake @ONLY)
red19397e803c42017-11-16 21:51:25 +0100372 install(
Dmitry Volosnykhdaf0a422018-02-16 00:39:15 +0300373 FILES "CMake/FlatbuffersConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/FlatbuffersConfigVersion.cmake"
red19397e803c42017-11-16 21:51:25 +0100374 DESTINATION ${FB_CMAKE_DIR}
375 )
376
Martell Malone79d3cb62015-07-22 13:18:59 +0100377 if(FLATBUFFERS_BUILD_FLATLIB)
Bastien Brunnensteinba08b0e2017-11-30 17:45:58 +0100378 if(CMAKE_VERSION VERSION_LESS 3.0)
379 install(
380 TARGETS flatbuffers EXPORT FlatbuffersTargets
381 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
382 )
383 else()
384 install(
385 TARGETS flatbuffers EXPORT FlatbuffersTargets
386 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
387 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
388 )
389 endif()
red19397e803c42017-11-16 21:51:25 +0100390
391 install(EXPORT FlatbuffersTargets
392 FILE FlatbuffersTargets.cmake
393 NAMESPACE flatbuffers::
394 DESTINATION ${FB_CMAKE_DIR}
395 )
Martell Malone79d3cb62015-07-22 13:18:59 +0100396 endif()
red19397e803c42017-11-16 21:51:25 +0100397
Leander Bessa Beernaert3ec8d7f2015-01-02 13:51:31 +0100398 if(FLATBUFFERS_BUILD_FLATC)
red19397e803c42017-11-16 21:51:25 +0100399 install(
400 TARGETS flatc EXPORT FlatcTargets
401 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
red19397e803c42017-11-16 21:51:25 +0100402 )
403
404 install(
405 EXPORT FlatcTargets
406 FILE FlatcTargets.cmake
407 NAMESPACE flatbuffers::
408 DESTINATION ${FB_CMAKE_DIR}
red19397e803c42017-11-16 21:51:25 +0100409 )
Leander Bessa Beernaert3ec8d7f2015-01-02 13:51:31 +0100410 endif()
red19397e803c42017-11-16 21:51:25 +0100411
changneta15659e2016-09-07 01:12:04 +0800412 if(FLATBUFFERS_BUILD_SHAREDLIB)
Bastien Brunnensteinba08b0e2017-11-30 17:45:58 +0100413 if(CMAKE_VERSION VERSION_LESS 3.0)
414 install(
415 TARGETS flatbuffers_shared EXPORT FlatbuffersSharedTargets
416 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
417 RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
418 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
419 )
420 else()
421 install(
422 TARGETS flatbuffers_shared EXPORT FlatbuffersSharedTargets
423 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
424 RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
425 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
426 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
427 )
428 endif()
red19397e803c42017-11-16 21:51:25 +0100429
430 install(
431 EXPORT FlatbuffersSharedTargets
432 FILE FlatbuffersSharedTargets.cmake
433 NAMESPACE flatbuffers::
434 DESTINATION ${FB_CMAKE_DIR}
435 )
changneta15659e2016-09-07 01:12:04 +0800436 endif()
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800437endif()
Daniel Nachbaur7a99b3c2014-07-15 15:09:36 +0200438
Stewart Miles3f851832014-09-10 16:01:13 -0700439if(FLATBUFFERS_BUILD_TESTS)
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800440 enable_testing()
441
Wouter van Oortmerssen7b805352014-09-23 11:55:42 -0700442 file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/tests" DESTINATION
443 "${CMAKE_CURRENT_BINARY_DIR}")
Zbigniew Mandziejewicz3f8700b2014-09-16 00:50:23 +0800444 add_test(NAME flattests COMMAND flattests)
Sumant Tambee7578542018-08-30 16:43:22 -0700445 if(FLATBUFFERS_BUILD_GRPCTEST)
446 add_test(NAME grpctest COMMAND grpctest)
447 endif()
Stewart Miles3f851832014-09-10 16:01:13 -0700448endif()
Johan Euphrosine331d2d82015-11-17 13:39:37 -0800449
450include(CMake/BuildFlatBuffers.cmake)
Vitaly Isaev928effd2015-05-13 15:15:59 +0300451
Marc Butler4567b132019-02-22 06:06:04 +1100452if(UNIX)
453 # Use of CPack only supported on Linux systems.
454 if(FLATBUFFERS_PACKAGE_DEBIAN)
455 include(CMake/PackageDebian.cmake)
456 endif()
457 if (FLATBUFFERS_PACKAGE_REDHAT)
458 include(CMake/PackageRedhat.cmake)
459 endif()
460 include(CPack)
Vitaly Isaev928effd2015-05-13 15:15:59 +0300461endif()