xref: /aosp_15_r20/external/flatbuffers/CMake/BuildFlatBuffers.cmake (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker# Copyright 2015 Google Inc. All rights reserved.
2*890232f2SAndroid Build Coastguard Worker#
3*890232f2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*890232f2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*890232f2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*890232f2SAndroid Build Coastguard Worker#
7*890232f2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*890232f2SAndroid Build Coastguard Worker#
9*890232f2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*890232f2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*890232f2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*890232f2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*890232f2SAndroid Build Coastguard Worker# limitations under the License.
14*890232f2SAndroid Build Coastguard Worker
15*890232f2SAndroid Build Coastguard Worker# General function to create FlatBuffer build rules for the given list of
16*890232f2SAndroid Build Coastguard Worker# schemas.
17*890232f2SAndroid Build Coastguard Worker#
18*890232f2SAndroid Build Coastguard Worker# flatbuffers_schemas: A list of flatbuffer schema files to process.
19*890232f2SAndroid Build Coastguard Worker#
20*890232f2SAndroid Build Coastguard Worker# schema_include_dirs: A list of schema file include directories, which will be
21*890232f2SAndroid Build Coastguard Worker# passed to flatc via the -I parameter.
22*890232f2SAndroid Build Coastguard Worker#
23*890232f2SAndroid Build Coastguard Worker# custom_target_name: The generated files will be added as dependencies for a
24*890232f2SAndroid Build Coastguard Worker# new custom target with this name. You should add that target as a dependency
25*890232f2SAndroid Build Coastguard Worker# for your main target to ensure these files are built. You can also retrieve
26*890232f2SAndroid Build Coastguard Worker# various properties from this target, such as GENERATED_INCLUDES_DIR,
27*890232f2SAndroid Build Coastguard Worker# BINARY_SCHEMAS_DIR, and COPY_TEXT_SCHEMAS_DIR.
28*890232f2SAndroid Build Coastguard Worker#
29*890232f2SAndroid Build Coastguard Worker# additional_dependencies: A list of additional dependencies that you'd like
30*890232f2SAndroid Build Coastguard Worker# all generated files to depend on. Pass in a blank string if you have none.
31*890232f2SAndroid Build Coastguard Worker#
32*890232f2SAndroid Build Coastguard Worker# generated_includes_dir: Where to generate the C++ header files for these
33*890232f2SAndroid Build Coastguard Worker# schemas. The generated includes directory will automatically be added to
34*890232f2SAndroid Build Coastguard Worker# CMake's include directories, and will be where generated header files are
35*890232f2SAndroid Build Coastguard Worker# placed. This parameter is optional; pass in empty string if you don't want to
36*890232f2SAndroid Build Coastguard Worker# generate include files for these schemas.
37*890232f2SAndroid Build Coastguard Worker#
38*890232f2SAndroid Build Coastguard Worker# binary_schemas_dir: If you specify an optional binary schema directory, binary
39*890232f2SAndroid Build Coastguard Worker# schemas will be generated for these schemas as well, and placed into the given
40*890232f2SAndroid Build Coastguard Worker# directory.
41*890232f2SAndroid Build Coastguard Worker#
42*890232f2SAndroid Build Coastguard Worker# copy_text_schemas_dir: If you want all text schemas (including schemas from
43*890232f2SAndroid Build Coastguard Worker# all schema include directories) copied into a directory (for example, if you
44*890232f2SAndroid Build Coastguard Worker# need them within your project to build JSON files), you can specify that
45*890232f2SAndroid Build Coastguard Worker# folder here. All text schemas will be copied to that folder.
46*890232f2SAndroid Build Coastguard Worker#
47*890232f2SAndroid Build Coastguard Worker# IMPORTANT: Make sure you quote all list arguments you pass to this function!
48*890232f2SAndroid Build Coastguard Worker# Otherwise CMake will only pass in the first element.
49*890232f2SAndroid Build Coastguard Worker# Example: build_flatbuffers("${fb_files}" "${include_dirs}" target_name ...)
50*890232f2SAndroid Build Coastguard Workerfunction(build_flatbuffers flatbuffers_schemas
51*890232f2SAndroid Build Coastguard Worker                           schema_include_dirs
52*890232f2SAndroid Build Coastguard Worker                           custom_target_name
53*890232f2SAndroid Build Coastguard Worker                           additional_dependencies
54*890232f2SAndroid Build Coastguard Worker                           generated_includes_dir
55*890232f2SAndroid Build Coastguard Worker                           binary_schemas_dir
56*890232f2SAndroid Build Coastguard Worker                           copy_text_schemas_dir)
57*890232f2SAndroid Build Coastguard Worker
58*890232f2SAndroid Build Coastguard Worker  # Test if including from FindFlatBuffers
59*890232f2SAndroid Build Coastguard Worker  if(FLATBUFFERS_FLATC_EXECUTABLE)
60*890232f2SAndroid Build Coastguard Worker    set(FLATC_TARGET "")
61*890232f2SAndroid Build Coastguard Worker    set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})
62*890232f2SAndroid Build Coastguard Worker  else()
63*890232f2SAndroid Build Coastguard Worker    set(FLATC_TARGET flatc)
64*890232f2SAndroid Build Coastguard Worker    set(FLATC flatc)
65*890232f2SAndroid Build Coastguard Worker  endif()
66*890232f2SAndroid Build Coastguard Worker  set(FLATC_SCHEMA_ARGS --gen-mutable)
67*890232f2SAndroid Build Coastguard Worker  if(FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS)
68*890232f2SAndroid Build Coastguard Worker    set(FLATC_SCHEMA_ARGS
69*890232f2SAndroid Build Coastguard Worker      ${FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS}
70*890232f2SAndroid Build Coastguard Worker      ${FLATC_SCHEMA_ARGS}
71*890232f2SAndroid Build Coastguard Worker      )
72*890232f2SAndroid Build Coastguard Worker  endif()
73*890232f2SAndroid Build Coastguard Worker
74*890232f2SAndroid Build Coastguard Worker  set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
75*890232f2SAndroid Build Coastguard Worker
76*890232f2SAndroid Build Coastguard Worker  set(schema_glob "*.fbs")
77*890232f2SAndroid Build Coastguard Worker  # Generate the include files parameters.
78*890232f2SAndroid Build Coastguard Worker  set(include_params "")
79*890232f2SAndroid Build Coastguard Worker  set(all_generated_files "")
80*890232f2SAndroid Build Coastguard Worker  foreach (include_dir ${schema_include_dirs})
81*890232f2SAndroid Build Coastguard Worker    set(include_params -I ${include_dir} ${include_params})
82*890232f2SAndroid Build Coastguard Worker    if (NOT ${copy_text_schemas_dir} STREQUAL "")
83*890232f2SAndroid Build Coastguard Worker      # Copy text schemas from dependent folders.
84*890232f2SAndroid Build Coastguard Worker      file(GLOB_RECURSE dependent_schemas ${include_dir}/${schema_glob})
85*890232f2SAndroid Build Coastguard Worker      foreach (dependent_schema ${dependent_schemas})
86*890232f2SAndroid Build Coastguard Worker        file(COPY ${dependent_schema} DESTINATION ${copy_text_schemas_dir})
87*890232f2SAndroid Build Coastguard Worker      endforeach()
88*890232f2SAndroid Build Coastguard Worker    endif()
89*890232f2SAndroid Build Coastguard Worker  endforeach()
90*890232f2SAndroid Build Coastguard Worker
91*890232f2SAndroid Build Coastguard Worker  foreach(schema ${flatbuffers_schemas})
92*890232f2SAndroid Build Coastguard Worker    get_filename_component(filename ${schema} NAME_WE)
93*890232f2SAndroid Build Coastguard Worker    # For each schema, do the things we requested.
94*890232f2SAndroid Build Coastguard Worker    if (NOT ${generated_includes_dir} STREQUAL "")
95*890232f2SAndroid Build Coastguard Worker      set(generated_include ${generated_includes_dir}/${filename}_generated.h)
96*890232f2SAndroid Build Coastguard Worker      add_custom_command(
97*890232f2SAndroid Build Coastguard Worker        OUTPUT ${generated_include}
98*890232f2SAndroid Build Coastguard Worker        COMMAND ${FLATC} ${FLATC_SCHEMA_ARGS}
99*890232f2SAndroid Build Coastguard Worker        -o ${generated_includes_dir}
100*890232f2SAndroid Build Coastguard Worker        ${include_params}
101*890232f2SAndroid Build Coastguard Worker        -c ${schema}
102*890232f2SAndroid Build Coastguard Worker        DEPENDS ${FLATC_TARGET} ${schema} ${additional_dependencies}
103*890232f2SAndroid Build Coastguard Worker        WORKING_DIRECTORY "${working_dir}")
104*890232f2SAndroid Build Coastguard Worker      list(APPEND all_generated_files ${generated_include})
105*890232f2SAndroid Build Coastguard Worker    endif()
106*890232f2SAndroid Build Coastguard Worker
107*890232f2SAndroid Build Coastguard Worker    if (NOT ${binary_schemas_dir} STREQUAL "")
108*890232f2SAndroid Build Coastguard Worker      set(binary_schema ${binary_schemas_dir}/${filename}.bfbs)
109*890232f2SAndroid Build Coastguard Worker      add_custom_command(
110*890232f2SAndroid Build Coastguard Worker        OUTPUT ${binary_schema}
111*890232f2SAndroid Build Coastguard Worker        COMMAND ${FLATC} -b --schema
112*890232f2SAndroid Build Coastguard Worker        -o ${binary_schemas_dir}
113*890232f2SAndroid Build Coastguard Worker        ${include_params}
114*890232f2SAndroid Build Coastguard Worker        ${schema}
115*890232f2SAndroid Build Coastguard Worker        DEPENDS ${FLATC_TARGET} ${schema} ${additional_dependencies}
116*890232f2SAndroid Build Coastguard Worker        WORKING_DIRECTORY "${working_dir}")
117*890232f2SAndroid Build Coastguard Worker      list(APPEND all_generated_files ${binary_schema})
118*890232f2SAndroid Build Coastguard Worker    endif()
119*890232f2SAndroid Build Coastguard Worker
120*890232f2SAndroid Build Coastguard Worker    if (NOT ${copy_text_schemas_dir} STREQUAL "")
121*890232f2SAndroid Build Coastguard Worker      file(COPY ${schema} DESTINATION ${copy_text_schemas_dir})
122*890232f2SAndroid Build Coastguard Worker    endif()
123*890232f2SAndroid Build Coastguard Worker  endforeach()
124*890232f2SAndroid Build Coastguard Worker
125*890232f2SAndroid Build Coastguard Worker  # Create a custom target that depends on all the generated files.
126*890232f2SAndroid Build Coastguard Worker  # This is the target that you can depend on to trigger all these
127*890232f2SAndroid Build Coastguard Worker  # to be built.
128*890232f2SAndroid Build Coastguard Worker  add_custom_target(${custom_target_name}
129*890232f2SAndroid Build Coastguard Worker                    DEPENDS ${all_generated_files} ${additional_dependencies})
130*890232f2SAndroid Build Coastguard Worker
131*890232f2SAndroid Build Coastguard Worker  # Register the include directory we are using.
132*890232f2SAndroid Build Coastguard Worker  if (NOT ${generated_includes_dir} STREQUAL "")
133*890232f2SAndroid Build Coastguard Worker    include_directories(${generated_includes_dir})
134*890232f2SAndroid Build Coastguard Worker    set_property(TARGET ${custom_target_name}
135*890232f2SAndroid Build Coastguard Worker      PROPERTY GENERATED_INCLUDES_DIR
136*890232f2SAndroid Build Coastguard Worker      ${generated_includes_dir})
137*890232f2SAndroid Build Coastguard Worker  endif()
138*890232f2SAndroid Build Coastguard Worker
139*890232f2SAndroid Build Coastguard Worker  # Register the binary schemas dir we are using.
140*890232f2SAndroid Build Coastguard Worker  if (NOT ${binary_schemas_dir} STREQUAL "")
141*890232f2SAndroid Build Coastguard Worker    set_property(TARGET ${custom_target_name}
142*890232f2SAndroid Build Coastguard Worker      PROPERTY BINARY_SCHEMAS_DIR
143*890232f2SAndroid Build Coastguard Worker      ${binary_schemas_dir})
144*890232f2SAndroid Build Coastguard Worker  endif()
145*890232f2SAndroid Build Coastguard Worker
146*890232f2SAndroid Build Coastguard Worker  # Register the text schema copy dir we are using.
147*890232f2SAndroid Build Coastguard Worker  if (NOT ${copy_text_schemas_dir} STREQUAL "")
148*890232f2SAndroid Build Coastguard Worker    set_property(TARGET ${custom_target_name}
149*890232f2SAndroid Build Coastguard Worker      PROPERTY COPY_TEXT_SCHEMAS_DIR
150*890232f2SAndroid Build Coastguard Worker      ${copy_text_schemas_dir})
151*890232f2SAndroid Build Coastguard Worker  endif()
152*890232f2SAndroid Build Coastguard Workerendfunction()
153*890232f2SAndroid Build Coastguard Worker
154*890232f2SAndroid Build Coastguard Worker# Creates a target that can be linked against that generates flatbuffer headers.
155*890232f2SAndroid Build Coastguard Worker#
156*890232f2SAndroid Build Coastguard Worker# This function takes a target name and a list of schemas. You can also specify
157*890232f2SAndroid Build Coastguard Worker# other flagc flags using the FLAGS option to change the behavior of the flatc
158*890232f2SAndroid Build Coastguard Worker# tool.
159*890232f2SAndroid Build Coastguard Worker#
160*890232f2SAndroid Build Coastguard Worker# Arguments:
161*890232f2SAndroid Build Coastguard Worker#   TARGET: The name of the target to generate.
162*890232f2SAndroid Build Coastguard Worker#   SCHEMAS: The list of schema files to generate code for.
163*890232f2SAndroid Build Coastguard Worker#   BINARY_SCHEMAS_DIR: Optional. The directory in which to generate binary
164*890232f2SAndroid Build Coastguard Worker#       schemas. Binary schemas will only be generated if a path is provided.
165*890232f2SAndroid Build Coastguard Worker#   INCLUDE: Optional. Search for includes in the specified paths. (Use this
166*890232f2SAndroid Build Coastguard Worker#       instead of "-I <path>" and the FLAGS option so that CMake is aware of
167*890232f2SAndroid Build Coastguard Worker#       the directories that need to be searched).
168*890232f2SAndroid Build Coastguard Worker#   INCLUDE_PREFIX: Optional. The directory in which to place the generated
169*890232f2SAndroid Build Coastguard Worker#       files. Use this instead of the --include-prefix option.
170*890232f2SAndroid Build Coastguard Worker#   FLAGS: Optional. A list of any additional flags that you would like to pass
171*890232f2SAndroid Build Coastguard Worker#       to flatc.
172*890232f2SAndroid Build Coastguard Worker#
173*890232f2SAndroid Build Coastguard Worker# Example:
174*890232f2SAndroid Build Coastguard Worker#
175*890232f2SAndroid Build Coastguard Worker#     flatbuffers_generate_headers(
176*890232f2SAndroid Build Coastguard Worker#         TARGET my_generated_headers_target
177*890232f2SAndroid Build Coastguard Worker#         INCLUDE_PREFIX ${MY_INCLUDE_PREFIX}"
178*890232f2SAndroid Build Coastguard Worker#         SCHEMAS ${MY_SCHEMA_FILES}
179*890232f2SAndroid Build Coastguard Worker#         BINARY_SCHEMAS_DIR "${MY_BINARY_SCHEMA_DIRECTORY}"
180*890232f2SAndroid Build Coastguard Worker#         FLAGS --gen-object-api)
181*890232f2SAndroid Build Coastguard Worker#
182*890232f2SAndroid Build Coastguard Worker#     target_link_libraries(MyExecutableTarget
183*890232f2SAndroid Build Coastguard Worker#         PRIVATE my_generated_headers_target
184*890232f2SAndroid Build Coastguard Worker#     )
185*890232f2SAndroid Build Coastguard Workerfunction(flatbuffers_generate_headers)
186*890232f2SAndroid Build Coastguard Worker  # Parse function arguments.
187*890232f2SAndroid Build Coastguard Worker  set(options)
188*890232f2SAndroid Build Coastguard Worker  set(one_value_args
189*890232f2SAndroid Build Coastguard Worker    "TARGET"
190*890232f2SAndroid Build Coastguard Worker    "INCLUDE_PREFIX"
191*890232f2SAndroid Build Coastguard Worker    "BINARY_SCHEMAS_DIR")
192*890232f2SAndroid Build Coastguard Worker  set(multi_value_args
193*890232f2SAndroid Build Coastguard Worker    "SCHEMAS"
194*890232f2SAndroid Build Coastguard Worker    "INCLUDE"
195*890232f2SAndroid Build Coastguard Worker    "FLAGS")
196*890232f2SAndroid Build Coastguard Worker  cmake_parse_arguments(
197*890232f2SAndroid Build Coastguard Worker    PARSE_ARGV 0
198*890232f2SAndroid Build Coastguard Worker    FLATBUFFERS_GENERATE_HEADERS
199*890232f2SAndroid Build Coastguard Worker    "${options}"
200*890232f2SAndroid Build Coastguard Worker    "${one_value_args}"
201*890232f2SAndroid Build Coastguard Worker    "${multi_value_args}")
202*890232f2SAndroid Build Coastguard Worker
203*890232f2SAndroid Build Coastguard Worker  # Test if including from FindFlatBuffers
204*890232f2SAndroid Build Coastguard Worker  if(FLATBUFFERS_FLATC_EXECUTABLE)
205*890232f2SAndroid Build Coastguard Worker    set(FLATC_TARGET "")
206*890232f2SAndroid Build Coastguard Worker    set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})
207*890232f2SAndroid Build Coastguard Worker  else()
208*890232f2SAndroid Build Coastguard Worker    set(FLATC_TARGET flatc)
209*890232f2SAndroid Build Coastguard Worker    set(FLATC flatc)
210*890232f2SAndroid Build Coastguard Worker  endif()
211*890232f2SAndroid Build Coastguard Worker
212*890232f2SAndroid Build Coastguard Worker  set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
213*890232f2SAndroid Build Coastguard Worker
214*890232f2SAndroid Build Coastguard Worker  # Generate the include files parameters.
215*890232f2SAndroid Build Coastguard Worker  set(include_params "")
216*890232f2SAndroid Build Coastguard Worker  foreach (include_dir ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE})
217*890232f2SAndroid Build Coastguard Worker    set(include_params -I ${include_dir} ${include_params})
218*890232f2SAndroid Build Coastguard Worker  endforeach()
219*890232f2SAndroid Build Coastguard Worker
220*890232f2SAndroid Build Coastguard Worker  # Create a directory to place the generated code.
221*890232f2SAndroid Build Coastguard Worker  set(generated_target_dir "${CMAKE_CURRENT_BINARY_DIR}/${FLATBUFFERS_GENERATE_HEADERS_TARGET}")
222*890232f2SAndroid Build Coastguard Worker  set(generated_include_dir "${generated_target_dir}")
223*890232f2SAndroid Build Coastguard Worker  if (NOT ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX} STREQUAL "")
224*890232f2SAndroid Build Coastguard Worker    set(generated_include_dir "${generated_include_dir}/${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX}")
225*890232f2SAndroid Build Coastguard Worker    list(APPEND FLATBUFFERS_GENERATE_HEADERS_FLAGS
226*890232f2SAndroid Build Coastguard Worker         "--include-prefix" ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX})
227*890232f2SAndroid Build Coastguard Worker  endif()
228*890232f2SAndroid Build Coastguard Worker
229*890232f2SAndroid Build Coastguard Worker  # Create rules to generate the code for each schema.
230*890232f2SAndroid Build Coastguard Worker  foreach(schema ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
231*890232f2SAndroid Build Coastguard Worker    get_filename_component(filename ${schema} NAME_WE)
232*890232f2SAndroid Build Coastguard Worker    set(generated_include "${generated_include_dir}/${filename}_generated.h")
233*890232f2SAndroid Build Coastguard Worker
234*890232f2SAndroid Build Coastguard Worker    # Generate files for grpc if needed
235*890232f2SAndroid Build Coastguard Worker    set(generated_source_file)
236*890232f2SAndroid Build Coastguard Worker    if("${FLATBUFFERS_GENERATE_HEADERS_FLAGS}" MATCHES "--grpc")
237*890232f2SAndroid Build Coastguard Worker      # Check if schema file contain a rpc_service definition
238*890232f2SAndroid Build Coastguard Worker      file(STRINGS ${schema} has_grpc REGEX "rpc_service")
239*890232f2SAndroid Build Coastguard Worker      if(has_grpc)
240*890232f2SAndroid Build Coastguard Worker        list(APPEND generated_include "${generated_include_dir}/${filename}.grpc.fb.h")
241*890232f2SAndroid Build Coastguard Worker        set(generated_source_file "${generated_include_dir}/${filename}.grpc.fb.cc")
242*890232f2SAndroid Build Coastguard Worker      endif()
243*890232f2SAndroid Build Coastguard Worker    endif()
244*890232f2SAndroid Build Coastguard Worker
245*890232f2SAndroid Build Coastguard Worker    add_custom_command(
246*890232f2SAndroid Build Coastguard Worker      OUTPUT ${generated_include} ${generated_source_file}
247*890232f2SAndroid Build Coastguard Worker      COMMAND ${FLATC} ${FLATC_ARGS}
248*890232f2SAndroid Build Coastguard Worker      -o ${generated_include_dir}
249*890232f2SAndroid Build Coastguard Worker      ${include_params}
250*890232f2SAndroid Build Coastguard Worker      -c ${schema}
251*890232f2SAndroid Build Coastguard Worker      ${FLATBUFFERS_GENERATE_HEADERS_FLAGS}
252*890232f2SAndroid Build Coastguard Worker      DEPENDS ${FLATC_TARGET} ${schema}
253*890232f2SAndroid Build Coastguard Worker      WORKING_DIRECTORY "${working_dir}"
254*890232f2SAndroid Build Coastguard Worker      COMMENT "Building ${schema} flatbuffers...")
255*890232f2SAndroid Build Coastguard Worker    list(APPEND all_generated_header_files ${generated_include})
256*890232f2SAndroid Build Coastguard Worker    list(APPEND all_generated_source_files ${generated_source_file})
257*890232f2SAndroid Build Coastguard Worker
258*890232f2SAndroid Build Coastguard Worker    # Geneate the binary flatbuffers schemas if instructed to.
259*890232f2SAndroid Build Coastguard Worker    if (NOT ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR} STREQUAL "")
260*890232f2SAndroid Build Coastguard Worker      set(binary_schema
261*890232f2SAndroid Build Coastguard Worker          "${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}/${filename}.bfbs")
262*890232f2SAndroid Build Coastguard Worker      add_custom_command(
263*890232f2SAndroid Build Coastguard Worker        OUTPUT ${binary_schema}
264*890232f2SAndroid Build Coastguard Worker        COMMAND ${FLATC} -b --schema
265*890232f2SAndroid Build Coastguard Worker        -o ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}
266*890232f2SAndroid Build Coastguard Worker        ${include_params}
267*890232f2SAndroid Build Coastguard Worker        ${schema}
268*890232f2SAndroid Build Coastguard Worker        DEPENDS ${FLATC_TARGET} ${schema}
269*890232f2SAndroid Build Coastguard Worker        WORKING_DIRECTORY "${working_dir}")
270*890232f2SAndroid Build Coastguard Worker      list(APPEND all_generated_binary_files ${binary_schema})
271*890232f2SAndroid Build Coastguard Worker    endif()
272*890232f2SAndroid Build Coastguard Worker  endforeach()
273*890232f2SAndroid Build Coastguard Worker
274*890232f2SAndroid Build Coastguard Worker  # Set up interface library
275*890232f2SAndroid Build Coastguard Worker  add_library(${FLATBUFFERS_GENERATE_HEADERS_TARGET} INTERFACE)
276*890232f2SAndroid Build Coastguard Worker  target_sources(
277*890232f2SAndroid Build Coastguard Worker    ${FLATBUFFERS_GENERATE_HEADERS_TARGET}
278*890232f2SAndroid Build Coastguard Worker    INTERFACE
279*890232f2SAndroid Build Coastguard Worker      ${all_generated_header_files}
280*890232f2SAndroid Build Coastguard Worker      ${all_generated_binary_files}
281*890232f2SAndroid Build Coastguard Worker      ${all_generated_source_files}
282*890232f2SAndroid Build Coastguard Worker      ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
283*890232f2SAndroid Build Coastguard Worker  add_dependencies(
284*890232f2SAndroid Build Coastguard Worker    ${FLATBUFFERS_GENERATE_HEADERS_TARGET}
285*890232f2SAndroid Build Coastguard Worker    ${FLATC}
286*890232f2SAndroid Build Coastguard Worker    ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
287*890232f2SAndroid Build Coastguard Worker  target_include_directories(
288*890232f2SAndroid Build Coastguard Worker    ${FLATBUFFERS_GENERATE_HEADERS_TARGET}
289*890232f2SAndroid Build Coastguard Worker    INTERFACE ${generated_target_dir})
290*890232f2SAndroid Build Coastguard Worker
291*890232f2SAndroid Build Coastguard Worker  # Organize file layout for IDEs.
292*890232f2SAndroid Build Coastguard Worker  source_group(
293*890232f2SAndroid Build Coastguard Worker    TREE "${generated_target_dir}"
294*890232f2SAndroid Build Coastguard Worker    PREFIX "Flatbuffers/Generated/Headers Files"
295*890232f2SAndroid Build Coastguard Worker    FILES ${all_generated_header_files})
296*890232f2SAndroid Build Coastguard Worker  source_group(
297*890232f2SAndroid Build Coastguard Worker    TREE "${generated_target_dir}"
298*890232f2SAndroid Build Coastguard Worker    PREFIX "Flatbuffers/Generated/Source Files"
299*890232f2SAndroid Build Coastguard Worker    FILES ${all_generated_source_files})
300*890232f2SAndroid Build Coastguard Worker  source_group(
301*890232f2SAndroid Build Coastguard Worker    TREE ${working_dir}
302*890232f2SAndroid Build Coastguard Worker    PREFIX "Flatbuffers/Schemas"
303*890232f2SAndroid Build Coastguard Worker    FILES ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
304*890232f2SAndroid Build Coastguard Worker  if (NOT ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR} STREQUAL "")
305*890232f2SAndroid Build Coastguard Worker    source_group(
306*890232f2SAndroid Build Coastguard Worker      TREE "${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}"
307*890232f2SAndroid Build Coastguard Worker      PREFIX "Flatbuffers/Generated/Binary Schemas"
308*890232f2SAndroid Build Coastguard Worker      FILES ${all_generated_binary_files})
309*890232f2SAndroid Build Coastguard Worker  endif()
310*890232f2SAndroid Build Coastguard Workerendfunction()
311*890232f2SAndroid Build Coastguard Worker
312*890232f2SAndroid Build Coastguard Worker# Creates a target that can be linked against that generates flatbuffer binaries
313*890232f2SAndroid Build Coastguard Worker# from json files.
314*890232f2SAndroid Build Coastguard Worker#
315*890232f2SAndroid Build Coastguard Worker# This function takes a target name and a list of schemas and Json files. You
316*890232f2SAndroid Build Coastguard Worker# can also specify other flagc flags and options to change the behavior of the
317*890232f2SAndroid Build Coastguard Worker# flatc compiler.
318*890232f2SAndroid Build Coastguard Worker#
319*890232f2SAndroid Build Coastguard Worker# Adding this target to your executable ensurses that the flatbuffer binaries
320*890232f2SAndroid Build Coastguard Worker# are compiled before your executable is run.
321*890232f2SAndroid Build Coastguard Worker#
322*890232f2SAndroid Build Coastguard Worker# Arguments:
323*890232f2SAndroid Build Coastguard Worker#   TARGET: The name of the target to generate.
324*890232f2SAndroid Build Coastguard Worker#   JSON_FILES: The list of json files to compile to flatbuffers binaries.
325*890232f2SAndroid Build Coastguard Worker#   SCHEMA: The flatbuffers schema of the Json files to be compiled.
326*890232f2SAndroid Build Coastguard Worker#   INCLUDE: Optional. Search for includes in the specified paths. (Use this
327*890232f2SAndroid Build Coastguard Worker#       instead of "-I <path>" and the FLAGS option so that CMake is aware of
328*890232f2SAndroid Build Coastguard Worker#       the directories that need to be searched).
329*890232f2SAndroid Build Coastguard Worker#   OUTPUT_DIR: The directly where the generated flatbuffers binaries should be
330*890232f2SAndroid Build Coastguard Worker#       placed.
331*890232f2SAndroid Build Coastguard Worker#   FLAGS: Optional. A list of any additional flags that you would like to pass
332*890232f2SAndroid Build Coastguard Worker#       to flatc.
333*890232f2SAndroid Build Coastguard Worker#
334*890232f2SAndroid Build Coastguard Worker# Example:
335*890232f2SAndroid Build Coastguard Worker#
336*890232f2SAndroid Build Coastguard Worker#     flatbuffers_generate_binary_files(
337*890232f2SAndroid Build Coastguard Worker#         TARGET my_binary_data
338*890232f2SAndroid Build Coastguard Worker#         SCHEMA "${MY_SCHEMA_DIR}/my_example_schema.fbs"
339*890232f2SAndroid Build Coastguard Worker#         JSON_FILES ${MY_JSON_FILES}
340*890232f2SAndroid Build Coastguard Worker#         OUTPUT_DIR "${MY_BINARY_DATA_DIRECTORY}"
341*890232f2SAndroid Build Coastguard Worker#         FLAGS --strict-json)
342*890232f2SAndroid Build Coastguard Worker#
343*890232f2SAndroid Build Coastguard Worker#     target_link_libraries(MyExecutableTarget
344*890232f2SAndroid Build Coastguard Worker#         PRIVATE my_binary_data
345*890232f2SAndroid Build Coastguard Worker#     )
346*890232f2SAndroid Build Coastguard Workerfunction(flatbuffers_generate_binary_files)
347*890232f2SAndroid Build Coastguard Worker  # Parse function arguments.
348*890232f2SAndroid Build Coastguard Worker  set(options)
349*890232f2SAndroid Build Coastguard Worker  set(one_value_args
350*890232f2SAndroid Build Coastguard Worker    "TARGET"
351*890232f2SAndroid Build Coastguard Worker    "SCHEMA"
352*890232f2SAndroid Build Coastguard Worker    "OUTPUT_DIR")
353*890232f2SAndroid Build Coastguard Worker  set(multi_value_args
354*890232f2SAndroid Build Coastguard Worker    "JSON_FILES"
355*890232f2SAndroid Build Coastguard Worker    "INCLUDE"
356*890232f2SAndroid Build Coastguard Worker    "FLAGS")
357*890232f2SAndroid Build Coastguard Worker  cmake_parse_arguments(
358*890232f2SAndroid Build Coastguard Worker    PARSE_ARGV 0
359*890232f2SAndroid Build Coastguard Worker    FLATBUFFERS_GENERATE_BINARY_FILES
360*890232f2SAndroid Build Coastguard Worker    "${options}"
361*890232f2SAndroid Build Coastguard Worker    "${one_value_args}"
362*890232f2SAndroid Build Coastguard Worker    "${multi_value_args}")
363*890232f2SAndroid Build Coastguard Worker
364*890232f2SAndroid Build Coastguard Worker  # Test if including from FindFlatBuffers
365*890232f2SAndroid Build Coastguard Worker  if(FLATBUFFERS_FLATC_EXECUTABLE)
366*890232f2SAndroid Build Coastguard Worker    set(FLATC_TARGET "")
367*890232f2SAndroid Build Coastguard Worker    set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})
368*890232f2SAndroid Build Coastguard Worker  else()
369*890232f2SAndroid Build Coastguard Worker    set(FLATC_TARGET flatc)
370*890232f2SAndroid Build Coastguard Worker    set(FLATC flatc)
371*890232f2SAndroid Build Coastguard Worker  endif()
372*890232f2SAndroid Build Coastguard Worker
373*890232f2SAndroid Build Coastguard Worker  set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
374*890232f2SAndroid Build Coastguard Worker
375*890232f2SAndroid Build Coastguard Worker  # Generate the include files parameters.
376*890232f2SAndroid Build Coastguard Worker  set(include_params "")
377*890232f2SAndroid Build Coastguard Worker  foreach (include_dir ${FLATBUFFERS_GENERATE_BINARY_FILES_INCLUDE})
378*890232f2SAndroid Build Coastguard Worker    set(include_params -I ${include_dir} ${include_params})
379*890232f2SAndroid Build Coastguard Worker  endforeach()
380*890232f2SAndroid Build Coastguard Worker
381*890232f2SAndroid Build Coastguard Worker  # Create rules to generate the flatbuffers binary for each json file.
382*890232f2SAndroid Build Coastguard Worker  foreach(json_file ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES})
383*890232f2SAndroid Build Coastguard Worker    get_filename_component(filename ${json_file} NAME_WE)
384*890232f2SAndroid Build Coastguard Worker    set(generated_binary_file "${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}/${filename}.bin")
385*890232f2SAndroid Build Coastguard Worker    add_custom_command(
386*890232f2SAndroid Build Coastguard Worker      OUTPUT ${generated_binary_file}
387*890232f2SAndroid Build Coastguard Worker      COMMAND ${FLATC} ${FLATC_ARGS}
388*890232f2SAndroid Build Coastguard Worker      -o ${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}
389*890232f2SAndroid Build Coastguard Worker      ${include_params}
390*890232f2SAndroid Build Coastguard Worker      -b ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA} ${json_file}
391*890232f2SAndroid Build Coastguard Worker      ${FLATBUFFERS_GENERATE_BINARY_FILES_FLAGS}
392*890232f2SAndroid Build Coastguard Worker      DEPENDS ${FLATC_TARGET} ${json_file}
393*890232f2SAndroid Build Coastguard Worker      WORKING_DIRECTORY "${working_dir}"
394*890232f2SAndroid Build Coastguard Worker      COMMENT "Building ${json_file} binary flatbuffers...")
395*890232f2SAndroid Build Coastguard Worker      list(APPEND all_generated_binary_files ${generated_binary_file})
396*890232f2SAndroid Build Coastguard Worker  endforeach()
397*890232f2SAndroid Build Coastguard Worker
398*890232f2SAndroid Build Coastguard Worker  # Set up interface library
399*890232f2SAndroid Build Coastguard Worker  add_library(${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET} INTERFACE)
400*890232f2SAndroid Build Coastguard Worker  target_sources(
401*890232f2SAndroid Build Coastguard Worker    ${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET}
402*890232f2SAndroid Build Coastguard Worker    INTERFACE
403*890232f2SAndroid Build Coastguard Worker      ${all_generated_binary_files}
404*890232f2SAndroid Build Coastguard Worker      ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES}
405*890232f2SAndroid Build Coastguard Worker      ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA})
406*890232f2SAndroid Build Coastguard Worker  add_dependencies(
407*890232f2SAndroid Build Coastguard Worker    ${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET}
408*890232f2SAndroid Build Coastguard Worker    ${FLATC})
409*890232f2SAndroid Build Coastguard Worker
410*890232f2SAndroid Build Coastguard Worker  # Organize file layout for IDEs.
411*890232f2SAndroid Build Coastguard Worker  source_group(
412*890232f2SAndroid Build Coastguard Worker    TREE ${working_dir}
413*890232f2SAndroid Build Coastguard Worker    PREFIX "Flatbuffers/JSON Files"
414*890232f2SAndroid Build Coastguard Worker    FILES ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES})
415*890232f2SAndroid Build Coastguard Worker  source_group(
416*890232f2SAndroid Build Coastguard Worker    TREE ${working_dir}
417*890232f2SAndroid Build Coastguard Worker    PREFIX "Flatbuffers/Schemas"
418*890232f2SAndroid Build Coastguard Worker    FILES ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA})
419*890232f2SAndroid Build Coastguard Worker  source_group(
420*890232f2SAndroid Build Coastguard Worker    TREE ${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}
421*890232f2SAndroid Build Coastguard Worker    PREFIX "Flatbuffers/Generated/Binary Files"
422*890232f2SAndroid Build Coastguard Worker    FILES ${all_generated_binary_files})
423*890232f2SAndroid Build Coastguard Workerendfunction()
424