# 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/package.gni")
import("//build/tools/json_merge/json_merge.gni")
import("//peridot/build/module_manifest.gni")
import("//third_party/dart/build/dart/dart_action.gni")
import("//topaz/runtime/dart/config.gni")
import("//topaz/runtime/dart/dart_kernel.gni")

declare_args() {
  flutter_default_app = "flutter_jit_app"
}

declare_args() {
  # Controls whether dart_app() targets generate JIT or AOT Dart snapshots.
  # This defaults to JIT, use `fx set <ARCH> --args
  # 'dart_default_app="dart_aot_app"' to switch to AOT.
  dart_default_app = "dart_jit_app"
}

declare_args() {
  # When AOT compiling, an app will reference objects in the sharing basis's
  # snapshot when available instead of writing the objects in its own snapshot.
  # The snapshot of the sharing basis app will be included in every other app's
  # package and deduplicated by blobfs.
  if (flutter_default_app == "flutter_jit_app") {
    # Armadillo is not AOT compiled in debug builds
    flutter_aot_sharing_basis = ""
  } else {
    flutter_aot_sharing_basis = "//topaz/bin/user_shell/armadillo_user_shell"
  }

  # Enable profiling and tracing. Default is true in Debug builds and false
  # in release builds.
  if (is_debug) {
    flutter_profile = true
  } else {
    flutter_profile = false
  }

  # Whether experimental space dart mode is enabled for Flutter applications.
  flutter_space_dart = false
}

declare_args() {
  # When AOT compiling, an app will reference objects in the sharing basis's
  # snapshot when available instead of writing the objects in its own snapshot.
  # The snapshot of the sharing basis app will be included in every other app's
  # package and deduplicated by blobfs.
  if (dart_default_app == "dart_jit_app") {
    # module_suggester is not AOT compiled in debug builds
    dart_aot_sharing_basis = ""
  } else {
    dart_aot_sharing_basis =
        "//topaz/app/maxwell/agents/module_suggester_dart:module_suggester"
  }
}

# In product mode, we force all Flutter apps to use a specific runtime mode.
# Currently, we force them all to use JIT, but we might switch to DBC in the
# future.
flutter_product_app = "flutter_dart_jit_component"

flutter_base = "//third_party/dart-pkg/git/flutter"
flutter_tools_label =
    "$flutter_base/packages/flutter_tools:fuchsia_builder($host_toolchain)"
flutter_tools_out_dir = get_label_info(flutter_tools_label, "root_out_dir")
flutter_tools_bin = "$flutter_tools_out_dir/dart-tools/fuchsia_builder"

flutter_asset_tools_label = "$flutter_base/packages/flutter_tools:fuchsia_asset_builder($host_toolchain)"
flutter_asset_tools_out_dir =
    get_label_info(flutter_asset_tools_label, "root_out_dir")
flutter_asset_tools_bin =
    "$flutter_asset_tools_out_dir/dart-tools/fuchsia_asset_builder"

# In product mode, we force all Dart apps to use a specific runtime mode.
# Currently, we force them all to use JIT, but we might switch to DBC in the
# future.
dart_product_app = "flutter_dart_jit_component"

