# 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.

import("../../build/executable_suffix.gni")
import("../../build/prebuilt_dart_sdk.gni")

# Currently paths here are hard coded for convenience in building Mojo/Flutter.
declare_args() {
  # Specify the path to a host compatible version of the Dart SDK.
  # This SDK is used to compile the Observatory frontend sources.
  dart_host_sdk = rebase_path("//third_party/dart-sdk/dart-sdk")

  # Specify the path to a host compatible version of pub.
  # This is used to compile the Observatory frontend sources.
  #
  # The observatory build tool searches for pub first using this GN arg, then
  # for the checked-in SDK, and if that doesn't work, it uses the dart_bootstrap
  # built as part of the build to invoke pub. If this arg is set to a non-empty
  # string, we assume that there is no need for dart_bootstrap. If it is set to
  # "", then we assume that there may be a need for dart_bootstrap.
  dart_host_pub_exe = rebase_path("$dart_host_sdk/bin/pub")
}

# We set this to "" in the Fuchsia build to force building with dart_bootstrap.
if (defined(is_fuchsia) && defined(is_fuchsia_host) &&
    (is_fuchsia || is_fuchsia_host)) {
  dart_host_pub_exe = ""
}

# Construct arguments to the observatory tool for finding pub.
pub_build_deps = []
pub_build_args = []
if (dart_host_pub_exe != "") {
  pub_build_args = [
    "--pub-executable",
    dart_host_pub_exe,
  ]
} else if (!prebuilt_dart_exe_works) {
  pub_build_deps += [ "../bin:dart_bootstrap($host_toolchain)" ]

  dart_out_dir =
      get_label_info("../bin:dart_bootstrap($host_toolchain)", "root_out_dir")
  dart_bootstrap = rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")

  pub_build_args = [
    "--sdk=True",
    "--dart-executable",
    dart_bootstrap,
  ]
} else {
  pub_build_args = [ "--sdk=True" ]
}

current_dir = rebase_path(".", "//")

# Helper build rules for packaging the Dart observatory resources.
observatory_sources_gypi =
    exec_script("../../tools/gypi_to_gn.py",
                [ rebase_path("../observatory/observatory_sources.gypi") ],
                "scope",
                [ "../observatory/observatory_sources.gypi" ])

copy("copy_observatory") {
  sources = rebase_path(observatory_sources_gypi.sources, "", ".")
  outputs = [
    "$root_gen_dir/observatory_copy/{{source_root_relative_dir}}/{{source_file_part}}",
  ]
}

action("write_observatory_pubspec_yaml") {
  deps = [ ":copy_observatory" ] + pub_build_deps

  inputs = [
    rebase_path("pubspec.yaml"),
  ]

  script = "../../tools/observatory_tool.py"
  args =
      pub_build_args + [
        "--silent=True",
        "--directory",
        rebase_path("$root_gen_dir/observatory_copy/$current_dir/"),
        "--command",
        "rewrite",
        rebase_path("../observatory/pubspec.yaml"),
        rebase_path("$root_gen_dir/observatory_copy/$current_dir/pubspec.yaml"),
        "../../third_party/",
        rebase_path("../../third_party/"),
      ]

  outputs = [
    "$root_gen_dir/observatory_copy/$current_dir/pubspec.yaml",
  ]
}

action("copy_observatory_deps") {
  deps = [ ":write_observatory_pubspec_yaml" ] + pub_build_deps

  inputs = [
    "$root_gen_dir/observatory_copy/$current_dir/pubspec.yaml",
  ]

  script = "../../tools/observatory_tool.py"
  args = pub_build_args + [
           "--silent=True",
           "--stamp",
           rebase_path(
               "$root_gen_dir/observatory_copy/$current_dir/packages.stamp"),
           "--directory",
           rebase_path("$root_gen_dir/observatory_copy/$current_dir/"),
           "--command",
           "get",
         ]

  outputs = [
    "$root_gen_dir/observatory_copy/$current_dir/packages.stamp",
  ]
}

action("pub_build_observatory") {
  deps = [
           ":copy_observatory",
           ":copy_observatory_deps",
         ] + pub_build_deps

  sources = rebase_path(observatory_sources_gypi.sources,
                        "",
                        "$root_gen_dir/observatory_copy/$current_dir")

  inputs =
      sources + [ "$root_gen_dir/observatory_copy/$current_dir/packages.stamp" ]

  script = "../../tools/observatory_tool.py"
  args = pub_build_args + [
           "--silent=True",
           "--directory",
           rebase_path("$root_gen_dir/observatory_copy/$current_dir/"),
           "--command",
           "build",
           rebase_path("$root_out_dir/observatory/build"),
         ]

  outputs = [
    "$root_out_dir/observatory/build/web/main.dart.js",
  ]
}

action("deploy_observatory") {
  deps = [ ":pub_build_observatory" ] + pub_build_deps

  script = "../../tools/observatory_tool.py"

  inputs = [
    script,
    "$root_out_dir/observatory/build/web/main.dart.js",
  ]

  args = pub_build_args + [
           "--silent=True",
           "--directory",
           rebase_path("$root_out_dir/observatory"),
           "--command",
           "deploy",
         ]

  outputs = [
    "$root_out_dir/observatory/deployed/web/main.dart.js",
  ]
}

template("observatory_archive") {
  assert(defined(invoker.inner_namespace),
         "Need inner_namespace in $target_name")
  assert(defined(invoker.outer_namespace),
         "Need outer_namespace in $target_name")
  enable_compression = false
  if (defined(invoker.compress) && invoker.compress) {
    enable_compression = true
  }
  action(target_name) {
    deps = [
      ":deploy_observatory",
    ]

    inputs = [
      "$root_out_dir/observatory/deployed/web/main.dart.js",
    ]

    inner_namespace = invoker.inner_namespace
    outer_namespace = invoker.outer_namespace
    output_name = target_name

    script = "../tools/create_archive.py"
    args = [
      "--output",
      rebase_path("$root_gen_dir/observatory/${output_name}.cc"),
      "--tar_output",
      rebase_path("$root_gen_dir/observatory/${output_name}.tar"),
      "--outer_namespace",
      outer_namespace,
      "--inner_namespace",
      inner_namespace,
      "--name",
      "observatory_assets_archive",
      "--client_root",
      rebase_path("$root_out_dir/observatory/deployed/web/"),
    ]
    if (enable_compression) {
      args += [ "--compress" ]
    }

    outputs = [
      "$root_gen_dir/observatory/${output_name}.cc",
      "$root_gen_dir/observatory/${output_name}.tar",
    ]
  }
}

observatory_archive("embedded_archive_observatory") {
  outer_namespace = "dart"
  inner_namespace = "observatory"
}

source_set("embedded_observatory_archive") {
  deps = [
    ":embedded_archive_observatory",
  ]

  sources = [
    rebase_path("$root_gen_dir/observatory/embedded_archive_observatory.cc"),
  ]
}

observatory_archive("standalone_archive_observatory") {
  compress = true
  outer_namespace = "dart"
  inner_namespace = "bin"
}

source_set("standalone_observatory_archive") {
  deps = [
    ":standalone_archive_observatory",
  ]

  sources = [
    rebase_path("$root_gen_dir/observatory/standalone_archive_observatory.cc"),
  ]
}
