# 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/fidl/fidl.gni")
import("//zircon/tools/zither/zither_golden_files.gni")
import("vdso.gni")

group("vdso") {
  deps = [ ":zx($fidl_toolchain)" ]
}

# See //zircon/tools/zither:tests, which covers the files generation from
# library zx.
group("tests") {
  testonly = true
  deps = []
}

# This is the zx library used by internal FIDL backends. For the library
# imported by `using zx;` in regular FIDL libraries, see
# //zircon/vdso/zx/BUILD.gn.
fidl("zx") {
  visibility = [
    ":*",
    "//zircon/tools/zither:tests",
  ]

  platform = "fuchsia"

  sources = [
    "bti.fidl",
    "cache.fidl",
    "channel.fidl",
    "clock.fidl",
    "cprng.fidl",
    "debug.fidl",
    "debuglog.fidl",
    "errors.fidl",
    "event.fidl",
    "eventpair.fidl",
    "exception.fidl",
    "fifo.fidl",
    "framebuffer.fidl",
    "futex.fidl",
    "guest.fidl",
    "handle.fidl",
    "interrupt.fidl",
    "iob.fidl",
    "iommu.fidl",
    "ioports.fidl",
    "job.fidl",
    "ktrace.fidl",
    "misc.fidl",
    "msi.fidl",
    "mtrace.fidl",
    "object.fidl",
    "overview.fidl",
    "pager.fidl",
    "pc.fidl",
    "pci.fidl",
    "pmt.fidl",
    "port.fidl",
    "process.fidl",
    "profile.fidl",
    "resource.fidl",
    "restricted.fidl",
    "rights.fidl",
    "sampler.fidl",
    "smc.fidl",
    "socket.fidl",
    "stream.fidl",
    "system.fidl",
    "task.fidl",
    "thread.fidl",
    "timer.fidl",
    "types.fidl",
    "vcpu.fidl",
    "vmar.fidl",
    "vmo.fidl",
    "zx_common.fidl",
  ]

  if (!exclude_testonly_syscalls) {
    sources += [ "syscall.test.fidl" ]
  }

  # TODO(https://fxbug.dev/42061412): Burn these down.
  experimental_flags = [ "zx_c_types" ]

  enable_zither = true
  enable_cpp = false
  enable_rust = false

  zither = {
    asm = {
      # While "zx" headers are currently stratified across zircon/* and
      # zircon/syscalls/*, at this time we only use the assembly backend to
      # generate checked-in headers in the former include namespace (i.e.,
      # <zircon/errors.h>).
      output_namespace = "zircon"
    }
  }
}

zither_golden_files("ifs") {
  fidl = ":zx"
  backend = "zircon_ifs"
  sources = [ "//src/zircon/lib/zircon/zircon.ifs" ]
}

# TODO(https://fxbug.dev/42128146): Consumption of this header in assembly should be
# migrated over to using the assembly backend directly, at which point this
# header should be generated by the C backend, complete with C-style casts.
zither_golden_files("zx.asm.checked-in") {
  fidl = ":zx"
  backend = "asm"
  sources = [ "//zircon/system/public/zircon/errors.h" ]
}

# Depended on by //zircon/public/sysroot/sdk:sysroot_sdk.
group("sysroot_sdk") {
  deps = [ ":zx.asm.checked-in" ]
}

# TODO(joshuaseaton): Do not let our use of a "library zx" here propagate up to
# SDK build logic that would then consider this an "SDK library": there is
# already another library zx in the SDK and so this prevents collision.
barrier_metadata = {
  fidl_json_barrier = []
}

# This provides the public headers that go with the vDSO API, which are
# seen as <zircon/...>.
group("public") {
  visibility = [
    "//src/zircon/lib/zircon/*",
    "//zircon/kernel/lib/userabi/vdso/*",
    "//zircon/public/sysroot/*",
  ]
  public_deps = [ ":zx_zither.legacy_syscall_cdecl" ]
  metadata = barrier_metadata
}

# This provides the private headers used by the kernel and vDSO
# implementation, which are seen as <lib/syscalls/...>.
group("private") {
  visibility = [
    "//zircon/kernel/lib/syscalls/*",
    "//zircon/kernel/lib/userabi/*",
    "//zircon/system/ulib/syscalls-headers/*",
  ]
  public_deps = [ ":zx_zither.kernel" ]
  metadata = barrier_metadata
}

group("fuchsia-zircon-sys") {
  # //src/lib/zircon/rust:fuchsia-zircon re-exports the contents of the
  # crate generated by the zither.rust_syscall backend.
  visibility = [ "//src/lib/zircon/rust:*" ]
  public_deps = [ ":zx_zither.rust_syscall" ]
  metadata = barrier_metadata
}

# Used to publish reference documentation.
if (current_toolchain == default_toolchain) {
  action("syscall_docs.zip") {
    # Depend on  the internal backend target.
    deps = [ ":zx_zither.syscall_docs.gen" ]

    # The output manifest is always first, per a private contract with
    # zither_library().
    inputs = get_target_outputs(deps[0])
    outputs = [ "${target_out_dir}/syscall_docs.zip" ]

    script = "//zircon/tools/zither/scripts/create-doc-archive.py"
    args = [
      "--source-file-manifest",
      rebase_path(inputs[0], root_build_dir),
      "--output",
      rebase_path(outputs[0], root_build_dir),
    ]
  }
}
