mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-01 19:58:15 +00:00
Helps simplify code generation code. Instead of this:
code += "inline const " + cpp_qualified_name + " *Get";
code += name;
code += "(const void *buf) {\n return flatbuffers::GetRoot<";
code += cpp_qualified_name + ">(buf);\n}\n\n";
You do this:
code.SetValue("NAME", struct_def.name);
code.SetValue("CPP_NAME", cpp_qualified_name);
code += "inline const {{CPP_NAME}} *Get{{NAME}}(const void *buf) {";
code += " return flatbuffers::GetRoot<{{CPP_NAME}}>(buf);";
code += "}";
code += "";
Updated the CPP code generator to use the CodeWriter class. Most of the
changes in the generated code are white-space changes, esp. around new
lines (since the code generator class automatically appends new lines
when appending a string). Actual code changes include:
* Renamed "rehasher" to "_rehasher" for consistency with other args in
Pack function.
* Renamed "union_obj" to "obj: in UnPack function.
* Always do "(void)_o;" to prevent unused variable warning in Create
function (instead of only doing it if there are no fields) in order
to avoid two-passes.
* Renamed padding variables from __paddingX to paddingX__.
"Each name that contains a double underscore (_ _) [...] is reserved
to the implementation for any use." C++ standards 17.4.3.1.2.
* Add braces around switch cases.
* Calculate index as a separate statement in EnumName function, eg.
const size_t index = ...;
return EnumNamesX()[index];
vs.
return EnumNamesX()[...];
* Stored end table offset in variable in Finish() functions, eg.
const auto end = fbb_.EndTable(start_, ...);
auto o = flatbuffers::Offset<T>(end);
vs.
auto o = flatbuffers::Offset<T>(fbb_.EndTable(start, ...));
* Separate reinterpret_cast calls from function calls in Union
functions, eg.
auto ptr = reinterpret_cast<const T *>(obj);
return ptr->UnPack(resolver);
vs.
return reinterpret_cast<const T *>(obj)->UnPack(resolver);
* Removed unecessary (void)(padding__X) no-ops from constructors, eg.
Test(int16_t a, int8_t b) : ... {
(void)__padding0; // <-- Removed this line.
}
In the idl_gen_cpp.cpp file itself, I refactored some code generation into
new functions: GenParam, GenNativeTable, GenVerifyCall, GenBuilders,
GenUnpackFieldStatement, and GenCreateParam.
Change-Id: I727b1bd8719d05b7ce33cbce00eb58fda817b25d
244 lines
7.6 KiB
CMake
244 lines
7.6 KiB
CMake
cmake_minimum_required(VERSION 2.8)
|
|
|
|
project(FlatBuffers)
|
|
|
|
# NOTE: Code coverage only works on Linux & OSX.
|
|
option(FLATBUFFERS_CODE_COVERAGE "Enable the code coverage build option." OFF)
|
|
option(FLATBUFFERS_BUILD_TESTS "Enable the build of tests and samples." ON)
|
|
option(FLATBUFFERS_INSTALL "Enable the installation of targets." ON)
|
|
option(FLATBUFFERS_BUILD_FLATLIB "Enable the build of the flatbuffers library"
|
|
ON)
|
|
option(FLATBUFFERS_BUILD_FLATC "Enable the build of the flatbuffers compiler"
|
|
ON)
|
|
option(FLATBUFFERS_BUILD_FLATHASH "Enable the build of flathash" ON)
|
|
option(FLATBUFFERS_BUILD_GRPCTEST "Enable the build of grpctest" OFF)
|
|
option(FLATBUFFERS_BUILD_SHAREDLIB
|
|
"Enable the build of the flatbuffers shared library"
|
|
OFF)
|
|
|
|
if(NOT FLATBUFFERS_BUILD_FLATC AND FLATBUFFERS_BUILD_TESTS)
|
|
message(WARNING
|
|
"Cannot build tests without building the compiler. Tests will be disabled.")
|
|
set(FLATBUFFERS_BUILD_TESTS OFF)
|
|
endif()
|
|
|
|
set(FlatBuffers_Library_SRCS
|
|
include/flatbuffers/code_generators.h
|
|
include/flatbuffers/flatbuffers.h
|
|
include/flatbuffers/hash.h
|
|
include/flatbuffers/idl.h
|
|
include/flatbuffers/util.h
|
|
include/flatbuffers/reflection.h
|
|
include/flatbuffers/reflection_generated.h
|
|
src/code_generators.cpp
|
|
src/idl_parser.cpp
|
|
src/idl_gen_text.cpp
|
|
src/reflection.cpp
|
|
src/util.cpp
|
|
)
|
|
|
|
set(FlatBuffers_Compiler_SRCS
|
|
${FlatBuffers_Library_SRCS}
|
|
src/idl_gen_cpp.cpp
|
|
src/idl_gen_general.cpp
|
|
src/idl_gen_go.cpp
|
|
src/idl_gen_js.cpp
|
|
src/idl_gen_php.cpp
|
|
src/idl_gen_python.cpp
|
|
src/idl_gen_fbs.cpp
|
|
src/idl_gen_grpc.cpp
|
|
src/flatc.cpp
|
|
grpc/src/compiler/schema_interface.h
|
|
grpc/src/compiler/cpp_generator.h
|
|
grpc/src/compiler/cpp_generator.cc
|
|
grpc/src/compiler/go_generator.h
|
|
grpc/src/compiler/go_generator.cc
|
|
)
|
|
|
|
set(FlatHash_SRCS
|
|
include/flatbuffers/hash.h
|
|
src/flathash.cpp
|
|
)
|
|
|
|
set(FlatBuffers_Tests_SRCS
|
|
${FlatBuffers_Library_SRCS}
|
|
src/idl_gen_fbs.cpp
|
|
tests/test.cpp
|
|
# file generate by running compiler on tests/monster_test.fbs
|
|
${CMAKE_CURRENT_BINARY_DIR}/tests/monster_test_generated.h
|
|
)
|
|
|
|
set(FlatBuffers_Sample_Binary_SRCS
|
|
include/flatbuffers/flatbuffers.h
|
|
samples/sample_binary.cpp
|
|
# file generated by running compiler on samples/monster.fbs
|
|
${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
|
|
)
|
|
|
|
set(FlatBuffers_Sample_Text_SRCS
|
|
${FlatBuffers_Library_SRCS}
|
|
samples/sample_text.cpp
|
|
# file generated by running compiler on samples/monster.fbs
|
|
${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
|
|
)
|
|
|
|
set(FlatBuffers_GRPCTest_SRCS
|
|
include/flatbuffers/flatbuffers.h
|
|
include/flatbuffers/grpc.h
|
|
tests/monster_test.grpc.fb.h
|
|
tests/monster_test.grpc.fb.cc
|
|
grpc/tests/grpctest.cpp
|
|
# file generated by running compiler on samples/monster.fbs
|
|
${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
|
|
)
|
|
|
|
# source_group(Compiler FILES ${FlatBuffers_Compiler_SRCS})
|
|
# source_group(Tests FILES ${FlatBuffers_Tests_SRCS})
|
|
|
|
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
|
|
# do not apply any global settings if the toolchain
|
|
# is being configured externally
|
|
elseif(APPLE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra")
|
|
elseif(CMAKE_COMPILER_IS_GNUCXX)
|
|
if(CYGWIN)
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -std=gnu++11")
|
|
else(CYGWIN)
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -std=c++0x")
|
|
endif(CYGWIN)
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Werror=shadow")
|
|
if (GCC_VERSION VERSION_GREATER 4.4)
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -Wunused-result -Werror=unused-result \
|
|
-Wunused-parameter -Werror=unused-parameter")
|
|
endif()
|
|
|
|
# Certain platforms such as ARM do not use signed chars by default
|
|
# which causes issues with certain bounds checks.
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -fsigned-char")
|
|
|
|
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -std=c++0x -stdlib=libc++ -Wall -pedantic -Werror \
|
|
-Wextra")
|
|
if(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD")
|
|
set(CMAKE_EXE_LINKER_FLAGS
|
|
"${CMAKE_EXE_LINKER_FLAGS} -lc++abi")
|
|
endif()
|
|
|
|
# Certain platforms such as ARM do not use signed chars by default
|
|
# which causes issues with certain bounds checks.
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -fsigned-char")
|
|
|
|
endif()
|
|
|
|
if(FLATBUFFERS_CODE_COVERAGE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fprofile-arcs -ftest-coverage")
|
|
set(CMAKE_EXE_LINKER_FLAGS
|
|
"${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
|
|
endif()
|
|
|
|
if(BIICODE)
|
|
include(biicode/cmake/biicode.cmake)
|
|
return()
|
|
endif()
|
|
|
|
include_directories(include)
|
|
include_directories(grpc)
|
|
|
|
if(FLATBUFFERS_BUILD_FLATLIB)
|
|
add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})
|
|
endif()
|
|
|
|
if(FLATBUFFERS_BUILD_FLATC)
|
|
add_executable(flatc ${FlatBuffers_Compiler_SRCS})
|
|
if(NOT FLATBUFFERS_FLATC_EXECUTABLE)
|
|
set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>)
|
|
endif()
|
|
endif()
|
|
|
|
if(FLATBUFFERS_BUILD_FLATHASH)
|
|
add_executable(flathash ${FlatHash_SRCS})
|
|
endif()
|
|
|
|
if(FLATBUFFERS_BUILD_SHAREDLIB)
|
|
add_library(flatbuffers_shared SHARED ${FlatBuffers_Library_SRCS})
|
|
set_target_properties(flatbuffers_shared PROPERTIES OUTPUT_NAME flatbuffers)
|
|
endif()
|
|
|
|
function(compile_flatbuffers_schema_to_cpp SRC_FBS)
|
|
get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
|
|
string(REGEX REPLACE "\\.fbs$" "_generated.h" GEN_HEADER ${SRC_FBS})
|
|
add_custom_command(
|
|
OUTPUT ${GEN_HEADER}
|
|
COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}" -c --no-includes --gen-mutable
|
|
--gen-object-api -o "${SRC_FBS_DIR}"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
|
|
DEPENDS flatc)
|
|
endfunction()
|
|
|
|
function(compile_flatbuffers_schema_to_binary SRC_FBS)
|
|
get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
|
|
string(REGEX REPLACE "\\.fbs$" ".bfbs" GEN_BINARY_SCHEMA ${SRC_FBS})
|
|
add_custom_command(
|
|
OUTPUT ${GEN_BINARY_SCHEMA}
|
|
COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}" -b --schema -o "${SRC_FBS_DIR}"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
|
|
DEPENDS flatc)
|
|
endfunction()
|
|
|
|
if(FLATBUFFERS_BUILD_TESTS)
|
|
compile_flatbuffers_schema_to_cpp(tests/monster_test.fbs)
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/tests)
|
|
add_executable(flattests ${FlatBuffers_Tests_SRCS})
|
|
set_property(TARGET flattests
|
|
PROPERTY COMPILE_DEFINITIONS FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
|
|
FLATBUFFERS_DEBUG_VERIFICATION_FAILURE=1)
|
|
|
|
compile_flatbuffers_schema_to_cpp(samples/monster.fbs)
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/samples)
|
|
add_executable(flatsamplebinary ${FlatBuffers_Sample_Binary_SRCS})
|
|
add_executable(flatsampletext ${FlatBuffers_Sample_Text_SRCS})
|
|
endif()
|
|
|
|
if(FLATBUFFERS_BUILD_GRPCTEST)
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter")
|
|
endif()
|
|
add_executable(grpctest ${FlatBuffers_GRPCTest_SRCS})
|
|
target_link_libraries(grpctest grpc++_unsecure grpc pthread dl)
|
|
endif()
|
|
|
|
if(FLATBUFFERS_INSTALL)
|
|
install(DIRECTORY include/flatbuffers DESTINATION include)
|
|
if(FLATBUFFERS_BUILD_FLATLIB)
|
|
install(TARGETS flatbuffers DESTINATION lib)
|
|
endif()
|
|
if(FLATBUFFERS_BUILD_FLATC)
|
|
install(TARGETS flatc DESTINATION bin)
|
|
endif()
|
|
if(FLATBUFFERS_BUILD_SHAREDLIB)
|
|
install(TARGETS flatbuffers_shared DESTINATION lib)
|
|
endif()
|
|
endif()
|
|
|
|
if(FLATBUFFERS_BUILD_TESTS)
|
|
enable_testing()
|
|
|
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/tests" DESTINATION
|
|
"${CMAKE_CURRENT_BINARY_DIR}")
|
|
add_test(NAME flattests COMMAND flattests)
|
|
endif()
|
|
|
|
include(CMake/BuildFlatBuffers.cmake)
|
|
|
|
if(FLATBUFFERS_PACKAGE_DEBIAN)
|
|
include(CMake/PackageDebian.cmake)
|
|
endif()
|