diff options
Diffstat (limited to 'infra/cmake/packages/FlatBuffersConfig.cmake')
-rw-r--r-- | infra/cmake/packages/FlatBuffersConfig.cmake | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/infra/cmake/packages/FlatBuffersConfig.cmake b/infra/cmake/packages/FlatBuffersConfig.cmake new file mode 100644 index 000000000..ab0b7708f --- /dev/null +++ b/infra/cmake/packages/FlatBuffersConfig.cmake @@ -0,0 +1,115 @@ +function(_FlatBuffers_import) + find_package(Flatbuffers QUIET) + set(FlatBuffers_FOUND ${Flatbuffers_FOUND} PARENT_SCOPE) +endfunction(_FlatBuffers_import) + +function(_FlatBuffers_build) + if(NOT BUILD_FLATBUFFERS) + return() + endif(NOT BUILD_FLATBUFFERS) + + nnas_find_package(FlatBuffersSource EXACT 1.10 QUIET) + + if(NOT FlatBuffersSource_FOUND) + # Source is not available + return() + endif(NOT FlatBuffersSource_FOUND) + + set(ADDITIONAL_CXX_FLAGS "") + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0) + set(ADDITIONAL_CXX_FLAGS "-Wno-error=class-memaccess") + endif() + + nnas_include(ExternalBuildTools) + ExternalBuild_CMake(CMAKE_DIR ${FlatBuffersSource_DIR} + BUILD_DIR ${CMAKE_BINARY_DIR}/externals/FLATBUFFERS/build + INSTALL_DIR ${EXT_OVERLAY_DIR} + BUILD_FLAGS ${ADDITIONAL_CXX_FLAGS} + IDENTIFIER "1.10-fix1" + PKG_NAME "FLATBUFFERS") + +endfunction(_FlatBuffers_build) + +_FlatBuffers_build() +_FlatBuffers_import() + +if(FlatBuffers_FOUND) + if(NOT TARGET flatbuffers) + add_library(flatbuffers INTERFACE) + target_link_libraries(flatbuffers INTERFACE flatbuffers::flatbuffers) + message(STATUS "Found FlatBuffers: TRUE") + endif(NOT TARGET flatbuffers) + + function(FlatBuffers_Generate PREFIX OUTPUT_DIR SCHEMA_DIR) + get_filename_component(abs_output_dir ${OUTPUT_DIR} ABSOLUTE) + get_filename_component(abs_schema_dir ${SCHEMA_DIR} ABSOLUTE) + + foreach(schema ${ARGN}) + get_filename_component(schema_fn "${schema}" NAME) + get_filename_component(dir "${schema}" DIRECTORY) + + get_filename_component(schema_fn_we "${schema_fn}" NAME_WE) + + list(APPEND SCHEMA_FILES "${abs_schema_dir}/${schema}") + list(APPEND OUTPUT_FILES "${abs_output_dir}/${schema_fn_we}_generated.h") + endforeach() + + add_custom_command(OUTPUT ${OUTPUT_FILES} + COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}" + COMMAND "$<TARGET_FILE:flatbuffers::flatc>" -c --no-includes + --no-union-value-namespacing + --gen-object-api -o "${abs_output_dir}" + ${SCHEMA_FILES} + DEPENDS flatbuffers::flatc) + + set(${PREFIX}_SOURCES ${OUTPUT_FILES} PARENT_SCOPE) + set(${PREFIX}_INCLUDE_DIRS ${abs_output_dir} PARENT_SCOPE) + endfunction(FlatBuffers_Generate) + + function(FlatBuffers_Target TGT) + set(oneValueArgs OUTPUT_DIR SCHEMA_DIR INCLUDE_DIR) + set(multiValueArgs SCHEMA_FILES) + cmake_parse_arguments(ARG "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + # Use OUTPUT_DIR as INCLUDE_DIR if INCLUDE_DIR is not specified + if(NOT ARG_INCLUDE_DIR) + set(ARG_INCLUDE_DIR ${ARG_OUTPUT_DIR}) + endif(NOT ARG_INCLUDE_DIR) + + get_filename_component(abs_output_dir ${ARG_OUTPUT_DIR} ABSOLUTE) + get_filename_component(abs_include_dir ${ARG_INCLUDE_DIR} ABSOLUTE) + get_filename_component(abs_schema_dir ${ARG_SCHEMA_DIR} ABSOLUTE) + + # Let's reset list variables before using them + # NOTE THIS DOES NOT AFFECT parent scope + unset(SCHEMA_FILES) + unset(OUTPUT_FILES) + + foreach(schema ${ARG_SCHEMA_FILES}) + get_filename_component(schema_fn "${schema}" NAME) + get_filename_component(dir "${schema}" DIRECTORY) + + get_filename_component(schema_fn_we "${schema_fn}" NAME_WE) + + list(APPEND SCHEMA_FILES "${abs_schema_dir}/${schema}") + list(APPEND OUTPUT_FILES "${abs_output_dir}/${schema_fn_we}_generated.h") + endforeach() + + # Generate headers + add_custom_command(OUTPUT ${OUTPUT_FILES} + COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}" + COMMAND "$<TARGET_FILE:flatbuffers::flatc>" -c --no-includes + --no-union-value-namespacing + --gen-object-api -o "${abs_output_dir}" + ${SCHEMA_FILES} + DEPENDS ${SCHEMA_FILES} + COMMENT "Generate '${TGT}' headers") + + # NOTE This header-only library is deliberately declared as STATIC library + # to avoid possible scope issues related with generated files + add_library(${TGT} STATIC ${OUTPUT_FILES}) + set_target_properties(${TGT} PROPERTIES LINKER_LANGUAGE CXX) + target_include_directories(${TGT} PUBLIC "${ARG_INCLUDE_DIR}") + target_link_libraries(${TGT} PUBLIC flatbuffers) + endfunction(FlatBuffers_Target) +endif(FlatBuffers_FOUND) |