| # 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.gni") |
| import("//build/dart/dart_library.gni") |
| import("//build/flutter/config.gni") |
| import("//build/flutter/internal/flutter_dart_component.gni") |
| |
| # Defines a Flutter component which can be used in a fuchsia package |
| # |
| # Flutter components require at least one library which contains a main |
| # entry point. The library should be defined using the dart_library.gni. |
| # |
| # ``` |
| # dart_library("lib") { |
| # package_name = "my_library" |
| # sources = [ "main.dart" ] |
| # deps = [ "//third_party/dart-pkg/git/flutter/packages/flutter" ] |
| # } |
| # ``` |
| # |
| # Once a library is defined a flutter component can be created which |
| # depends on this package. If the component needs any other resources they may |
| # be defined using the resource target and added to the components deps. |
| # |
| # ``` |
| # resource("text-file") { |
| # sources = [ "text_file.txt" ] |
| # outputs = [ "data/text_file.txt" ] |
| # } |
| # |
| # flutter_component("my-component") { |
| # manifest = "meta/my-component.cmx" |
| # main_package = "my_library" |
| # deps = [ |
| # ":lib", |
| # ":text-file", |
| # ] |
| # } |
| # ``` |
| # |
| # Once a component is defined it can be added as a dep of a fuchsia_package |
| # ``` |
| # fuchsia_package("my-package") { |
| # deps = [ |
| # ":my-component", |
| # ] |
| # } |
| # ``` |
| # |
| # Parameters |
| # |
| # manifest (required) |
| # The component manifest |
| # Type: path |
| # |
| # main_package (optional) |
| # The name of the package containing main_dart |
| # Type: string |
| # Default: component_name with dashes replaced by underscores, if defined. |
| # Otherwise, the target_name with dashes replaced by underscores will be |
| # used. |
| # |
| # component_name (optional) |
| # The name of the component. |
| # Type: string |
| # Default: target_name |
| # |
| # main_dart (optional) |
| # File containing the main function of the component. |
| # Type: string |
| # Default: main.dart |
| # |
| # package_root (optional) |
| # The root of the package generated for this component. Each component must |
| # have a unique package_root. For each component, there must be a |
| # pubspec.yaml and an analysis_options.yaml at the package root. |
| # Type: path |
| # Default: "." |
| # |
| # flutter_driver_extendable (optional) |
| # Determines if, in a debug build, this component will be built with a |
| # wrapper that auto-enables flutter driver extensions when running the |
| # component in a an environment that includes TestRunner. Does not |
| # affect AOT or release builds. |
| # Type: boolean |
| # Default: false |
| # |
| # build_cfg (optional) |
| # Specifies the parameters for building the component. |
| # See //build/flutter/flutter_build_config.gni for predefined configs. |
| # |
| # deps |
| # testonly |
| # visibility |
| template("flutter_component") { |
| assert(defined(invoker.manifest), "Must define manifest") |
| |
| _component_deps = [] |
| if (defined(invoker.deps)) { |
| _component_deps += invoker.deps |
| } |
| |
| if (defined(invoker.build_cfg)) { |
| _build_cfg = invoker.build_cfg |
| } else { |
| _build_cfg = flutter_default_build_cfg |
| } |
| |
| if (defined(invoker.main_package)) { |
| _main_package = invoker.main_package |
| } else if (defined(invoker.component_name)) { |
| _main_package = string_replace(invoker.component_name, "-", "_") |
| } else { |
| _main_package = string_replace(target_name, "-", "_") |
| } |
| |
| if (defined(invoker.main_dart)) { |
| _main_dart = invoker.main_dart |
| } else { |
| _main_dart = "main.dart" |
| } |
| |
| _flutter_driver_extendable = false |
| if (defined(invoker.flutter_driver_extendable)) { |
| _flutter_driver_extendable = invoker.flutter_driver_extendable |
| } |
| |
| if (_flutter_driver_extendable) { |
| # Need to generate package in the dart toolchain's target_gen_dir |
| _dart_target_gen_dir = |
| get_label_info(":bogus($dart_toolchain)", "target_gen_dir") |
| _generated_package_name = "${_main_package}_generated" |
| _generated_main = "generated_main.dart" |
| |
| _generated_package_root = "$_dart_target_gen_dir/${_generated_package_name}" |
| _generated_extension_wrapper = |
| "${_generated_package_root}/lib/${_generated_main}" |
| |
| #TODO: need to examine the dart language version of the provided main and |
| #match it in our generated code. |
| _generate_debug_wrapper_target_name = "${target_name}_gen_debug_wrapper" |
| action(_generate_debug_wrapper_target_name) { |
| script = "//build/flutter/gen_debug_wrapper_main.py" |
| args = [ |
| "--main-package=" + _main_package, |
| "--main=" + _main_dart, |
| "--out=" + rebase_path(_generated_extension_wrapper, root_build_dir), |
| ] |
| outputs = [ _generated_extension_wrapper ] |
| } |
| |
| _generated_dart_library_target_name = |
| "${_generated_package_name}_dart_library" |
| dart_library(_generated_dart_library_target_name) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| deps = [ |
| "//third_party/dart-pkg/git/flutter/packages/flutter", |
| "//third_party/dart-pkg/git/flutter/packages/flutter_driver", |
| ] + _component_deps |
| |
| package_root = _generated_package_root |
| |
| package_name = _generated_package_name |
| |
| sources = [ _generated_main ] |
| source_dir = "lib/" |
| |
| disable_analysis = true |
| if (defined(invoker.package_root)) { |
| _package_root = invoker.package_root |
| } else { |
| _package_root = "." |
| } |
| pubspec = rebase_path("pubspec.yaml", _package_root) |
| } |
| |
| # Depending on this target ensures that the package ends up in the |
| # package_config.json file |
| _component_deps += [ |
| ":$_generate_debug_wrapper_target_name($target_toolchain)", |
| ":$_generated_dart_library_target_name", |
| ] |
| |
| # The main_dart and main_packages become our new entry points. |
| _main_dart = _generated_main |
| _main_package = _generated_package_name |
| } |
| |
| # We need to specify the runner as a dependency to be bundled with the dill |
| # files generated by dart_kernel2. |
| # |
| # Since our current runners are prebuilts and |
| # //build/packages/prebuilt_package assumes "$root_out_dir/host_$host_cpu/pm" |
| # as the pm binary, we cannot the runner to the deps of the intermediate |
| # _flutter_driver_extendable dart_library because the resulting pm binary path |
| # would be //out/default/dartlang/host_x64/pm which doesn't exist. |
| _component_deps += [ _build_cfg.runner_dep ] |
| |
| flutter_dart_component(target_name) { |
| forward_variables_from(invoker, |
| "*", |
| [ |
| "build_cfg", |
| "deps", |
| "main_dart", |
| "main_package", |
| ]) |
| deps = _component_deps |
| |
| main_dart = _main_dart |
| main_package = _main_package |
| |
| generate_asset_manifest = true |
| |
| build_cfg = _build_cfg |
| } |
| } |