| # Copyright 2018 The Fuchsia 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") |
| import("//build/dart/dart_library.gni") |
| import("//build/fidl/toolchain.gni") |
| |
| # Declares a source_set that contains code generated by fidlmerge from a |
| # template and a FIDL JSON file. |
| # |
| # Parameters |
| # |
| # fidl_target (required) |
| # Specifies the fidl target from which to read fidl json. For example, |
| # "//sdk/fidl/fuchsia.sys" for fuchsia.sys. |
| # |
| # template_path (required) |
| # Specifies the template to use to generate the source code for the |
| # source_set. For example, "//src/lib/fostr/build/fostr.fidlmerge". |
| # |
| # generated_source_base (required) |
| # The base file name from which the source_set's 'source' file names are |
| # generated. For example, "formatting". |
| # |
| # options (optional) |
| # A single string with comma-separated key=value pairs. |
| # |
| # amendments_path (optional) |
| # Specifies a JSON file that contains amendments to be made to the fidl |
| # model before the template is applied. |
| # See the fidlmerge README for details. |
| # |
| # deps, public_deps, test_only, visibility (optional) |
| # These parameters are forwarded to the source_set. |
| # |
| |
| template("fidlmerge_dart") { |
| assert(defined(invoker.fidl_target), |
| "fidlmerge_dart requires parameter fidl_target.") |
| |
| assert(defined(invoker.template_path), |
| "fidlmerge_dart requires parameter template_path.") |
| |
| assert(defined(invoker.generated_source_base), |
| "fidlmerge_dart requires parameter generated_source_base.") |
| |
| fidl_target = invoker.fidl_target |
| template_path = invoker.template_path |
| source_base = invoker.generated_source_base |
| |
| generation_target_name = "${target_name}_generate" |
| |
| fidl_target_gen_dir = |
| get_label_info("$fidl_target($fidl_toolchain)", "target_gen_dir") |
| fidl_target_name = get_path_info(fidl_target_gen_dir, "file") |
| json_representation = "$fidl_target_gen_dir/$fidl_target_name.fidl.json" |
| |
| # Subtle: rebase dance, so that we allow paths up to and including the build |
| # dir to contain periods: |
| include_stem = |
| string_replace(rebase_path(target_gen_dir, root_build_dir), ".", "/") |
| file_stem = "$root_build_dir/$include_stem/$source_base" |
| |
| compiled_action(generation_target_name) { |
| forward_variables_from(invoker, [ "testonly" ]) |
| visibility = [ ":*" ] |
| |
| tool = "//tools/fidl/fidlmerge" |
| |
| inputs = [ |
| json_representation, |
| template_path, |
| ] |
| |
| outputs = [ "$file_stem.dart" ] |
| |
| args = [ |
| "--template", |
| rebase_path(template_path, root_build_dir), |
| "--json", |
| rebase_path(json_representation, root_build_dir), |
| "--output-base", |
| rebase_path(file_stem, root_build_dir), |
| ] |
| |
| if (defined(invoker.options)) { |
| args += [ |
| "--options", |
| invoker.options, |
| ] |
| } |
| |
| if (defined(invoker.amendments_path)) { |
| args += [ |
| "--amend", |
| rebase_path(invoker.amendments_path, root_build_dir), |
| ] |
| } |
| |
| deps = [ "$fidl_target($fidl_toolchain)" ] |
| |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| } |
| |
| copy_pubspec_target_name = "${target_name}_dart_pubspec" |
| copy_options_target_name = "${target_name}_dart_options" |
| copy_source_target_name = "${target_name}_dart_sources" |
| |
| library_name = target_name |
| root_dir = "$target_gen_dir/${library_name}_package" |
| |
| copy(copy_pubspec_target_name) { |
| sources = [ "//build/dart/empty_pubspec.yaml" ] |
| |
| outputs = [ "$root_dir/pubspec.yaml" ] |
| } |
| |
| copy(copy_source_target_name) { |
| sources = [ "$file_stem.dart" ] |
| outputs = [ "$root_dir/lib/$source_base.dart" ] |
| |
| deps = [ ":$generation_target_name" ] |
| } |
| |
| dart_library(library_name) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| package_root = root_dir |
| |
| package_name = "fidl_" + string_replace(library_name, ".", "_") |
| |
| sources = [ "$source_base.dart" ] |
| |
| deps = [ |
| ":$copy_pubspec_target_name", |
| ":$copy_source_target_name", |
| ":$generation_target_name", |
| ] |
| |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| if (defined(invoker.public_deps)) { |
| deps += invoker.public_deps |
| } |
| } |
| } |