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