# Copyright 2016 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/compiled_action.gni")

# Generates breakpad symbol data for unstripped binaries.
#
# This symbol data is consumed by infrastructure tools and uploaded to Crash
# servers to enable crash reporting.  These files are uniquely important for
# release builds and this step may take a few minutes to complete, so it is
# not recommended that this be included in the default build.
#
# We also include build-ids from archives downloaded from CIPD; these
# archives are unpacked into a single directory.
prebuilt_build_ids = "$target_gen_dir/prebuilt_build_ids"
action("unpack_build_id_archives") {
  testonly = true
  script = "unpack_build_id_archives.sh"

  # We list the jiri snapshot as input to force ninja to run the action
  # if the snapshot has changed, which is what people want as we always
  # want to unpack the latest build-id archives.
  #
  # Ideally, we would list explicitly all the archives downloaded from CIPD,
  # but those aren't available from jiri so today, we glob `prebuilt_build_ids`
  # inside `script` so the best approximation is a jiri snapshot change.
  inputs = [
    "//.jiri_root/update_history/latest",
  ]

  # We output a text list of the build-id archives, as actions
  # require outputs, though it is not needed.
  _build_id_manifest = "$target_gen_dir/prebuilt-build-id-archives.txt"
  args = [
    rebase_path("//prebuilt/build_ids/$target_cpu"),
    rebase_path(prebuilt_build_ids),
    rebase_path(_build_id_manifest),
  ]
  outputs = [
    _build_id_manifest,
  ]
}

prebuilt_ids_txt = "$target_gen_dir/prebuilt_ids.txt"
action("prebuilt_ids.txt") {
  testonly = true
  script = "//scripts/build_id_conv.py"

  args = [
    "--output-format",
    "ids.txt",
    rebase_path(prebuilt_build_ids),
    rebase_path(prebuilt_ids_txt),
  ]

  outputs = [
    prebuilt_ids_txt,
  ]

  deps = [
    ":unpack_build_id_archives",
  ]
}

extended_ids_txt = "$root_build_dir/extended_ids.txt"
action("concatenate_ids_txts") {
  testonly = true
  script = "/bin/sh"

  sources = [
    "$root_build_dir/ids.txt",
    prebuilt_ids_txt,
  ]

  _sources = rebase_path(sources)
  _extended = rebase_path(extended_ids_txt)

  args = [
    "-c",
    "cat ${_sources[0]} ${_sources[1]} > $_extended",
  ]

  outputs = [
    extended_ids_txt,
  ]

  deps = [
    ":prebuilt_ids.txt",
    "//build/images:ids.txt",
  ]
}

action("breakpad_symbols") {
  testonly = true
  script = "$host_out_dir/dump_breakpad_symbols"

  deps = [
    ":concatenate_ids_txts",
    "//tools/debug/dump_breakpad_symbols($host_toolchain)",
  ]

  inputs = [
    "//prebuilt/third_party/breakpad/${host_platform}/dump_syms/dump_syms",
  ]

  sources = [
    extended_ids_txt,
  ]

  # This action generates a single xxx.sym file for each binary in the ids file
  # and produces an archived output of them all.
  outputs = [
    "$root_out_dir/breakpad_symbols/breakpad_symbols.tar.gz",
  ]

  depfile = "${outputs[0]}.d"

  args = [
    "-out-dir",
    rebase_path("$root_out_dir/breakpad_symbols"),
    "-dump-syms-path",
    rebase_path(
        "//prebuilt/third_party/breakpad/${host_platform}/dump_syms/dump_syms"),
    "-depfile",
    rebase_path(depfile, root_build_dir),
    "-tar-file",
    rebase_path(outputs[0], root_build_dir),
    rebase_path(sources[0], root_build_dir),
  ]
}

# Generates an archive of package metadata.
amber_files = rebase_path("$root_build_dir/amber-files")
pm_tool = rebase_path("$host_out_dir/pm")
pkg_archive_contents = [
  "amber-files/repository=$amber_files/repository",

  # TODO(IN-915): this should never contain the root key. In the future, this
  # should contain no keys, once infra is managing key material itself.
  # These keys are consumed by the infra train promote scripts.
  "amber-files/keys=$amber_files/keys",
  "pm=$pm_tool",
]
pkg_archive_manifest = "$target_gen_dir/package_archive_manifest"
write_file(pkg_archive_manifest, pkg_archive_contents)

# NOTE: This is consumed by the system OTA tests. Please check in with the
# software delivery team if you need to change this.
pkg_archive = "$root_build_dir/packages.tar.gz"
compiled_action("package_archive") {
  testonly = true
  tool = "//build/tools/tar_maker"
  inputs = [
    pkg_archive_manifest,
  ]
  outputs = [
    pkg_archive,
  ]
  args = [
    "-manifest",
    rebase_path(pkg_archive_manifest),
    "-output",
    rebase_path(pkg_archive),
  ]
  deps = [
    "//build/images:updates",
  ]
}