# Defines a Flutter and Dart package with JIT runtime components
#
# After Flutter and Dart JIT runtime components are calculated in
# flutter_dart_jit_component, put them all into one Fuchsia package.
#
# Parameters
#
#   components_with_kernel (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the components_with_kernel list:
#
#       kernel_target_name (required)
#         Name of the kernel target.
#
#       kernel_manifest (required)
#         Manifest file for the dart kernel.
#
#       deps (required)
#         Dependencies of this component.
#
#       sources (required)
#         Source files of this component.
#
#       component_resources (required)
#         Resources of this component.
#
#       component_copy_manifest (required)
#         Copy of the module manifest of this component.
#
#       component_verify_manifest (required)
#         Verify target of the module manifest of this component.
template("_flutter_dart_jit_package") {
  package(target_name) {
    forward_variables_from(invoker,
                       [
                         "testonly",
                         "tests",
                       ])
    package_name = invoker.pkg_name
    deps = invoker.cmx_deps
    extra = []
    public_deps = []

    foreach(component, invoker.components_with_kernel) {
      deps += [ ":${component.kernel_target_name}" ]
      deps += component.deps
      extra += [ component.kernel_manifest ]

      if (component.component_type == "flutter") {
        extra += [ component.asset_manifest ]

        # TODO(rmacnak): Remove core_jit_cheat_target.
        public_deps += [
          ":${component.kernel_target_name}",
        ]

        deps += [ ":${component.component_resources}" ]
        if (defined(invoker.module_manifest)) {
          deps += [
            ":${component.component_copy_manifest}",
            ":${component.component_verify_manifest}",
          ]
        }
      }
    }

    if (defined(invoker.non_dart_deps)) {
      deps += invoker.non_dart_deps
    }

    resources = []
    if (defined(invoker.resources)) {
      resources += invoker.resources
    }
    if (defined(invoker.invoker_resources)) {
      resources += invoker.invoker_resources
    }

    if (defined(invoker.interpreter) && invoker.interpreter) {
      resources += [
          {
            path = rebase_path("//topaz/runtime/dart/enable_interpreter")
            dest = "enable_interpreter"
          }
      ]
    }

    meta = invoker.cmx_filtered_meta

    # TODO(CP-140): Support module_manifest per component.
    if (defined(invoker.module_manifest)) {
      meta += [
        {
          path = rebase_path(invoker.module_manifest)
          dest = "module.json"
        },
      ]
    }
  }
}

template("_flutter_jit_asset_manifest") {
  action("${target_name}_resources") {
    script = "//topaz/runtime/flutter_runner/build/asset_package.py"

    args = [
      "--flutter-root",
      rebase_path(flutter_base),
      "--flutter-tools",
      rebase_path(flutter_asset_tools_bin),
      "--asset-dir",
      rebase_path("$target_gen_dir/build"),
      "--app-dir",
      rebase_path("."),
      "--packages",
      rebase_path(invoker.dot_packages),
      "--asset-manifest-out",
      rebase_path(invoker.asset_manifest),
      "--component-name",
      invoker.component_name,
    ]

    if (defined(invoker.manifest)) {
      args += [
        "--manifest",
        rebase_path(invoker.manifest),
      ]
    }

    deps = [
      ":${invoker.dart_library_target_name}",
      flutter_asset_tools_label,
    ]

    outputs = [
      invoker.asset_manifest,
    ]
  }
}

