# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Rules to generate python packaged applications for Dart

import("//build/module_args/mojo.gni")

template("dart_package") {
  package_target_name = "$target_name"
  package_output = "$target_out_dir/$target_name.dartzip"

  if (defined(invoker.uses_pub) && invoker.uses_pub) {
    # Repackage all dependencies pulled in via "pub get" in a dartzip file.
    action("${package_target_name}_repackage") {
      target_dir = get_label_info(":$target_name", "dir")
      script = rebase_path("mojo/public/tools/gn/zip.py", ".", mojo_sdk_root)

      # Get a list of the files in packages/ as inputs.
      list_packages_contents_script =
          rebase_path("mojo/public/tools/dart_list_packages_contents.py",
                      ".",
                      mojo_sdk_root)
      rebase_target_dir = rebase_path(target_dir, root_build_dir)
      inputs = exec_script(list_packages_contents_script,
                           [
                             "--target-directory",
                             rebase_target_dir,
                           ],
                           "list lines",
                           [ target_dir + "/pubspec.lock" ])

      # Zip up all the pulled-in files relative to their location in the
      # packages dir.
      output = "$target_out_dir/$target_name.dartzip"
      outputs = [
        output,
      ]
      rebase_base_dir = rebase_target_dir + "/packages"
      rebase_inputs = rebase_path(inputs, root_build_dir)
      rebase_output = rebase_path(output, root_build_dir)
      args = [
        "--base-dir=$rebase_base_dir",
        "--inputs=$rebase_inputs",
        "--output=$rebase_output",
      ]
    }
  }

  action("${package_target_name}_package") {
    script = rebase_path("mojo/public/tools/gn/zip.py", ".", mojo_sdk_root)

    inputs = invoker.sources

    deps = []
    zip_inputs = []

    if (defined(invoker.uses_pub) && invoker.uses_pub) {
      deps += [ ":${package_target_name}_repackage" ]
    }

    if (defined(invoker.deps)) {
      deps += invoker.deps
      foreach(d, deps) {
        dep_name = get_label_info(d, "name")
        dep_target_out_dir = get_label_info(d, "target_out_dir")
        zip_inputs += [ "$dep_target_out_dir/$dep_name.dartzip" ]
      }
    }

    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }

    output = package_output
    outputs = [
      output,
    ]

    rebase_base_dir =
        rebase_path(get_label_info(":$package_target_name", "dir"),
                    root_build_dir)
    if (defined(invoker.base_dir)) {
      rebase_base_dir = invoker.base_dir
    }
    rebase_inputs = rebase_path(inputs, root_build_dir)
    rebase_zip_inputs = rebase_path(zip_inputs, root_build_dir)
    rebase_output = rebase_path(output, root_build_dir)
    args = [
      "--base-dir=$rebase_base_dir",
      "--inputs=$rebase_inputs",
      "--zip-inputs=$rebase_zip_inputs",
      "--output=$rebase_output",
    ]
  }

  action(target_name) {
    script =
        rebase_path("mojo/public/tools/dart_analyze.py", ".", mojo_sdk_root)

    sources = [
      package_output,
    ]

    args = [
      rebase_path(package_output),
      rebase_path("$target_gen_dir/${package_target_name}_analyze.stamp"),
      "--no-hints",
      "--url-mapping=dart:mojo.io,/" +
          rebase_path("mojo/public/dart/io.dart", "/", mojo_sdk_root),
    ]

    deps = [
      ":${package_target_name}_package",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }

    outputs = [
      "$target_gen_dir/${package_target_name}_analyze.stamp",
    ]
  }
}

# Use this template to generate a .mojo dart application. One of the source
# files should be named main.dart and contain a main function as the
# entry point. Dependencies of dart_packaged_application targets should be
# either mojom targets (and specified using the mojom_deps variable) or
# dart_package targets.
template("dart_packaged_application") {
  package_name = "${target_name}_package"
  package_output = "$target_out_dir/$package_name.dartzip"

  if (defined(invoker.output_name)) {
    mojo_output = "$root_out_dir/" + invoker.output_name + ".mojo"
  } else {
    mojo_output = "$root_out_dir/" + target_name + ".mojo"
  }

  dart_package(package_name) {
    sources = invoker.sources
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
    if (defined(invoker.uses_pub)) {
      uses_pub = invoker.uses_pub
    }
    if (defined(invoker.mojom_deps)) {
      mojom_deps = invoker.mojom_deps
    }
    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }
  }

  action(target_name) {
    script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_sdk_root)

    input = package_output
    inputs = [
      input,
    ]

    output = mojo_output
    outputs = [
      output,
    ]

    deps = [
      ":$package_name",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (defined(invoker.mojom_deps)) {
      deps += invoker.mojom_deps
    }
    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }

    line = "#!mojo mojo:dart_content_handler"
    if (is_debug || (defined(invoker.strict) && invoker.strict == true)) {
      line = "#!mojo mojo:dart_content_handler?strict=true"
    }

    rebase_input = rebase_path(input, root_build_dir)
    rebase_output = rebase_path(output, root_build_dir)
    args = [
      "--input=$rebase_input",
      "--output=$rebase_output",
      "--line=$line",
    ]
  }
}
