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

# Invokes the check-licenses tool.
#
# Parameters
#
#   fuchsia_dir (optional)
#     [string] Path to the fuchsia root directory. Defaults to "//".
#
#   out_dir (optional)
#     [string] Directory where generated NOTICE files will be placed. Defaults
#     to target_out_dir.
#
#   testonly, visibility
template("license_data") {
  # TODO(jcecil): Remove this "configs" flag from all targets
  # that use this template.
  not_needed(invoker, [ "configs" ])

  filter = ""
  if (defined(invoker.filter)) {
    filter = invoker.filter
  }

  out_dir = "$target_out_dir/check-licenses"
  if (defined(invoker.out_dir)) {
    out_dir = invoker.out_dir
  }
  temp_out_dir = "$out_dir/temp"

  check_licenses_target = "${target_name}_check-licenses"
  copy_txt_notices_target = "${target_name}_txt_copy"
  copy_html_notices_target = "${target_name}_html_copy"

  txt_notices_output = "license_texts_grouped_by_license_pattern_deduped.txt.gz"
  html_notices_output =
      "license_texts_grouped_by_license_pattern_deduped.html.gz"

  action(check_licenses_target) {
    forward_variables_from(invoker,
                           [
                             "fuchsia_dir",
                             "testonly",
                             "visibility",
                           ])

    # check-licenses assumes that it runs from //,
    # but actions run from root_build_dir.
    # This shell script sets the CWD and then calls check-licenses.
    script = "//tools/check-licenses/license_data.sh"

    # The license tool scans the whole source tree, so it cannot be hermetic.
    # TODO(fxb/84924): Improve the way notice files are generated.
    hermetic_deps = false

    license_tool = "//tools/check-licenses($host_toolchain)"
    deps = [ license_tool ]

    sources = [ "//tools/check-licenses/_config.json" ]

    out_dir = temp_out_dir

    outputs = [
      "$temp_out_dir/out/$txt_notices_output",
      "$temp_out_dir/out/$html_notices_output",
    ]

    args = [
      ### Args for license_data.sh
      rebase_path("//", root_build_dir),
      rebase_path(
          get_label_info(license_tool, "root_out_dir") + "/check-licenses",
          root_build_dir),

      ### Args for check-licenses
      # TODO: Remove once all files are attributed in the file generated by
      # check-licenses.
      "--log_level",
      "0",
      "--fuchsia_dir",
      rebase_path("//", root_build_dir),
      "--out_dir",
      rebase_path(out_dir, root_build_dir),
      "--gn_path",
      rebase_path("//prebuilt/third_party/gn/${host_os}-${host_cpu}/gn",
                  root_build_dir),
      "--build_dir",
      rebase_path(root_out_dir, root_build_dir),
    ]

    if (filter != "") {
      args += [
        "--filter",
        filter,
      ]
    }
  }

  copy(copy_txt_notices_target) {
    forward_variables_from(invoker,
                           [
                             "fuchsia_dir",
                             "testonly",
                             "visibility",
                           ])

    sources = [ "$temp_out_dir/out/$txt_notices_output" ]
    outputs = [ "$out_dir/NOTICE.txt.gz" ]
    deps = [ ":$check_licenses_target" ]
  }
  copy(copy_html_notices_target) {
    forward_variables_from(invoker,
                           [
                             "fuchsia_dir",
                             "testonly",
                             "visibility",
                           ])

    sources = [ "$temp_out_dir/out/$html_notices_output" ]
    outputs = [ "$out_dir/NOTICE.html.gz" ]
    deps = [ ":$check_licenses_target" ]
  }

  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "fuchsia_dir",
                             "testonly",
                             "visibility",
                           ])

    deps = [
      ":$check_licenses_target",
      ":$copy_html_notices_target",
      ":$copy_txt_notices_target",
    ]
  }
}
