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

assert(is_fuchsia)

import("//build/config/fuchsia/fidl_library.gni")
import("//build/util/process_version.gni")

# Location where Fuchsia release archives and supporting files are placed.
_release_artifact_root = "$root_out_dir/fuchsia_artifacts"

fidl_library("web_fidl") {
  library_name = "web"
  namespace = "chromium"

  sources = [
    "fidl/web/context.fidl",
    "fidl/web/context_provider.fidl",
    "fidl/web/frame.fidl",
    "fidl/web/navigation_controller.fidl",
    "fidl/web/navigation_event_observer.fidl",
  ]

  public_deps = [
    "//third_party/fuchsia-sdk/sdk:io",
    "//third_party/fuchsia-sdk/sdk:sys",
    "//third_party/fuchsia-sdk/sdk:ui_gfx",
  ]
}

fidl_library("cast_fidl") {
  library_name = "cast"
  namespace = "chromium"

  sources = [
    "fidl/cast/application_config.fidl",
    "fidl/cast/cast_channel.fidl",
    "fidl/cast/queryable_data.fidl",
  ]

  public_deps = [
    ":web_fidl",
  ]
}

# gn binary location.
if (host_os == "mac") {
  _gn_path = "//buildtools/mac/gn"
} else if (host_os == "linux") {
  _gn_path = "//buildtools/linux64/gn"
}

# Produces a LICENSE file for webrunner and its transitive dependencies.
_license_path = "$_release_artifact_root/LICENSE"
action("license") {
  script = "//tools/licenses.py"
  inputs = [
    "$_gn_path",
  ]
  outputs = [
    _license_path,
  ]
  args = [
    "license_file",
    rebase_path(_license_path, root_build_dir),
    "--gn-target",
    "//fuchsia/runners:web_runner_pkg",
    "--gn-out-dir",
    ".",
  ]
}

# Extracts the numeric Chrome build ID and writes it to a file in the output
# directory.
#
# To check out the repository on the commit where the build ID was generated,
# simply call `git checkout <build-id>`, and Git will check out the commit
# associated with the <build-id> tag.
process_version("build_id") {
  template_file = "cipd/build_id.template"
  sources = [
    "//chrome/VERSION",
  ]
  output = "$_release_artifact_root/build_id.txt"
  process_only = true
}

# Puts copies of files at the top level of the CIPD archive's structure.
copy("release_archives") {
  sources = [
    "$root_gen_dir/fuchsia/engine/chromium/chromium.far",
    "$root_gen_dir/fuchsia/http/http/http.far",
    "$root_gen_dir/fuchsia/runners/cast_runner/cast_runner.far",
    "$root_gen_dir/fuchsia/runners/web_runner/web_runner.far",
  ]
  outputs = [
    "$_release_artifact_root/{{source_file_part}}",
  ]
  deps = [
    "//fuchsia/engine:web_engine",
    "//fuchsia/http:http_pkg",
    "//fuchsia/runners:cast_runner_pkg",
    "//fuchsia/runners:web_runner_pkg",
  ]
}

if (is_official_build) {
  # Location where debug symbol tarballs are placed.
  _symbol_artifact_root = "$root_out_dir/symbol_artifacts"

  # Create a manifest of symbol archives for downstream consumption.
  _symbol_tarballs = [
    "$root_gen_dir/fuchsia/engine/chromium/chromium.symbols.tar.bz2",
    "$root_gen_dir/fuchsia/http/http/http.symbols.tar.bz2",
    "$root_gen_dir/fuchsia/runners/cast_runner/cast_runner.symbols.tar.bz2",
    "$root_gen_dir/fuchsia/runners/web_runner/web_runner.symbols.tar.bz2",
  ]
  _symbol_manifest = "$target_gen_dir/debug_symbols.json"
  write_file(_symbol_manifest, _symbol_tarballs, "json")

  copy("symbol_tarballs") {
    sources = [
      _symbol_manifest,
      "$_release_artifact_root/build_id.txt",
      _license_path,
    ] + _symbol_tarballs
    outputs = [
      "$_symbol_artifact_root/{{source_file_part}}",
    ]
    deps = [
      ":build_id",
      ":license",
      "//fuchsia/engine:symbol_archive",
      "//fuchsia/http:symbol_archive",
      "//fuchsia/runners:cast_runner_symbol_archive",
      "//fuchsia/runners:web_runner_symbol_archive",
    ]
  }

  # Specifies the build steps that must be performed before the creation of
  # a CIPD archive.
  group("archive_sources") {
    deps = [
      ":build_id",
      ":license",
      ":release_archives",
      ":symbol_tarballs",
    ]
  }
}  # is_official_build

# Used by the top-level "gn_all" target to discover Fuchsia build targets.
group("gn_all") {
  testonly = true
  deps = [
    "base:cr_fuchsia_base_unittests",
    "engine:web_engine",
    "engine:web_engine_browsertests",
    "engine:web_engine_unittests",
    "http:http_service_tests",
    "runners:cast_runner",
    "runners:cast_runner_browsertests",
    "runners:cast_runner_integration_tests",
    "runners:web_runner",
  ]
}