# Defines JIT runtime components to be further distributed in one package.
#
# Takes a set of flutter and dart components and puts them into one fuchsia
# package with the flutter_jit_runner as its runtime. Also supports legacy
# calls where the components parameter isn't specified, in which we will create
# one default component for the package.
#
# Parameters
#
#   components (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the resources list:
#
#       component_name (required)
#         Name of the component.
#
#       main_dart (required)
#         File containing the main function of the component.
#
#       dart_package_name (optional)
#         Name of the dart package for the component. If not provided, it will
#         be inferred from the component name.
#
#   main_dart (required)
#     File containing the main function of the application. Either main_dart or
#     components must be defined, but not both.
#
#   pkg_name (required)
#     Name of the fuchsia package these components shall reside in.
#
#   legacy_component (required)
#     True if this template is invoked with an inferred components field, for
#     legacy calls that assume just one component per fuchsia package.
#
#   package_name (optional)
#     Name of the Dart package. This is used as an identifier in code that
#     depends on the dart library that the *one and only* component generates.
#     Only compatible when legacy_component = true.
#
template("flutter_dart_jit_component") {
  pkg_name = invoker.pkg_name
  legacy_component = invoker.legacy_component
  components = []
  components += invoker.components

  if (defined(invoker.flutter_driver_extendable)) {
    flutter_driver_extendable = invoker.flutter_driver_extendable
  } else {
    flutter_driver_extendable = false
  }

  package_meta = []
  if (defined(invoker.meta)) {
    package_meta = invoker.meta
  }
  # Inject appropriate "runner" into Component manifests
  cmx_filtered_meta = []
  cmx_deps = []

  # Build the kernel for each of the components, and bundle them in the same
  # scope for later packaging.
  components_with_kernel = []
  foreach(component, components) {
    assert(defined(component.main_dart), "Must specify main_dart file")

    if (component.component_type == "flutter") {
      product = !flutter_profile
      if (defined(invoker.product)) {
        product = invoker.product
      }
      if (dart_force_product) {
        product = true
      }

      gen_bytecode = false
      interpreter = false
      if ((defined(invoker.space_dart) && invoker.space_dart) ||
          flutter_space_dart) {
        gen_bytecode = true
        interpreter = true
      }

      product_suffix = ""
      if (product) {
        product_suffix = "_product"
      }

      dbc = false
      runtime_meta = "//topaz/runtime/flutter_runner/meta/jit${product_suffix}_runtime"
    } else if (component.component_type == "dart") {
      product = !is_debug
      if (defined(invoker.product)) {
        product = invoker.product
      }

      if (dart_force_product) {
        product = true
      }

      product_suffix = ""
      if (product) {
        product_suffix = "_product"
      }

      dbc = false
      if (defined(invoker.dbc) && invoker.dbc) {
        dbc = true
      }
      runner_name = "jit"
      if (dbc) {
        runner_name = "dbc"
      }
      runtime_meta = "//topaz/runtime/dart_runner/meta/${runner_name}${product_suffix}_runtime"
    }

    # Look through the package meta for cmx file for this component, and merge
    # in the runner.
    foreach(item, package_meta) {
      dest = item.path
      if (defined(item.dest)) {
        dest = item.dest
      }
      if (get_path_info(dest, "file") == "${component.component_name}.cmx") {
        merged = "merged_" + get_path_info(dest, "file")
        json_merge(merged) {
          sources = [
            item.path,
            rebase_path(runtime_meta),
          ]
        }
        merged_outputs = []
        merged_outputs += get_target_outputs(":$merged")
        item.path = merged_outputs[0]
        cmx_deps += [ ":$merged" ]
        cmx_filtered_meta += [ item ]
      }
    }

    component_name = component.component_name
    # TODO(CP-142): Should be renamed to component_root
    package_root = component.package_root

    if (legacy_component) {
      kernel_name = target_name
    } else {
      kernel_name = component_name
    }
    kernel_target_name = kernel_name + "_kernel"
    kernel_manifest = "$target_gen_dir/${kernel_target_name}.dilpmanifest"

    if (component.component_type == "flutter") {
      dart_library_target_name = "${kernel_name}_dart_library"
      dart_target_gen_dir =
          get_label_info(":bogus($dart_toolchain)", "target_gen_dir")
      dot_packages = "$dart_target_gen_dir/$dart_library_target_name.packages"
    }

    if (flutter_driver_extendable) {
      generated_extension_wrapper = "$dart_target_gen_dir/${kernel_name}__extension_wrapper.dart"
      generated_extension_wrapper_main_dart = component.main_dart

      action("${kernel_name}_extensions_wrapper") {
        script = "//topaz/runtime/flutter_runner/build/gen_debug_wrapper_main.py"
        args = [
          "--main-dart=" + rebase_path(generated_extension_wrapper_main_dart, dart_target_gen_dir),
          "--out=" + rebase_path(generated_extension_wrapper),
        ]

        outputs = [
          generated_extension_wrapper,
        ]
      }
    }

    dart_kernel(kernel_name) {
      if (component.component_type == "flutter") {
        platform_name = "flutter_runner"
        platform_deps =
            [ "//topaz/runtime/flutter_runner/kernel:kernel_platform_files" ]
        platform_path = "$root_out_dir/flutter_runner_patched_sdk"
      } else if (component.component_type == "dart") {
        platform_name = "dart_runner"
        platform_deps =
            [ "//topaz/runtime/dart_runner/kernel:kernel_platform_files" ]
        platform_path = "$root_out_dir/dart_runner_patched_sdk"
      }

      # TODO(CP-140): These variables should be from the component
      forward_variables_from(invoker,
                             [
                               "disable_analysis",
                               "gen_bytecode",
                               "source_dir",
                             ])
      deps = component.deps
      sources = component.sources
      if (defined(component.dart_package_name)) {
        package_name = component.dart_package_name
      } else if (defined(invoker.package_name)) {
        package_name = invoker.package_name
      }

      if (flutter_driver_extendable) {
        main_dart = generated_extension_wrapper
      } else {
        main_dart = component.main_dart
      }
      manifest = kernel_manifest
      args = [
        "--component-name",
        component_name,
      ]

      # TODO(CP-140): Should be forwarded from the component.
      non_dart_deps = []
      if (defined(invoker.non_dart_deps)) {
        non_dart_deps = invoker.non_dart_deps
      }

      if (flutter_driver_extendable) {
        deps += [
          "//garnet/public/fidl/fuchsia.testing.runner",
          "//peridot/public/fidl/fuchsia.modular",
          "//third_party/dart-pkg/git/flutter/packages/flutter_driver",
          "//topaz/public/lib/app/dart",
          "//topaz/public/lib/module/dart",
        ]

        non_dart_deps += [
          ":${kernel_name}_extensions_wrapper($target_toolchain)",
        ]
      }

      if (dbc) {
        args += [
          "--gen-bytecode",
          "--drop-ast",
        ]
      }
    }

    if (component.component_type == "flutter") {
      asset_manifest = "$target_gen_dir/build/${kernel_name}_pkgassets"

      _flutter_jit_asset_manifest(kernel_name) {
        forward_variables_from(invoker, [
            "manifest",
            "component_name",
            "asset_manifest",
            "dart_library_target_name",
            "dot_packages"
        ])
      }

      # The module manifest verify & copy targets.
      if (defined(invoker.module_manifest)) {
        verify_module_manifest("${kernel_name}_verify_manifest") {
          original_target_name = kernel_name
          module_manifest = invoker.module_manifest
        }
        copy_module_manifest("${kernel_name}_copy_manifest") {
          package_name = kernel_name
          module_manifest = rebase_path(invoker.module_manifest)
        }
      }

      components_with_kernel += [
        {
          component_type = component.component_type
          kernel_target_name = kernel_target_name
          kernel_manifest = kernel_manifest
          asset_manifest = asset_manifest
          deps = component.deps
          sources = component.sources
          component_resources = "${kernel_name}_resources"
          component_copy_manifest = "${kernel_name}_copy_manifest"
          component_verify_manifest = "${kernel_name}_verify_manifest"
        }
      ]
    } else if (component.component_type == "dart") {
      components_with_kernel += [
        {
          component_type = component.component_type
          kernel_target_name = kernel_target_name
          kernel_manifest = kernel_manifest
          deps = component.deps
          sources = component.sources
        }
      ]
    }
  }

  invoker_resources = []
  if (defined(invoker.resources)) {
    invoker_resources += invoker.resources
  }

  found_cmx = false
  foreach(item, package_meta) {
    dest = item.path
    if (defined(item.dest)) {
      dest = item.dest
    }
    if (get_path_info(dest, "extension") == "cmx") {
      found_cmx = true
    } else {
      cmx_filtered_meta += [ item ]
    }
  }

  if (!found_cmx) {
    # No cmx to inject to. Inject the runner aspect as a dangling deprecated_runtime.
    # CP-129: deprecate cmx-less components, then delete this.
    cmx_filtered_meta += [
      {
        path = rebase_path(runtime_meta)
        dest = "deprecated_runtime"
      },
    ]
  }

  # We have all components and their kernels generated now. We call package() to
  # put everything into a fuchsia package, merging deps, extra, meta etc.
  _flutter_dart_jit_package(target_name) {
    forward_variables_from(invoker, "*")
  }
}

