# Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/compiled_action.gni") declare_args() { # Location of flatbuffers source code. flatbuffers_source_location = "//third_party/flatbuffers/" # Absolute location flatbuffers BUILD.gn file. flatbuffers_build_location = "//build_extra/flatbuffers/" } # Compile a flatbuffer for C++. # # flatc_out_dir (optional) # Specifies the path suffix that output files are generated under. This # path will be appended to root_gen_dir. # # Targets that depend on the flatbuffer target will be able to include # the resulting FlatBuffers header with an include like: # #include "dir/for/my_flatbuffer/buffer_generated.h" # If undefined, this defaults to matchign the input directory for each # .fbs file (you should almost always use the default mode). # # flatc_include_dirs (optional) # Specifies the directories which FlatBuffers compiler uses to find # included .fbs files in. Almost always should be empty. # # The list always has an implicit first item corresponding to the root of # the source tree. This enables including .fbs files by absolute path. # # The compiler will try the directories in the order given, and if all # fail it will try to load relative to the directory of the schema file # being parsed. # # deps (optional) # Additional dependencies. # # Parameters for compiling the generated code: # # defines (optional) # Defines to supply to the source set that compiles the generated source # code. # # extra_configs (optional) # A list of config labels that will be appended to the configs applying # to the source set. # # testonly (optional) # Boolean to indicate whether the generated source sets should be labeled # as testonly. # # Example: # flatbuffer("mylib") { # sources = [ # "foo.fbs", # ] # } template("flatbuffer") { assert(defined(invoker.sources), "Need sources for flatbuffers_library") # Don't apply OS-specific sources filtering to the assignments later on. # Platform files should have gotten filtered out in the sources assignment # when this template was invoked. If they weren't, it was on purpose and # this template shouldn't re-apply the filter. set_sources_assignment_filter([]) action_name = "${target_name}_gen" source_set_name = target_name compiled_action_foreach(action_name) { visibility = [ ":$source_set_name" ] tool = "$flatbuffers_build_location:flatc" sources = invoker.sources deps = [] if (defined(invoker.flatc_out_dir)) { out_dir = "$root_gen_dir/" + invoker.flatc_out_dir } else { out_dir = "{{source_gen_dir}}" } outputs = [ "$out_dir/{{source_name_part}}_generated.h", ] args = [ "-c", "--keep-prefix", "-o", "$out_dir", "-I", rebase_path("//", root_build_dir), ] if (defined(invoker.flatc_include_dirs)) { foreach(include_dir, invoker.flatc_include_dirs) { args += [ "-I", rebase_path(include_dir, root_build_dir), ] } } args += [ "{{source}}" ] # The deps may have steps that have to run before running flatc. if (defined(invoker.deps)) { deps += invoker.deps } } source_set(target_name) { forward_variables_from(invoker, [ "visibility", "defines", ]) sources = get_target_outputs(":$action_name") if (defined(invoker.extra_configs)) { configs += invoker.extra_configs } if (defined(invoker.testonly)) { testonly = invoker.testonly } public_configs = [ "$flatbuffers_build_location:flatbuffers_config" ] public_deps = [ # The generated headers reference headers within FlatBuffers, so # dependencies must be able to find those headers too. flatbuffers_build_location, ] deps = [ ":$action_name", ] # This will link any libraries in the deps (the use of invoker.deps in the # action won't link it). if (defined(invoker.deps)) { deps += invoker.deps } # Same for public_deps. if (defined(invoker.public_deps)) { public_deps += invoker.public_deps } } } # Compile a flatbuffer to typescript. # # flatc_include_dirs (optional) # Specifies the directories which FlatBuffers compiler uses to find # included .fbs files in. Almost always should be empty. # # The list always has an implicit first item corresponding to the root of # the source tree. This enables including .fbs files by absolute path. # # The compiler will try the directories in the order given, and if all # fail it will try to load relative to the directory of the schema file # being parsed. # # deps (optional) # Additional dependencies. # # Example: # ts_flatbuffer("foo_ts") { # sources = [ # "foo.fbs", # ] # } template("ts_flatbuffer") { assert(defined(invoker.sources), "Need sources for flatbuffers_library") # Don't apply OS-specific sources filtering to the assignments later on. # Platform files should have gotten filtered out in the sources assignment # when this template was invoked. If they weren't, it was on purpose and # this template shouldn't re-apply the filter. set_sources_assignment_filter([]) copy_name = target_name + "_copy" copy(copy_name) { sources = [ "$flatbuffers_source_location/js/flatbuffers.js", ] outputs = [ "$target_gen_dir/flatbuffers.js", ] } compiled_action_foreach(target_name) { tool = "$flatbuffers_build_location:flatc" sources = invoker.sources deps = [ ":" + copy_name, ] out_dir = target_gen_dir outputs = [ "$out_dir/{{source_name_part}}_generated.ts", ] args = [ "--ts", "--no-fb-import", "--gen-mutable", "-o", rebase_path(out_dir, root_build_dir), "-I", rebase_path("//", root_build_dir), ] if (defined(invoker.flatc_include_dirs)) { foreach(include_dir, invoker.flatc_include_dirs) { args += [ "-I", rebase_path(include_dir, root_build_dir), ] } } args += [ "{{source}}" ] # The deps may have steps that have to run before running flatc. if (defined(invoker.deps)) { deps += invoker.deps } } }