# 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/dart/copy_tree.gni")
import("../../build/dart/dart_action.gni")
import("observatory_sources.gni")

prebuilt_dart2js_action("build_observatory") {
  visibility = [ ":copy_main_dart_js" ]

  script = "web/main.dart"

  # dart2js produces a .deps file, but it is not in a format that is understood
  # by ninja, so we explicitly list all the sources here.
  inputs = [ "../../.packages" ] + observatory_sources

  output = "$target_gen_dir/observatory/web/main.dart.js"
  outputs = [ output ]
  if (is_debug) {
    outputs += [ "$target_gen_dir/observatory/web/main.dart.js.map" ]
  }

  args = [
    "-o",
    rebase_path(output),
    "--packages=" + rebase_path("../../.packages"),
  ]
  if (is_debug) {
    args += [ "--enable-asserts" ]
  } else {
    args += [ "--minify" ]
  }
}

# The rules here down to "deploy_observatory" copy files into place such that
# they can be packaged into a tar file. These rules do the following copies:
#
# web/* ->
#     $target_out_dir/observatory/deployed/web
# $target_gen_dir/observatory/web/main.dart.js ->
#     $target_out_dir/observatory/deployed/web/main.dart.js
# ../../third_party/observatory_pub_packages/packages/$PACKAGE/lib/* ->
#     $target_out_dir/observatory/deployed/web/packages/$PACKAGE
# lib/* ->
#     $target_out_dir/observatory/deployed/web/packages/observatory
#
# Files matching "observatory_ignore_patterns" are excluded.

# Files matching these patterns are filtered out of the Observatory assets.
observatory_ignore_patterns = [
  # "\$sdk", this is the first element concatenated into the string below.
  "*.concat.js",
  "*.dart",
  "*.log",
  "*.precompiled.js",
  "*.scriptUrls",
  "*_buildLogs*",
  "*~",
  "CustomElements.*",
  "HTMLImports.*",
  "MutationObserver.*",
  "ShadowDOM.*",
  "bower.json",
  "dart_support.*",
  "interop_support.*",
  "package.json",
  "unittest*",
]

if (!is_debug) {
  observatory_ignore_patterns += [ "*.map" ]
}

# The ignore_patterns entry in the scopes accepted by copy_trees() is a
# string of comma delimited patterns.
observatory_ignore_string = "\$sdk"
foreach(pattern, observatory_ignore_patterns) {
  observatory_ignore_string = "$observatory_ignore_string,$pattern"
}

copy_tree_specs = []

copy_tree_specs += [
  {
    target = "copy_web_package"
    visibility = [ ":deploy_observatory" ]
    source = "web"
    dest = "$target_out_dir/observatory/deployed/web"
    ignore_patterns = observatory_ignore_string
  },
]

copy_tree_specs += [
  {
    target = "copy_observatory_package"
    visibility = [ ":deploy_observatory" ]
    source = "lib"
    dest = "$target_out_dir/observatory/deployed/web/packages/observatory"
    ignore_patterns = observatory_ignore_string
  },
]

# This is not a rule, rather, it generates rules with names of the form:
#   "copy_$package_package" for the packages in observatory_pub_packages.
copy_trees("copy_observatory_packages") {
  sources = copy_tree_specs
}

copy("copy_main_dart_js") {
  visibility = [ ":deploy_observatory" ]
  deps = [ ":build_observatory" ]
  sources = [ "$target_gen_dir/observatory/web/main.dart.js" ]
  if (is_debug) {
    sources += [ "$target_gen_dir/observatory/web/main.dart.js.map" ]
  }
  outputs = [ "$target_out_dir/observatory/deployed/web/{{source_file_part}}" ]
}

group("deploy_observatory") {
  deps = [
    ":copy_main_dart_js",
    ":copy_observatory_package",
    ":copy_web_package",
  ]
}

template("observatory_archive") {
  enable_compression = false
  if (defined(invoker.compress) && invoker.compress) {
    enable_compression = true
  }
  action(target_name) {
    deps = [ ":deploy_observatory" ]

    output_name = target_name

    output = "$target_gen_dir/${output_name}.tar"
    outputs = [ output ]

    script = "../tools/create_archive.py"
    args = [
      "--tar_output",
      rebase_path(output),
      "--client_root",
      rebase_path("$target_out_dir/observatory/deployed/web/"),
    ]
    if (enable_compression) {
      args += [ "--compress" ]
    }
  }
}

observatory_archive("compressed_observatory_archive") {
  compress = true
}

copy("copy_compressed_observatory_archive") {
  archive_target = ":compressed_observatory_archive"
  deps = [ archive_target ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
  sources = [ archive_file ]
  outputs = [ "$root_out_dir/${archive_name}.tar" ]
}

observatory_archive("observatory_archive") {
  compress = false
}

copy("copy_observatory_archive") {
  archive_target = ":observatory_archive"
  deps = [ archive_target ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
  sources = [ archive_file ]
  outputs = [ "$root_out_dir/${archive_name}.tar" ]
}

# Generates a .cc file containing the bytes of the observatory archive in a C
# array.
#
# Parameters:
#  inner_namespace (required):
#    The inner C++ namespace that the C array lives in.
#
#  outer_namespace (required):
#    The outer C++ namespace that the C array lives in.
#
#  archive_file (required):
#    The path to the observatory archive.
#
template("observatory_archive_source") {
  assert(defined(invoker.inner_namespace),
         "Need inner_namespace in $target_name")
  assert(defined(invoker.outer_namespace),
         "Need outer_namespace in $target_name")
  assert(defined(invoker.archive_file), "Need archive_file in $target_name")

  action(target_name) {
    forward_variables_from(invoker, [ "deps" ])

    inputs = [ invoker.archive_file ]

    output = "$target_gen_dir/${target_name}.cc"
    outputs = [ output ]

    script = "../tools/create_archive.py"
    args = [
      "--tar_input",
      rebase_path(invoker.archive_file),
      "--output",
      rebase_path(output),
      "--outer_namespace",
      invoker.outer_namespace,
      "--inner_namespace",
      invoker.inner_namespace,
      "--name",
      "observatory_assets_archive",
    ]
  }
}

observatory_archive_source("embedded_archive_observatory") {
  outer_namespace = "dart"
  inner_namespace = "observatory"

  # TODO(zra): In a Fuchsia build, use a prebuilt Observatory archive.
  archive_target = ":observatory_archive"
  deps = [ archive_target ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
}

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

  sources = [ rebase_path("$target_gen_dir/embedded_archive_observatory.cc") ]
}

observatory_archive_source("standalone_archive_observatory") {
  outer_namespace = "dart"
  inner_namespace = "bin"

  # TODO(zra): In a Fuchsia build, use a prebuilt Observatory archive.
  archive_target = ":compressed_observatory_archive"
  deps = [ archive_target ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
}

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

  sources = [ rebase_path("$target_gen_dir/standalone_archive_observatory.cc") ]
}