# Defines a Flutter and Dart package with AOT runtime components
#
# After Flutter and Dart AOT runtime components are calculated in
# flutter_dart_aot_component, put them all into one Fuchsia package.
#
# Parameters
#
#   components_with_kernel (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the components_with_kernel list:
#
#       kernel_target_name (required)
#         Name of the kernel target.
#
#       kernel_manifest (required)
#         Manifest file for the dart kernel.
#
#       deps (required)
#         Dependencies of this component.
#
#       sources (required)
#         Source files of this component.
#
#       component_resources (required)
#         Resources of this component.
#
#       component_copy_manifest (required)
#         Copy of the module manifest of this component.
#
#       component_verify_manifest (required)
#         Verify target of the module manifest of this component.
template("_flutter_dart_aot_package") {
  package(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "tests",
                           ])

    package_name = invoker.pkg_name
    non_dart_deps = []
    if (defined(invoker.non_dart_deps)) {
      non_dart_deps = invoker.non_dart_deps
    }
    deps = non_dart_deps + invoker.cmx_deps
    extra = []
    resources = []

    foreach(component, invoker.components_with_kernel) {
      deps += [
             ":${component.snapshot_target_name}",
             ":${component.stats_target_name}",
           ] + component.component_shared_snapshot_deps + component.deps

      if (component.component_type == "flutter") {
        extra += [ component.asset_manifest ]
        deps += [ ":${component.component_resources}", ]
        if (defined(invoker.module_manifest)) {
          deps += [
            ":${component.component_copy_manifest}",
            ":${component.component_verify_manifest}",
          ]
        }
      }

      resources_path = "${component.component_name}/"
      resources += [
        {
          path = rebase_path(component.snapshot_data_path)
          dest = "${resources_path}isolate_snapshot_data.bin"
        },
        {
          path = rebase_path(component.snapshot_instructions_path)
          dest = "${resources_path}isolate_snapshot_instructions.bin"
        },
        {
          path = rebase_path(component.shared_snapshot_data_path)
          dest = "${resources_path}shared_snapshot_data.bin"
        },
        {
          path = rebase_path(component.shared_snapshot_instructions_path)
          dest = "${resources_path}shared_snapshot_instructions.bin"
        },
      ]
      if (component.component_type == "flutter") {
        resources += [
          {
            path = rebase_path(component.vm_snapshot_data_path)
            dest = "${resources_path}vm_snapshot_data.bin"
          },
          {
            path = rebase_path(component.vm_snapshot_instructions_path)
            dest = "${resources_path}vm_snapshot_instructions.bin"
          },
        ]
      }

    }

    if (defined(invoker.invoker_resources)) {
      resources += invoker.invoker_resources
    }
    if (defined(invoker.resources)) {
      resources += invoker.resources
    }

    meta = invoker.cmx_filtered_meta

    # TODO(CP-140): Support module_manifest per component.
    if (defined(invoker.module_manifest)) {
      meta += [
        {
          path = rebase_path(invoker.module_manifest)
          dest = "module.json"
        },
      ]
    }
  }
}

