# 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("$zx/public/gn/host_tool_action.gni")
import("$zx/public/gn/toolchain/c_utils.gni")
import("$zx/vdso/vdso.gni")

if (defined(zx)) {
  # Kazoo can be built for both the ZN and GN build. In the GN case,
  # provide appropriate implementations for the zx_xxx() templates used
  # in this file.
  if (zx != "/") {
    assert(current_toolchain == host_toolchain,
           "current_toolchain=$current_toolchain, expected $host_toolchain")

    import("//build/unification/zx_host_tool.gni")
    import("//build/unification/zx_library.gni")
    import("//build/unification/zx_test.gni")
  }

  config("kazoo_config") {
    visibility = [ ":*" ]
    include_dirs = [ rebase_path("../..") ]
  }

  zx_library("kazoo_lib") {
    host = true

    if (zx != "/") {
      # NOTE: The unification zx_library() template requires an sdk field.
      sdk = "source"
    }

    configs += [ ":kazoo_config" ]

    sources = [
      "alias_workaround.cc",
      "alias_workaround.h",
      "c_ulib_header_output.cc",
      "category_output.cc",
      "cdecl_output.cc",
      "go_syscalls_output.cc",
      "go_vdso_output.cc",
      "json_output.cc",
      "kernel_wrappers_output.cc",
      "ktrace_output.cc",
      "output_util.cc",
      "output_util.h",
      "outputs.h",
      "rust_output.cc",
      "string_util.cc",
      "string_util.h",
      "syscall_library.cc",
      "syscall_library.h",
      "syscall_numbers_output.cc",
      "writer.cc",
      "writer.h",
    ]

    deps = [ "$zx/system/public" ]

    public_deps = [ "$zx/../third_party/rapidjson" ]
  }

  zx_host_tool("kazoo") {
    configs += [ ":kazoo_config" ]

    if (zx != "/") {
      # The Fuchsia infra scripts will error if there are two host tools
      # with the same name, even if they are generated in different directories.
      # Note that this requires any compiled_action() instance to use
      # "//zircon/tools/kazoo" for the 'tool' argument, and
      # "kazoo-gn" for the 'tool_output_name' argument.
      output_name = "kazoo-gn"
    }

    sources = [ "main.cc" ]

    deps = [ ":kazoo_lib" ]
    if (zx == "/") {
      deps += [ "$zx/system/ulib/cmdline" ]
    } else {
      deps += [ "$zx/public/lib/cmdline" ]
    }
  }

  group("tests") {
    testonly = true
    deps = [
      ":kazoo-syscall-golden-test",
      ":kazoo-unittests",
    ]
  }

  zx_test("kazoo-unittests") {
    configs += [ ":kazoo_config" ]
    output_name = "kazoo-test"

    deps = [
      ":generate_test_files",
      ":kazoo_lib",
    ]

    # The "../.." is so that the generated files can be included with a
    # "tools/kazoo/" prefix.
    include_dirs = [ "$target_gen_dir/../.." ]

    sources = [
      "alias_workaround_test.cc",
      "c_ulib_header_output_test.cc",
      "category_output_test.cc",
      "cdecl_output_test.cc",
      "go_syscalls_output_test.cc",
      "go_vdso_output_test.cc",
      "json_output_test.cc",
      "kernel_wrappers_output_test.cc",
      "ktrace_output_test.cc",
      "output_util_test.cc",
      "rust_output_test.cc",
      "string_util_test.cc",
      "syscall_library_test.cc",
      "syscall_numbers_output_test.cc",
      "test_main.cc",
      "writer_test.cc",
    ]
  }

  zx_host_tool_action_foreach("test_files_fidl_to_json") {
    tool = "$zx/tools/fidl:fidlc"

    args = [
      "--json",
      rebase_path("$target_gen_dir") + "/{{source_name_part}}.json",
      "--files",
      "{{source}}",
      rebase_path("$zx/vdso/zx_common.fidl"),
      rebase_path("$zx/vdso/zx_syscall.fidl"),
    ]

    outputs = [ "$target_gen_dir/{{source_name_part}}.json" ]

    sources = [
      "test_aliases.test.fidl",
      "test_go_nonblocking.test.fidl",
      "test_go_reserved_words.test.fidl",
      "test_kernel_cases.test.fidl",
      "test_kernelwrappers.test.fidl",
      "test_no_methods.test.fidl",
      "test_one_protocol_one_method.test.fidl",
      "test_one_protocol_two_methods.test.fidl",
      "test_one_protocol_two_methods_with_internal.test.fidl",
      "test_out_voidptr.test.fidl",
      "test_ownership_annotations.test.fidl",
      "test_pointers_and_vectors.test.fidl",
      "test_rights_specs.test.fidl",
      "test_rust_selection.test.fidl",
      "test_selection.test.fidl",
      "test_various_categories.test.fidl",
      "test_vdsowrappers.test.fidl",
    ]
  }

  zx_host_tool_action_foreach("test_files_fidl_to_json_zxio") {
    tool = "$zx/tools/fidl:fidlc"

    args = [
      "--json",
      rebase_path("$target_gen_dir") + "/{{source_name_part}}.json",
      "--files",
      "{{source}}",

      # No zx fidls here compared with above.
    ]

    outputs = [ "$target_gen_dir/{{source_name_part}}.json" ]

    sources = [
      "test_ulib_bits.test.fidl",
      "test_ulib_enums.test.fidl",
      "test_ulib_tables.test.fidl",
      "test_ulib_type_aliases.test.fidl",
    ]
  }

  action_foreach("generate_test_files") {
    script = "fidl_to_h.py"

    deps = [
      ":test_files_fidl_to_json",
      ":test_files_fidl_to_json_zxio",
    ]

    args = [
      "{{source}}",
      rebase_path("$target_gen_dir") + "/test_ir_{{source_name_part}}.h",
      "{{source_name_part}}",
    ]

    outputs = [ "$target_gen_dir/test_ir_{{source_name_part}}.h" ]

    sources = get_target_outputs(":test_files_fidl_to_json") +
              get_target_outputs(":test_files_fidl_to_json_zxio")
  }

  fidlc_rspfile = "$target_gen_dir/fidlc.rspfile"
  link_output_rspfile("fidlc.rspfile") {
    visibility = [ ":*" ]
    outputs = [ fidlc_rspfile ]
    deps = [ "$zx/tools/fidl:fidlc" ]
  }

  kazoo_rspfile = "$target_gen_dir/kazoo.rspfile"
  link_output_rspfile("kazoo.rspfile") {
    visibility = [ ":*" ]
    outputs = [ kazoo_rspfile ]
    deps = [ ":kazoo" ]
  }

  action("kazoo-syscall-golden-test") {
    deps = [
      ":fidlc.rspfile",
      ":kazoo.rspfile",
    ]

    fidlc = get_target_outputs(deps[0])
    assert(fidlc == [ fidlc[0] ])
    fidlc = fidlc[0]

    kazoo = get_target_outputs(deps[1])
    assert(kazoo == [ kazoo[0] ])
    kazoo = kazoo[0]

    script = "golden-test"
    sources = [
      "golden.txt",
      fidlc,
      kazoo,
    ]
    foreach(fidl, all_syscall_fidl_files) {
      sources += [ "../../vdso/" + fidl ]
    }

    outputs = [ "$target_gen_dir/kazoo-golden-test" ]

    args = [
      "--builddir",
      root_build_dir,
      "--fidlc",
      fidlc,
      "--kazoo",
      kazoo,
      "--syscalls",
      rebase_path("../../vdso"),
      "--output-touch",
      outputs[0],
      "--tmp-base",
      target_gen_dir,
    ]
  }
}
