# Copyright 2019 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/board.gni")
import("//build/components/fuchsia_package.gni")
import("//build/dist/resource.gni")
import("//build/info/info.gni")

if (current_toolchain == default_toolchain) {
  write_file(build_info_files.product, build_info_product)
  write_file(build_info_files.board, board_name)

  if (build_info_files.version != build_info_files.latest_commit_date) {
    write_file(build_info_files.version, build_info_version)
  }

  action("latest-commit-date") {
    # NOTE: Using a depfile instead of explicit sources is intentional
    # See https://fxbug.dev/77607 for context.
    outputs = [
      build_info_files.latest_commit_date,
      build_info_files.minimum_utc_stamp,
    ]
    depfile = "$target_gen_dir/$target_name.d"
    script = "gen-latest-commit-date.sh"
    args = rebase_path([ "//integration/" ] + outputs + [ depfile ],
                       root_build_dir)
  }
} else {
  group("latest-commit-date") {
    public_deps = [ ":latest-commit-date($default_toolchain)" ]
  }
}

if (is_fuchsia) {
  resource_group("build-info-resources") {
    files = [
      {
        source = build_info_files.product
        dest = "data/product"
      },
      {
        source = build_info_files.board
        dest = "data/board"
      },
      {
        source = build_info_files.version
        dest = "data/version"
      },
      {
        source = build_info_files.jiri_snapshot
        dest = "data/snapshot"
      },
      {
        source = build_info_files.latest_commit_date
        dest = "data/latest-commit-date"
      },
      {
        source = build_info_files.minimum_utc_stamp
        dest = "data/minimum-utc-stamp"
      },
    ]
    deps = [ ":latest-commit-date" ]
  }

  fuchsia_package("build-info") {
    deps = [ ":build-info-resources" ]
  }

  resource("bootfs") {
    sources = [ build_info_files.minimum_utc_stamp ]
    outputs = [ "config/build_info/minimum_utc_stamp" ]
    deps = [ ":latest-commit-date" ]
  }
}
