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

# Declare a data file to be accessible at runtime on the target device.
#
# A resource() target looks just like a copy() target but $outputs are
# relative target paths.  Using $data_deps to this resource() target in
# each target whose code uses $outputs at runtime ensures that the files
# will be present on the system.
#
# If the file is not in the source tree, it should be generated by another
# target in the build listed in $deps.  If that would be a generated_file()
# target, then use generated_resource() instead of resource().
#
# Parameters
#
#   data_deps
#     Optional: Additional dependencies for the runtime image.  These are
#     included in the image if this target is, but are not related to the
#     $sources list.
#     Type: list(label)
#
#   deps
#     Optional: Targets that produce $sources.  Any files listed in
#     $sources that are produced by the build should be produced by a
#     target listed here.  This is the only thing that guarantees those
#     files will have been built by the time the image is being packed.
#     Targets reached only via this $deps list will *not* contribute their
#     own contents to the image directly.  For that, list them in $data_deps.
#     Targets listed here are used only to produce the $sources files.
#     Type: list(label)
#
#   outputs
#     Required: List of one runtime path.  This must be a relative path (no
#     leading `/`).  It can use placeholders based on $sources; see copy()
#     and `gn help source_expansion`.  When this resource() target is in
#     the dependency graph of a zbi() target, then this is the path within
#     the BOOTFS, which appears at /boot in the namespace of early-boot and
#     standalone Zircon processes.  When it's instead in the dependency graph
#     of a package, then this is the path within the package's file namespace.
#     TODO(mcgrathr): Clarify package case when actually implemented.
#     Type: list(path)
#
#   sources
#     Required: List of files in the source tree or build that become $outputs.
#     See copy() for details.
#     Type: list(file)
#
# See copy() for other parameters.
#
template("resource") {
  group(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "metadata",
                             "outputs",
                             "sources",
                           ])
    metadata = {
      manifest_barrier = []
      manifest_lines = []
      zbi_barrier = []

      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }

      # Stop manifest_file() and zbi() from picking up files or zbi_input()
      # items from the deps, but let them reach the data_deps.
      if (defined(data_deps)) {
        manifest_barrier += data_deps
        zbi_barrier += data_deps
      }

      foreach(source, invoker.sources) {
        foreach(target, process_file_template([ source ], invoker.outputs)) {
          assert(rebase_path(target, "foo") != target,
                 "`outputs` in resource() cannot start with /")
          manifest_lines +=
              [ target + "=" + rebase_path(source, root_build_dir) ]
        }
      }
    }
  }
}

# Looks just like a generated_file() target but $outputs is like resource().
#
# A generated_resource() target is like a resource() target whose $sources
# matches the $outputs of a generated_file() target, but rolled into one.
# Using $data_deps to this generated_resource() target in each target whose
# code uses $outputs at runtime ensures that the files will be present on
# the system.  The files can have fixed contents given directly in the
# target or be generated from metadata collection, as in generated_file().
#
# Parameters
#
#   outputs
#     Required: See resource().
#
# See generated_file() for other parameters.
#
template("generated_resource") {
  generated_file(target_name) {
    forward_variables_from(invoker, "*", [ "metadata" ])
    assert(outputs == [ outputs[0] ],
           "generated_resource() requires a single element in `outputs")

    # Select a place to generate the contents at `gn gen` time.
    file = "$target_gen_dir/$target_name"
    if (defined(output_conversion) && output_conversion == "json") {
      file += ".json"
    } else {
      file += ".txt"
    }

    # Add metadata to add that file to a filesystem image.
    metadata = {
      manifest_barrier = []
      manifest_lines = []
      zbi_barrier = []

      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }

      if (defined(data_deps)) {
        manifest_barrier += data_deps
        zbi_barrier += data_deps
      }

      manifest_lines += [ "${outputs[0]}=" + rebase_path(file, root_build_dir) ]
    }

    # That static file is the actual output of this target.
    outputs = []
    outputs = [ file ]
  }
}
