# Copyright 2018 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/config/clang/clang.gni")
import("//build/config/fuchsia/zircon_images.gni")

declare_args() {
  # Manifest files describing target libraries from toolchains.
  # Can be either // source paths or absolute system paths.
  toolchain_manifests = [
    # clang_prefix is relative to root_build_dir.
    rebase_path("${clang_prefix}/../lib/${clang_target}.manifest",
                "",
                root_build_dir),
  ]

  # Path to Clang lib directory.
  clang_lib_dir = rebase_path("${clang_prefix}/../lib", root_build_dir)

  # Extra args to globally apply to the manifest generation script.
  extra_manifest_args = []
}

zircon_boot_manifests = []
foreach(image, zircon_images) {
  if (image.type == "manifest") {
    if (image.name == "legacy-image-$target_cpu" ||
        (image.cpu == target_cpu && image.name == "bootsvc")) {
      zircon_boot_manifests += [ "$zircon_root_build_dir/${image.path}" ]
    } else if (image.name == "legacy-aux-$target_cpu") {
      zircon_aux_manifests = [ "$zircon_root_build_dir/${image.path}" ]
    }
  }
}

# Action target that generates a response file in GN's "shlex" format.
#
# Parameters
#
#   output_name (optional, default: target_name)
#     [path] Response file to write (if relative, relative to target_out_dir).
#
#   response_file_contents (required)
#   data_deps (optional)
#   deps (optional)
#   metadata (optional)
#   public_deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Same as for any GN `action()` target.
#
template("generate_response_file") {
  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "data_deps",
                             "deps",
                             "metadata",
                             "output_name",
                             "public_deps",
                             "response_file_contents",
                             "testonly",
                             "visibility",
                           ])
    if (!defined(output_name)) {
      output_name = target_name
    }
    outputs = [
      "$target_out_dir/$output_name",
    ]
    assert(
        defined(response_file_contents),
        "generate_response_file(\"${target_name}\") must define response_file_contents")

    if (response_file_contents == []) {
      # GN doesn't allow an empty response file.
      script = "/bin/cp"
      args = [
        "-f",
        "/dev/null",
      ]
    } else {
      script = "/bin/ln"
      args = [
        "-f",
        "{{response_file_name}}",
      ]
    }
    args += rebase_path(outputs, root_build_dir)
  }
}