# Defines AOT runtime components to be further distributed in one package.
#
# Takes a set of flutter and dart components and puts them into one fuchsia
# package with the flutter_aot_runner as its runtime. Also supports legacy
# calls where the components parameter isn't specified, in which we will create
# one default component for the package.
#
# Parameters
#
#   components (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the resources list:
#
#       component_name (required)
#         Name of the component.
#
#       main_dart (required)
#         File containing the main function of the component.
#
#       dart_package_name (optional)
#         Name of the dart package for the component. If not provided, it will
#         be inferred from the component name.
#
#   main_dart (required)
#     File containing the main function of the application. Either main_dart or
#     components must be defined, but not both.
#
#   pkg_name (required)
#     Name of the fuchsia package these components shall reside in.
#
#   legacy_component (required)
#     True if this template is invoked with an inferred components field, for
#     legacy calls that assume just one component per fuchsia package.
#
#   package_name (optional)
#     Name of the Dart package. This is used as an identifier in code that
#     depends on the dart library that the *one and only* component generates.
#     Only compatible when legacy_component = true.
#
template("flutter_dart_aot_component") {
  pkg_name = invoker.pkg_name
  legacy_component = invoker.legacy_component
  components = []
  components += invoker.components

  package_meta = []
  if (defined(invoker.meta)) {
    package_meta = invoker.meta
  }
  # Inject appropriate "runner" into Component manifests
  cmx_filtered_meta = []
  cmx_deps = []

  # Build the kernel for each of the components, and bundle them in the same
  # scope for later packaging.
  components_with_kernel = []
  foreach(component, components) {
    assert(defined(component.main_dart), "Must specify main_dart file")

    if (component.component_type == "flutter") {
      product = !flutter_profile

    } else if (component.component_type == "dart") {
      product = !is_debug
    }

    if (defined(invoker.product)) {
      product = invoker.product
    }
    if (dart_force_product) {
      product = true
    }
    product_suffix = ""
    if (product) {
      product_suffix = "_product"
    }

    if (component.component_type == "flutter") {
      runtime_meta =
          "//topaz/runtime/flutter_runner/meta/aot${product_suffix}_runtime"
    } else if (component.component_type == "dart") {
      runtime_meta =
          "//topaz/runtime/dart_runner/meta/aot${product_suffix}_runtime"
    }

    # Look through the package meta for cmx file for this component, and merge
    # in the runner.
    foreach(item, package_meta) {
      dest = item.path
      if (defined(item.dest)) {
        dest = item.dest
      }
      if (get_path_info(dest, "file") == "${component.component_name}.cmx") {
        merged = "merged_" + get_path_info(dest, "file")
        json_merge(merged) {
          sources = [
            item.path,
            rebase_path(runtime_meta),
          ]
        }
        merged_outputs = []
        merged_outputs += get_target_outputs(":$merged")
        item.path = merged_outputs[0]
        cmx_deps += [ ":$merged" ]
        cmx_filtered_meta += [ item ]
      }
    }

    component_name = component.component_name
    # TODO(CP-142): Should be renamed to component_root
    package_root = component.package_root

    if (legacy_component) {
      kernel_name = target_name
    } else {
      kernel_name = component_name
    }
    kernel_target_name = kernel_name + "_kernel"
    kernel_path = "$target_gen_dir/${kernel_target_name}.dil"

    if (component.component_type == "flutter") {
      dart_library_target_name = "${kernel_name}_dart_library"
    }

    dart_kernel(kernel_name) {
      if (component.component_type == "flutter") {
        platform_name = "flutter_runner"
        platform_deps =
            [ "//topaz/runtime/flutter_runner/kernel:kernel_platform_files" ]
        platform_path = "$root_out_dir/flutter_runner_patched_sdk"
      } else if (component.component_type == "dart") {
        platform_name = "dart_runner"
        platform_deps =
            [ "//topaz/runtime/dart_runner/kernel:kernel_platform_files" ]
        platform_path = "$root_out_dir/dart_runner_patched_sdk"
      }

      # TODO(CP-140): These variables should be from the component
      forward_variables_from(invoker,
                             [
                               "disable_analysis",
                               "non_dart_deps",
                               "source_dir",
                             ])
      deps = component.deps
      sources = component.sources
      if (defined(component.dart_package_name)) {
        package_name = component.dart_package_name
      } else if (defined(invoker.package_name)) {
        package_name = invoker.package_name
      }

      main_dart = component.main_dart
      args = [ "--aot", "--tfa" ]
    }


    # TODO(rmacnak): VM snapshot is ignored. Allow skipping its generation.
    vm_snapshot_data_path = "$target_gen_dir/${kernel_name}_vm_data.aotsnapshot"
    vm_snapshot_instructions_path =
        "$target_gen_dir/${kernel_name}_vm_instructions.aotsnapshot"
    snapshot_data_path = "$target_gen_dir/${kernel_name}_data.aotsnapshot"
    snapshot_instructions_path =
        "$target_gen_dir/${kernel_name}_instructions.aotsnapshot"
    snapshot_target_name = kernel_name + "_snapshot"

    if (component.component_type == "flutter" &&
        flutter_aot_sharing_basis != "" &&
        get_label_info(":$kernel_name", "label_no_toolchain") !=
        get_label_info(flutter_aot_sharing_basis, "label_no_toolchain")) {
      # Note: The use of "label_no_toolchain" is to ensure we are comparing
      # fully qualified target names. We don't actually care about the
      # toolchain.
      shared_snapshot_deps = []
      shared_snapshot_deps =
          [ get_label_info(flutter_aot_sharing_basis, "label_no_toolchain") +
            "_snapshot" ]
      prefix = get_label_info(flutter_aot_sharing_basis, "target_gen_dir") +
          "/" + get_label_info(flutter_aot_sharing_basis, "name")
      shared_snapshot_data_path = "${prefix}_data.aotsnapshot"
      shared_snapshot_instructions_path = "${prefix}_instructions.aotsnapshot"
    } else if (component.component_type == "dart" &&
        dart_aot_sharing_basis != "" &&
        get_label_info(":$kernel_name", "label_no_toolchain") !=
        get_label_info(dart_aot_sharing_basis, "label_no_toolchain")) {
      # Note: The use of "label_no_toolchain" is to ensure we are comparing
      # fully qualified target names. We don't actually care about the
      # toolchain.
      shared_snapshot_deps = []
      shared_snapshot_deps =
          [ get_label_info(dart_aot_sharing_basis, "label_no_toolchain") +
            "_snapshot" ]
      prefix = get_label_info(dart_aot_sharing_basis, "target_gen_dir") + "/" +
               get_label_info(dart_aot_sharing_basis, "name")
      shared_snapshot_data_path = "${prefix}_data.aotsnapshot"
      shared_snapshot_instructions_path = "${prefix}_instructions.aotsnapshot"
    } else {
      shared_snapshot_deps = []
      shared_snapshot_data_path = "//topaz/runtime/dart_runner/empty"
      shared_snapshot_instructions_path = "//topaz/runtime/dart_runner/empty"
    }

    stats_target_name = "${kernel_name}_stats"
    stats_json_path = "$target_gen_dir/${kernel_name}/stats/symbol_sizes.json"
    stats_html_dir = "$target_gen_dir/${kernel_name}/stats"

    action(snapshot_target_name) {
      if (defined(invoker.testonly)) {
        testonly = invoker.testonly
      }

      deps = gen_snapshot_deps +
          shared_snapshot_deps +
          [ ":$kernel_target_name" ]
      inputs = [
                 shared_snapshot_data_path,
                 shared_snapshot_instructions_path,
                 kernel_path,
               ]
      outputs = [
        vm_snapshot_data_path,
        vm_snapshot_instructions_path,
        snapshot_data_path,
        snapshot_instructions_path,
        stats_json_path,
      ]

      if (product) {
        script = gen_snapshot_product
      } else {
        script = gen_snapshot
      }

      args = [
        "--deterministic",
        "--snapshot_kind=app-aot-blobs",
        "--vm_snapshot_data=" + rebase_path(vm_snapshot_data_path),
        "--vm_snapshot_instructions=" +
            rebase_path(vm_snapshot_instructions_path),
        "--isolate_snapshot_data=" + rebase_path(snapshot_data_path),
        "--isolate_snapshot_instructions=" +
            rebase_path(snapshot_instructions_path),
        "--shared_data=" + rebase_path(shared_snapshot_data_path),
        "--shared_instructions=" +
            rebase_path(shared_snapshot_instructions_path),
        "--print-instructions-sizes-to=" + rebase_path(stats_json_path),
      ]
      if (is_debug && !product) {
        args += [ "--enable_asserts" ]
      }
      args += [ rebase_path(kernel_path) ]

      pool = "//build/dart:dart_pool($dart_toolchain)"
    }

    dart_action(stats_target_name) {
      if (defined(invoker.testonly)) {
        testonly = invoker.testonly
      }

      deps = [
        ":$snapshot_target_name",
      ]
      script = "//third_party/dart/pkg/vm/bin/run_binary_size_analysis.dart"
      inputs = [
        stats_json_path,
      ]
      outputs = [
        "$stats_html_dir/index.html",
      ]
      args = [
        rebase_path(stats_json_path),
        rebase_path(stats_html_dir),
      ]
    }

    if (component.component_type == "flutter") {
      asset_manifest = "$target_gen_dir/build/${kernel_name}_pkgassets"
      dart_target_gen_dir =
          get_label_info(":bogus($dart_toolchain)", "target_gen_dir")
      dot_packages = "$dart_target_gen_dir/$dart_library_target_name.packages"

      action("${kernel_name}_resources") {
        script = "//topaz/runtime/flutter_runner/build/asset_package.py"

        args = [
          "--flutter-root",
          rebase_path(flutter_base),
          "--flutter-tools",
          rebase_path(flutter_asset_tools_bin),
          "--app-dir",
          rebase_path("."),
          "--asset-dir",
          rebase_path("$target_gen_dir/build"),
          "--packages",
          rebase_path(dot_packages),
          "--asset-manifest-out",
          rebase_path(asset_manifest),
          "--component-name",
          component_name,
        ]

        if (defined(invoker.manifest)) {
          args += [
            "--manifest",
            rebase_path(invoker.manifest),
          ]
        }

        deps = [
          ":$dart_library_target_name",
          flutter_asset_tools_label,
        ]

        outputs = [
          asset_manifest,
        ]
      }

      # The module manifest verify & copy targets.
      if (defined(invoker.module_manifest)) {
        verify_module_manifest("${kernel_name}_verify_manifest") {
          original_target_name = kernel_name
          module_manifest = invoker.module_manifest
        }
        copy_module_manifest("${kernel_name}_copy_manifest") {
          package_name = kernel_name
          module_manifest = rebase_path(invoker.module_manifest)
        }
      }

      components_with_kernel += [
        {
          component_type = component.component_type
          kernel_target_name = kernel_target_name
          component_name = component_name
          asset_manifest = asset_manifest

          snapshot_target_name = snapshot_target_name
          stats_target_name = stats_target_name
          vm_snapshot_data_path = vm_snapshot_data_path
          vm_snapshot_instructions_path = vm_snapshot_instructions_path
          snapshot_data_path = snapshot_data_path
          snapshot_instructions_path = snapshot_instructions_path
          shared_snapshot_data_path = shared_snapshot_data_path
          shared_snapshot_instructions_path = shared_snapshot_instructions_path

          component_shared_snapshot_deps = shared_snapshot_deps
          deps = component.deps
          sources = component.sources
          component_resources = "${kernel_name}_resources"
          component_copy_manifest = "${kernel_name}_copy_manifest"
          component_verify_manifest = "${kernel_name}_verify_manifest"
        }
      ]
    } else if (component.component_type == "dart") {
      components_with_kernel += [
        {
          component_type = component.component_type
          kernel_target_name = kernel_target_name
          component_name = component_name

          snapshot_target_name = snapshot_target_name
          stats_target_name = stats_target_name
          snapshot_data_path = snapshot_data_path
          snapshot_instructions_path = snapshot_instructions_path
          shared_snapshot_data_path = shared_snapshot_data_path
          shared_snapshot_instructions_path = shared_snapshot_instructions_path

          component_shared_snapshot_deps = shared_snapshot_deps
          deps = component.deps
          sources = component.sources
        }
      ]
    }
  }

  if (defined(invoker.resources)) {
    invoker_resources = invoker.resources
  } else {
    invoker_resources = []
  }

  found_cmx = false
  foreach(item, package_meta) {
    dest = item.path
    if (defined(item.dest)) {
      dest = item.dest
    }
    if (get_path_info(dest, "extension") == "cmx") {
      found_cmx = true
    } else {
      cmx_filtered_meta += [ item ]
    }
  }

  if (!found_cmx) {
    # No cmx to inject to. Inject the runner aspect as a dangling
    # deprecated_runtime.
    # CP-129: deprecate cmx-less components, then delete this.
    cmx_filtered_meta += [
      {
        path = rebase_path(runtime_meta)
        dest = "deprecated_runtime"
      },
    ]
  }

  # We have all components and their kernels generated now. We call package() to
  # put everything into a fuchsia package, merging deps, extra, meta etc.
  _flutter_dart_aot_package(target_name) {
    forward_variables_from(invoker, "*")
  }
}
