| # Copyright 2020 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/dart/dart_component.gni") | 
 | import("//build/dart/dart_library.gni") | 
 | import("//src/sys/build/components.gni") | 
 |  | 
 | # Defines a Dart application that can be run in the Dart content handler | 
 | # | 
 | # Parameters | 
 | # | 
 | #   meta (required) | 
 | #     A list of exactly one scope with the path to the cmx file associated with | 
 | #     the dart app. | 
 | # | 
 | #   fuchsia_package_name (optional) | 
 | #     Name of the Fuchsia package. | 
 | # | 
 | #   resources (optional) | 
 | #     Resources for the package (see //build/package.gni) | 
 | # | 
 | #   pubspec (optional) | 
 | #     Path to the pubspec file. Must be "pubspec.yaml". | 
 | # | 
 | #   analysis_options (optional) | 
 | #     Path to the analysis options file. Must be "analysis_options.yaml". | 
 | # | 
 | #   components (required) | 
 | #     [list of one scope] Defines the component in the package. Either main_dart | 
 | #     or components must be defined, but not both. | 
 | # | 
 | #     The entry in a scope in the resources list: | 
 | # | 
 | #       main_dart (required) | 
 | #         File containing the main function of the component. | 
 | # | 
 | #       component_name (required) | 
 | #         Name of the component. | 
 | # | 
 | #       component_type (optional) | 
 | #         Always "dart". | 
 | # | 
 | #       sources (optional) | 
 | #         Relative path of source files to be included in the dart package for | 
 | #         the component at $package_root/lib. | 
 | # | 
 | #       deps (optional) | 
 | #         List of Dart packages the application depends on. | 
 | # | 
 | #   main_dart (required) | 
 | #     Name of the Dart file containing the main function. Either main_dart or | 
 | #     components must be defined, but not both. | 
 | # | 
 | #   package_name (optional) | 
 | #     Name of the Dart package. Can only be defined if main_dart is defined. | 
 | # | 
 | #   sources (optional) | 
 | #     Can only be defined if main_dart is defined. | 
 | # | 
 | #   deps (optional) | 
 | #     List of Dart packages the application depends on. Can only be defined if | 
 | #     main_dart is defined. | 
 | template("dart_app") { | 
 |   assert(defined(invoker.meta), "Must define meta") | 
 |   _invoker_meta = invoker.meta | 
 |   assert(_invoker_meta != [] && _invoker_meta == [ _invoker_meta[0] ], | 
 |          "meta must have exactly 1 element!") | 
 |   _meta = _invoker_meta[0] | 
 |   assert(defined(_meta.path), "Must define meta[0].path") | 
 |   assert(!defined(invoker.pubspec) || invoker.pubspec == "pubspec.yaml", | 
 |          "pubspec must be 'pubspec.yaml'") | 
 |   assert(!defined(invoker.options_file) || | 
 |              invoker.options_file == "analysis_options.yaml", | 
 |          "options_file must be 'analysis_options.yaml'") | 
 |   _package_name = target_name | 
 |   if (defined(invoker.package_name)) { | 
 |     _package_name = invoker.package_name | 
 |   } | 
 |   _sources = [] | 
 |   _deps = [] | 
 |   _fuchsia_package_name = target_name | 
 |   if (defined(invoker.fuchsia_package_name)) { | 
 |     _fuchsia_package_name = invoker.fuchsia_package_name | 
 |   } | 
 |   if (defined(invoker.main_dart)) { | 
 |     assert(!defined(invoker.components), | 
 |            "either components or main_dart should be defined, but not both") | 
 |     _main_dart = invoker.main_dart | 
 |     if (defined(invoker.sources)) { | 
 |       _sources = invoker.sources | 
 |     } | 
 |     if (defined(invoker.deps)) { | 
 |       _deps = invoker.deps | 
 |     } | 
 |   } else { | 
 |     assert(defined(invoker.components), | 
 |            "either components or main_dart should be defined, but not both") | 
 |     assert(!defined(invoker.package_name), | 
 |            "package_name cannot be defined if components is defined") | 
 |     assert(!defined(invoker.sources), | 
 |            "sources cannot be defined if components is defined") | 
 |     assert(!defined(invoker.deps), | 
 |            "deps cannot be defined if components is defined") | 
 |     _components = invoker.components | 
 |     assert(_components == [ _components[0] ], | 
 |            "components should contain exactly one scope") | 
 |     _component = _components[0] | 
 |     assert(defined(_component.main_dart) && defined(_component.component_name), | 
 |            "components[0] should define main_dart and component_name") | 
 |     assert(!defined(_component.component_type) || | 
 |                _component.component_type == "dart", | 
 |            "components[0].component_type must be 'dart'") | 
 |     _main_dart = _component.main_dart | 
 |     if (defined(_component.component_name)) { | 
 |       _package_name = _component.component_name | 
 |     } | 
 |     if (defined(_component.sources)) { | 
 |       _sources = _component.sources | 
 |     } | 
 |     if (defined(_component.deps)) { | 
 |       _deps = _component.deps | 
 |     } | 
 |   } | 
 |   if (defined(invoker.source_dir)) { | 
 |     _source_dir = invoker.source_dir | 
 |   } else { | 
 |     _split_main_dart = string_split(_main_dart, "lib/") | 
 |     if (_split_main_dart[0] == "") { | 
 |       _main_dart = string_replace(_main_dart, "lib/", "", 1) | 
 |       _source_dir = "lib" | 
 |     } else { | 
 |       _source_dir = "." | 
 |     } | 
 |   } | 
 |  | 
 |   resource_gn_labels = [] | 
 |   if (defined(invoker.resources)) { | 
 |     i = 0 | 
 |     foreach(res, invoker.resources) { | 
 |       current_gn_label = target_name + "_resource_" + i | 
 |       resource(current_gn_label) { | 
 |         sources = [ res.path ] | 
 |         outputs = [ "data/" + res.dest ] | 
 |       } | 
 |       resource_gn_labels += [ ":$current_gn_label" ] | 
 |       i += 1 | 
 |     } | 
 |   } | 
 |  | 
 |   dart_library_gn_label = target_name + "_dart_library" | 
 |   dart_library(dart_library_gn_label) { | 
 |     package_name = _package_name | 
 |     sources = _sources | 
 |     source_dir = _source_dir | 
 |     deps = _deps + resource_gn_labels | 
 |   } | 
 |  | 
 |   dart_component_gn_label = target_name + "_dart_component" | 
 |   dart_component(dart_component_gn_label) { | 
 |     main_package = _package_name | 
 |     component_name = string_replace(_fuchsia_package_name, "_", "-") | 
 |     main_dart = _main_dart | 
 |     manifest = _meta.path | 
 |     deps = [ ":$dart_library_gn_label" ] | 
 |   } | 
 |  | 
 |   fuchsia_package_gn_label = string_replace(target_name, "_", "-") | 
 |   fuchsia_package(fuchsia_package_gn_label) { | 
 |     package_name = string_replace(_fuchsia_package_name, "_", "-") | 
 |     deps = [ | 
 |       ":$dart_component_gn_label", | 
 |       "//build/dart:deprecated_dart_app_allowlist", | 
 |     ] | 
 |   } | 
 |  | 
 |   # @TODO(fxb/62741): For purposes of soft transition. | 
 |   if (target_name != fuchsia_package_gn_label) { | 
 |     group(target_name) { | 
 |       deps = [ ":$fuchsia_package_gn_label" ] | 
 |     } | 
 |   } | 
 | } |