# 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/images/zircon/bootsvc.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 = []
}

# Manifests inherited from Zircon.
# Paths in these manifest are relative to this build's root directory.
zircon_boot_manifests = []
zircon_boot_manifests_deps = []
zircon_aux_manifests = []
zircon_aux_manifests_deps = []

foreach(flavor,
        [
          "legacy-image",
          "migrated-image",
        ]) {
  _image_flavor = {
  }
  _image_flavor = {
    target = "//build/unification/images:$flavor"
    gen_dir = get_label_info(target, "target_out_dir")
    name = get_label_info(target, "name")
    file = "$gen_dir/$name.unification.manifest"
  }
  zircon_boot_manifests += [ _image_flavor.file ]
  zircon_boot_manifests_deps += [ _image_flavor.target ]
}

foreach(flavor, bootsvc_flavors) {
  legacy_bootsvc = {
  }
  legacy_bootsvc = {
    target = "//build/images/zircon:${flavor.name}"
    gen_dir = get_label_info(target, "target_gen_dir")
    name = get_label_info(target, "name")
    file = "$gen_dir/$name.rebased.manifest"
  }
  zircon_boot_manifests += [ legacy_bootsvc.file ]
  zircon_boot_manifests_deps += [ legacy_bootsvc.target ]
}

foreach(flavor,
        [
          "legacy-aux",
          "migrated-aux",
        ]) {
  _aux_flavor = {
  }
  _aux_flavor = {
    target = "//build/unification/images:$flavor"
    gen_dir = get_label_info(target, "target_out_dir")
    name = get_label_info(target, "name")
    file = "$gen_dir/$name.unification.manifest"
  }
  zircon_aux_manifests += [ _aux_flavor.file ]
  zircon_aux_manifests_deps += [ _aux_flavor.target ]
}

# 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(deps)) {
      deps = []
    }
    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
    deps += zircon_aux_manifests_deps + zircon_boot_manifests_deps
    foreach(manifest, zircon_aux_manifests + zircon_boot_manifests) {
      response_file_contents += [
        "--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",
      ]

      # Omit virtual-console from the Zircon manifest since it is built in //src.
      response_file_contents += [ "--exclude=bin/virtual-console" ]

      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) {
          response_file_contents += [
            "--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
  }
}
