# 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("//sdk/cts/build/cts_element.gni")
import("//sdk/cts/build/write_cts_file.gni")

# An executable that can be used in CTS.
#
# An equivalent to the built-in executable, but ensures dependencies are allowed
# in CTS.
#
# Example:
# ```
# cts_executable("my-test") {
#   deps = [ "//zircon/public/lib/zxtest" ]
#   sources = [ "//sdk/cts/tests/my_test/my_test.cc" ]
#   testonly = true
# }
# ```
#
# Parameters
#   sources (required)
#     List of files to create an executable from.
#     Type: list(labels)
template("cts_executable") {
  assert(defined(invoker.sources), "Sources must be defined.")

  if (defined(invoker.deps) && invoker.deps != []) {
    cts_element("${target_name}_verify_deps") {
      deps = invoker.deps
      invoker_label = get_label_info(invoker.target_name, "label_no_toolchain")
    }
  }

  executable(target_name) {
    forward_variables_from(invoker, "*")
    if (defined(deps) && deps != []) {
      deps += [ ":${target_name}_verify_deps" ]
    }
  }

  write_cts_file(target_name) {
  }
}

set_defaults("cts_executable") {
  configs = default_executable_configs
}
