# 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")

declare_args() {
  # Where to find Zircon's host-side tools that are run as part of the build.
  zircon_tools_dir = "//out/build-zircon/tools"

  # Zircon build directory for `target_cpu`, containing link-time `.so.abi`
  # files that GN `deps` on //zircon/public libraries will link against.
  # This should not be a sanitizer build.
  zircon_build_abi_dir = "//out/build-zircon/build-$target_cpu"

  # Zircon build directory for `target_cpu`, containing `.manifest` and
  # `.zbi` files for Zircon's BOOTFS and kernel.  This provides the kernel
  # and Zircon components used in the boot image.  It also provides the
  # Zircon shared libraries used at runtime in Fuchsia packages.
  #
  # If left `""` (the default), then this is computed from
  # [`zircon_build_abi_dir`](#zircon_build_abi_dir) and
  # [`zircon_use_asan`](#zircon_use_asan).
  zircon_build_dir = ""

  # Zircon `USE_ASAN=true` build directory for `target_cpu` containing
  # `bootfs.manifest` with libraries and `devhost.asan`.
  #
  # If left `""` (the default), then this is computed from
  # [`zircon_build_dir`](#zircon_build_dir) and
  # [`zircon_use_asan`](#zircon_use_asan).
  zircon_asan_build_dir = ""

  # Set this if [`zircon_build_dir`](#zircon_build_dir) was built with
  # `USE_ASAN=true`, e.g. `//scripts/build-zircon.sh -A`.  This mainly
  # affects the defaults for [`zircon_build_dir`](#zircon_build_dir) and
  # [`zircon_build_abi_dir`](#zircon_build_abi_dir).  It also gets noticed
  # by //scripts/fx commands that rebuild Zircon so that they use `-A`
  # again next time.
  zircon_use_asan = false
}

if (zircon_build_dir == "") {
  zircon_build_dir = zircon_build_abi_dir
  if (zircon_use_asan) {
    zircon_build_dir += "-asan"
  }
}

# If zircon_use_asan is true, then zircon_build_dir has the ASan bits.
# Otherwise, they need to be found elsewhere.
if (zircon_asan_build_dir == "" && !zircon_use_asan) {
  zircon_asan_build_dir = "${zircon_build_dir}-asan"
}

# Template for running a Zircon host tool as part of the build.
# This is a thin wrapper to define an `action()` target.
#
# Parameters
#
#     tool (required)
#         [string] The name of the tool, like "mkbootfs".
#
#     args (required)
#         [list of strings] The arguments to pass the tool.
#         The tool runs with `root_build_dir` as its current directory,
#         so any file names should be made either absolute or relative
#         to `root_build_dir` using `rebase_path()`.
#
# All other parameters are exactly as for `action()`, except
# that `script` is replaced with `tool`.
#
template("zircon_tool_action") {
  assert(defined(invoker.tool), "zircon_tool_action() requires `tool`")
  assert(defined(invoker.args), "zircon_tool_action() requires `args`")
  _tool = "$zircon_tools_dir/${invoker.tool}"
  action(target_name) {
    inputs = []
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    forward_variables_from(invoker,
                           "*",
                           [
                             "args",
                             "script",
                             "tool",
                             "testonly",
                             "visibility",
                           ])
    script = "//build/gn_run_binary.sh"
    inputs += [ _tool ]
    args = [
             clang_prefix,
             rebase_path(_tool, root_build_dir),
           ] + invoker.args
  }
}
