# Copyright 2017 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_library.gni")
import("//build/dart/toolchain.gni")

# Defines a Dart application that can be run on the host
#
# Parameters
#
#   sources (optional)
#     The list of public sources in this library, i.e. Dart files in lib/ but
#     not in lib/src/. These sources must be within lib/.
#
#   package_name (optional)
#     Name of the dart package.
#
#   main_dart (required)
#     File containing the main function of the application.
#
#   deps (optional)
#     Dependencies of this application
#
#   non_dart_deps (optional)
#     List of labels this package depends on that are not Dart packages. It
#     typically doesn't need to be set.
#
#   output_name (optional)
#     Name of the output file to generate. Defaults to $target_name.
#
#   disable_analysis (optional)
#     Prevents analysis from being run on this target.
#
#   force_prebuilt_dart (optional)
#     Forces using the prebuilt Dart binary even when use_prebuilt_dart_sdk is
#     false. Defaults to true in a cross-build, and false otherwise.
template("dart_tool") {
  assert(defined(invoker.main_dart), "Must specify main_dart file")

  dart_library_target_name = target_name + "_dart_library"

  if (defined(invoker.package_name)) {
    package_name = invoker.package_name
  } else if (!defined(invoker.infer_package_name) ||
             invoker.infer_package_name) {
    # Compute a package name from the label:
    #   //foo/bar --> foo.bar
    #   //foo/bar:blah --> foo.bar._blah
    #   //garnet/public/foo/bar --> foo.bar
    # Strip public directories.
    full_dir = get_label_info(":$dart_library_target_name", "dir")
    foreach(sdk_dir, sdk_dirs) {
      full_dir = string_replace(full_dir, "$sdk_dir/", "")
    }
    package_name = full_dir
    package_name = string_replace(package_name, "//", "")
    package_name = string_replace(package_name, "/", ".")

    # If the last directory name does not match the target name, add the
    # target name to the resulting package name.
    name = get_label_info(":$dart_library_target_name", "name")
    last_dir = get_path_info(full_dir, "name")
    if (last_dir != name) {
      package_name = "$package_name._$name"
    }
  } else {
    assert(false, "Must specify either a package_name or infer_package_name")
  }

  package_root = "."
  if (defined(invoker.package_root)) {
    package_root = invoker.package_root
  }

  source_dir = "$package_root/lib"
  if (defined(invoker.source_dir)) {
    source_dir = "$package_root/${invoker.source_dir}"
  }

  dart_library(dart_library_target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "disable_analysis",
                           ])
    package_name = package_name
    package_root = package_root
    source_dir = source_dir

    sources = []
    if (defined(invoker.sources)) {
      sources += invoker.sources
    }
    source_base = "lib"
    if (defined(invoker.source_dir)) {
      source_base = invoker.source_dir
    }
    sources += [ rebase_path(invoker.main_dart, source_base) ]
  }

  # Avoid using a custom-built Dart VM in a cross-build. The Dart VM would run
  # the Dart code and front-end in a simulator, and it would be prohibitively
  # slow.
  force_prebuilt_dart = host_cpu != target_cpu
  if (defined(invoker.force_prebuilt_dart)) {
    force_prebuilt_dart = invoker.force_prebuilt_dart
  }
  if (force_prebuilt_dart) {
    dart_binary = prebuilt_dart
    sdk_deps = []
  } else {
    dart_binary = "$dart_sdk/bin/dart"
    sdk_deps = dart_sdk_deps
  }

  snapshot_path = "$target_gen_dir/${target_name}.snapshot"
  depfile_path = "${snapshot_path}.d"
  dart_target_gen_dir =
      get_label_info(":bogus($dart_toolchain)", "target_gen_dir")
  packages_path = "$dart_target_gen_dir/$dart_library_target_name.packages"

  snapshot_target_name = target_name + "_snapshot"

  # Creates a snapshot file.
  # The main advantage of snapshotting is that it sets up source dependencies
  # via a depfile so that a Dart app gets properly rebuilt when one of its
  # sources is modified.
  action(snapshot_target_name) {
    if (defined(invoker.testonly)) {
      testonly = invoker.testonly
    }

    depfile = depfile_path

    outputs = [
      snapshot_path,
    ]

    script = dart_binary

    # The snapshot path needs to be rebased on top of the root build dir so
    # that the resulting depfile gets properly formatted.
    rebased_snapshot_path = rebase_path(snapshot_path, root_build_dir)
    rebased_depfile_path = rebase_path(depfile_path)
    rebased_packages_path = rebase_path(packages_path)

    main_uri = rebase_path(invoker.main_dart)
    package_relative = rebase_path(invoker.main_dart, source_dir)
    # Approximation for source_dir contains main_dart.
    if (get_path_info(get_path_info(package_relative, "dir"), "file") != "bin") {
      main_uri = "package:" + package_name + "/" + package_relative
    }

    args = [
      "--snapshot=$rebased_snapshot_path",
      "--snapshot-depfile=$rebased_depfile_path",
      "--packages=$rebased_packages_path",
      main_uri,
    ]

    deps = sdk_deps + [ ":$dart_library_target_name" ]
  }

  if (defined(invoker.output_name)) {
    app_name = invoker.output_name
  } else {
    app_name = target_name
  }

  # Builds a convenience script to invoke the app.
  action(target_name) {
    script = "//build/dart/gen_app_invocation.py"

    app_path = "$root_out_dir/dart-tools/$app_name"

    inputs = [
      dart_binary,
      snapshot_path,
    ]
    outputs = [
      app_path,
    ]

    args = [
      "--out",
      rebase_path(app_path),
      "--dart",
      rebase_path(dart_binary),
      "--snapshot",
      rebase_path(snapshot_path),
    ]

    deps = sdk_deps + [ ":$snapshot_target_name" ]
    if (defined(invoker.non_dart_deps)) {
      deps += invoker.non_dart_deps
    }
  }
}
