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

# Generates a flat romfs image from the provided files.
template("romfs_image") {
  image_target = "_${target_name}_image"
  check_target = "_${target_name}_check"
  compiled_action(image_target) {
    assert(defined(invoker.output), "output must be defined for $target_name")
    assert(defined(invoker.inputs), "inputs must be defined for $target_name")
    forward_variables_from(invoker, "*")
    tool = "//src/virtualization/buildtools:mkromfs"
    outputs = [ output ]
    args = [ rebase_path(output, root_out_dir) ]
    foreach(input, inputs) {
      args += [ rebase_path(input, root_out_dir) ]
    }
  }
  action(check_target) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [ ":${image_target}" ]
    script = "//src/virtualization/buildtools/romfsck.py"
    inputs = [ invoker.output ]
    outputs = [ "${invoker.output}.verify" ]
    args = [
      rebase_path(invoker.output, root_out_dir),
      rebase_path("${invoker.output}.verify", root_out_dir),
    ]
  }
  group("${target_name}") {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = [ ":${image_target}" ]
    deps = [ ":${check_target}" ]
  }
}
