| # 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/components.gni") |
| import("//build/dart/dart_component.gni") |
| import("//build/dart/dart_library.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'") |
| _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) { |
| forward_variables_from(invoker, [ "null_safe" ]) |
| 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" ] |
| } |
| } |
| } |