# Copyright 2020 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/zircon/migrated_targets.gni")

# Generate a header file for assembly files to #include from hwreg types.
#
# This defines a target that provides a generated header file.
# The generator program is expected to be defined using <hwreg/asm.h>.
#
# Parameters
#
#   * output_name
#     - Required: The include file name as it appears in `#include "name"`.
#     - Type: string
#
#   * sources
#     - Required: Source files for the generator program.
#     - Type: list(file)
#
# Other parameters are passed on to host_tool(), e.g. `cflags`, `defines`, etc.
#
template("hwreg_asm_header") {
  main_target = target_name
  tool_target = "_hwreg_header.tool.$target_name"
  gen_target = "_hwreg_header.gen.$target_name"
  config_target = "_hwreg_header.config.$target_name"
  header_dir = get_label_info(":$main_target($default_toolchain)",
                              "target_gen_dir") + "/$target_name.include"
  not_needed([ "tool_target" ])

  if (is_host) {
    zx_host_tool(tool_target) {
      visibility = [ ":*" ]
      deps = []
      forward_variables_from(invoker,
                             "*",
                             [
                               "output_name",
                               "testonly",
                               "visibility",
                             ])
      forward_variables_from(invoker, [ "testonly" ])
      deps += [ "//zircon/system/ulib/hwreg" ]
      sdk_migrated = true
    }
  } else {
    not_needed(invoker, "*")
  }

  if (current_toolchain == default_toolchain) {
    zx_host_tool_action(gen_target) {
      forward_variables_from(invoker, [ "testonly" ])
      tool = ":$tool_target"
      outputs = [ "$header_dir/${invoker.output_name}" ]
      args = rebase_path(outputs, root_build_dir) + [ invoker.output_name ]
    }
  } else {
    not_needed(invoker, [ "output_name" ])
  }

  config(config_target) {
    visibility = [ ":$main_target" ]
    include_dirs = [ header_dir ]
  }

  group(main_target) {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "testonly",
                           ])
    public_deps = [ ":$gen_target($default_toolchain)" ]
    public_configs = [ ":$config_target" ]
  }
}
