blob: ab0b7708f2722076865d076c64aec2980ce5a1a7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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)
|