# Action target that generates a manifest file in the `target=/abs/file`
# format used by `zbi`, `blobfs`, etc.  ELF files in the manifest have
# their dynamic linking details examined and other necessary ELF files
# implicitly added to the manifest.  All such files have their build IDs
# and unstripped files recorded in a build ID map (`ids.txt` file).
# Outputs: $target_out_dir/$target_name, $target_out_dir/$target_name.ids.txt
#
# Parameters
#
#   args (required)
#     [list of strings] Additional arguments to finalize_manifests.py;
#     `sources` should list any files directly referenced.
#
#   bootfs_manifest (optional)
#     [string] Output a separate manifest file for the Zircon BOOTFS.  This
#     manifest will get the `bootfs_zircon_groups` selections, while the
#     main manifest will get `zircon_groups` and the other entries
#     indicated by `args`.  The main output manifest will assume that
#     libraries from the BOOTFS are available and not duplicate them.
#
#   bootfs_zircon_groups (required with `bootfs_manifest`)
#     [string] Comma-separated list of Zircon manifest groups to include
#     in `bootfs_manifest`.
#
#   bootfs_allowlist (optional with `bootfs_manifest`)
#     [list of strings] Comma-separated list of files to include in the bootfs
#     manifest created. This overrides the option set by `bootfs_zircon_groups`
#
#   output_name (optional, default: target_name)
#     [string] Root name of the output manifest file.
#
#   zircon_groups (optional, default: "")
#     [string] Comma-separated list of Zircon manifest groups to include.
#     If this is "", then the Zircon manifest only provides binaries
#     to satisfy dependencies.
#
#   deps (optional)
#   sources (optional)
#   testonly (optional)
#   visibility (optional)
#     Same as for any GN `action()` target.
#
template("generate_manifest") {
  assert(defined(invoker.args),
         "generate_manifest(\"${target_name}\") requires args")
  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "sources",
                             "testonly",
                             "visibility",
                             "zircon_groups",
                           ])
    if (!defined(sources)) {
      sources = []
    }
    if (!defined(zircon_groups)) {
      zircon_groups = ""
    }
    if (defined(invoker.output_name)) {
      manifest_file = "$target_out_dir/${invoker.output_name}"
    } else {
      manifest_file = "$target_out_dir/$target_name"
    }
    depfile = "${manifest_file}.d"
    build_id_file = "${manifest_file}.ids.txt"
    stripped_dir = "${manifest_file}.stripped"

    script = "//build/images/finalize_manifests.py"
    inputs = rebase_path([
                           "elfinfo.py",
                           "manifest.py",
                           "variant.py",
                         ],
                         "",
                         "//build/images")
    outputs = [
      manifest_file,
      build_id_file,
    ]
    args = extra_manifest_args + [
             "--depfile=" + rebase_path(depfile, root_build_dir),
             "--build-id-file=" + rebase_path(build_id_file, root_build_dir),
             "--stripped-dir=" + rebase_path(stripped_dir, root_build_dir),
             "--build-id-dir=" + rebase_path("$root_build_dir/.build-id"),
             "--clang-lib-dir=" + clang_lib_dir,
             "@{{response_file_name}}",
           ]
    response_file_contents = []

    # Collected by //build/images:ids.txt
    metadata = {
      build_ids_barrier = []
      build_ids = [ rebase_path(build_id_file, root_build_dir) ]
    }

    # First the toolchain and Zircon manifests are pure auxiliaries:
    # they just supply libraries that might satisfy dependencies.
    sources += toolchain_manifests
    foreach(manifest, toolchain_manifests) {
      manifest_cwd = get_path_info(rebase_path(manifest), "dir")
      response_file_contents += [
        "--cwd=$manifest_cwd",
        "--manifest=" + rebase_path(manifest),
      ]
    }
    sources += zircon_aux_manifests + zircon_boot_manifests
    foreach(manifest, zircon_aux_manifests + zircon_boot_manifests) {
      manifest_cwd = rebase_path(zircon_root_build_dir)
      response_file_contents += [
        "--cwd=$manifest_cwd",
        "--manifest=" + rebase_path(manifest),
      ]
    }

    manifests = []

    if (defined(invoker.bootfs_manifest)) {
      assert(
          defined(invoker.bootfs_zircon_groups),
          "generate_manifest with bootfs_manifest needs bootfs_zircon_groups")
      outputs += [ invoker.bootfs_manifest ]

      # Omit both devhost variants from the Zircon input manifest.
      # Each variant will be included if there is a driver that needs it.
      # That way we can tell whether both variants are actually in use.
      response_file_contents += [
        "--exclude=bin/devhost",
        "--exclude=bin/devhost.asan",

        # Omit the empty file deposited by the Zircon build, since
        # we will add our own.
        "--exclude=config/devmgr",
      ]

      if (defined(invoker.bootfs_allowlist) && invoker.bootfs_allowlist != []) {
        not_needed(invoker, [ "bootfs_zircon_groups" ])
        response_file_contents += [ "--output=" +
                                    rebase_path(invoker.bootfs_manifest,
                                                root_build_dir) ]
        foreach(binary, invoker.bootfs_allowlist) {
          response_file_contents += [ "--binary=" + binary ]
        }
      } else {
        manifests += [
          {
            output = invoker.bootfs_manifest
            groups = invoker.bootfs_zircon_groups
          },
        ]
      }
    }

    manifests += [
      {
        output = manifest_file
        groups = zircon_groups
      },
    ]

    foreach(manifest, manifests) {
      response_file_contents +=
          [ "--output=" + rebase_path(manifest.output, root_build_dir) ]
      if (manifest.groups != "") {
        # The boot manifests were already listed as auxiliaries, but now
        # list them again with selected groups to go in the output.  This
        # means the script processes these manifests twice, but we can't
        # just omit them as auxiliaries because dependencies from the
        # binaries selected here have to be found by target name in a
        # previously-processed manifest.
        response_file_contents += [ "--groups=${manifest.groups}" ]
        sources += zircon_boot_manifests
        foreach(manifest, zircon_boot_manifests) {
          manifest_cwd = rebase_path(zircon_root_build_dir)
          response_file_contents += [
            "--cwd=$manifest_cwd",
            "--manifest=" + rebase_path(manifest),
          ]
        }
      }
    }

    response_file_contents += [ "--groups=all" ]

    # Now further `--manifest` or `--entry` arguments in invoker.args will
    # contribute to the output manifest.
    response_file_contents += [ "--cwd=." ] + invoker.args
  }
}
