Imported Upstream version 1.8.0
[platform/core/ml/nnfw.git] / infra / cmake / packages / FlatBuffersConfig.cmake
1 function(_FlatBuffers_import)
2   find_package(Flatbuffers QUIET)
3   set(FlatBuffers_FOUND ${Flatbuffers_FOUND} PARENT_SCOPE)
4 endfunction(_FlatBuffers_import)
5
6 function(_FlatBuffers_build)
7   if(NOT BUILD_FLATBUFFERS)
8     return()
9   endif(NOT BUILD_FLATBUFFERS)
10
11   nnas_find_package(FlatBuffersSource EXACT 1.10 QUIET)
12
13   if(NOT FlatBuffersSource_FOUND)
14     # Source is not available
15     return()
16   endif(NOT FlatBuffersSource_FOUND)
17
18   set(ADDITIONAL_CXX_FLAGS "")
19   if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0)
20     set(ADDITIONAL_CXX_FLAGS "-Wno-error=class-memaccess")
21   endif()
22
23   nnas_include(ExternalBuildTools)
24   ExternalBuild_CMake(CMAKE_DIR   ${FlatBuffersSource_DIR}
25                       BUILD_DIR   ${CMAKE_BINARY_DIR}/externals/FLATBUFFERS/build
26                       INSTALL_DIR ${EXT_OVERLAY_DIR}
27                       BUILD_FLAGS ${ADDITIONAL_CXX_FLAGS}
28                       IDENTIFIER  "1.10-fix2"
29                       EXTRA_OPTS "-DFLATBUFFERS_BUILD_TESTS:BOOL=OFF"
30                       PKG_NAME    "FLATBUFFERS")
31
32 endfunction(_FlatBuffers_build)
33
34 _FlatBuffers_build()
35 _FlatBuffers_import()
36
37 if(FlatBuffers_FOUND)
38   if(NOT TARGET flatbuffers)
39     add_library(flatbuffers INTERFACE)
40     target_link_libraries(flatbuffers INTERFACE flatbuffers::flatbuffers)
41     message(STATUS "Found FlatBuffers: TRUE")
42   endif(NOT TARGET flatbuffers)
43
44   function(FlatBuffers_Generate PREFIX OUTPUT_DIR SCHEMA_DIR)
45     get_filename_component(abs_output_dir ${OUTPUT_DIR} ABSOLUTE)
46     get_filename_component(abs_schema_dir ${SCHEMA_DIR} ABSOLUTE)
47
48     foreach(schema ${ARGN})
49       get_filename_component(schema_fn "${schema}" NAME)
50       get_filename_component(dir "${schema}" DIRECTORY)
51
52       get_filename_component(schema_fn_we "${schema_fn}" NAME_WE)
53
54       list(APPEND SCHEMA_FILES "${abs_schema_dir}/${schema}")
55       list(APPEND OUTPUT_FILES "${abs_output_dir}/${schema_fn_we}_generated.h")
56     endforeach()
57
58     add_custom_command(OUTPUT ${OUTPUT_FILES}
59                        COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}"
60                        COMMAND "$<TARGET_FILE:flatbuffers::flatc>" -c --no-includes
61                        --no-union-value-namespacing
62                        --gen-object-api -o "${abs_output_dir}"
63                        ${SCHEMA_FILES}
64                        DEPENDS flatbuffers::flatc)
65
66     set(${PREFIX}_SOURCES ${OUTPUT_FILES} PARENT_SCOPE)
67     set(${PREFIX}_INCLUDE_DIRS ${abs_output_dir} PARENT_SCOPE)
68   endfunction(FlatBuffers_Generate)
69
70   function(FlatBuffers_Target TGT)
71     set(oneValueArgs OUTPUT_DIR SCHEMA_DIR INCLUDE_DIR)
72     set(multiValueArgs SCHEMA_FILES)
73     cmake_parse_arguments(ARG "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
74
75     # Use OUTPUT_DIR as INCLUDE_DIR if INCLUDE_DIR is not specified
76     if(NOT ARG_INCLUDE_DIR)
77       set(ARG_INCLUDE_DIR ${ARG_OUTPUT_DIR})
78     endif(NOT ARG_INCLUDE_DIR)
79
80     get_filename_component(abs_output_dir ${ARG_OUTPUT_DIR} ABSOLUTE)
81     get_filename_component(abs_include_dir ${ARG_INCLUDE_DIR} ABSOLUTE)
82     get_filename_component(abs_schema_dir ${ARG_SCHEMA_DIR} ABSOLUTE)
83
84     # Let's reset list variables before using them
85     # NOTE THIS DOES NOT AFFECT parent scope
86     unset(SCHEMA_FILES)
87     unset(OUTPUT_FILES)
88
89     foreach(schema ${ARG_SCHEMA_FILES})
90       get_filename_component(schema_fn "${schema}" NAME)
91       get_filename_component(dir "${schema}" DIRECTORY)
92
93       get_filename_component(schema_fn_we "${schema_fn}" NAME_WE)
94
95       list(APPEND SCHEMA_FILES "${abs_schema_dir}/${schema}")
96       list(APPEND OUTPUT_FILES "${abs_output_dir}/${schema_fn_we}_generated.h")
97     endforeach()
98
99     # Generate headers
100     add_custom_command(OUTPUT ${OUTPUT_FILES}
101                        COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}"
102                        COMMAND "$<TARGET_FILE:flatbuffers::flatc>" -c --no-includes
103                                --no-union-value-namespacing
104                                --gen-object-api -o "${abs_output_dir}"
105                                ${SCHEMA_FILES}
106                        DEPENDS ${SCHEMA_FILES}
107                        COMMENT "Generate '${TGT}' headers")
108
109     # NOTE This header-only library is deliberately declared as STATIC library
110     #      to avoid possible scope issues related with generated files
111     add_library(${TGT} STATIC ${OUTPUT_FILES})
112     set_target_properties(${TGT} PROPERTIES LINKER_LANGUAGE CXX)
113     target_include_directories(${TGT} PUBLIC "${ARG_INCLUDE_DIR}")
114     target_link_libraries(${TGT} PUBLIC flatbuffers)
115   endfunction(FlatBuffers_Target)
116 endif(FlatBuffers_FOUND)