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

group("vdso") {
  public_deps = [ ":zx" ]
}

group("json") {
  public_deps = [ ":zx.json" ]
}

# The system calls are defined as if they were a FIDL library, because
# kazoo consumes the FIDL JSON IR (generated below).  This cannot be used
# like a normal fidl_library, however.  Only the "json" subtarget is
# available.
#
# TODO(fxbug.dev/7802): Merge with vdso/zx:zx.
fidl_library("zx") {
  visibility = [ ":*" ]
  targets = [ "fidl_json_rspfile" ]
  sources = [
    "alias_workarounds.fidl",
    "bti.fidl",
    "cache.fidl",
    "channel.fidl",
    "clock.fidl",
    "cprng.fidl",
    "debug.fidl",
    "debuglog.fidl",
    "event.fidl",
    "eventpair.fidl",
    "exception.fidl",
    "fifo.fidl",
    "framebuffer.fidl",
    "futex.fidl",
    "guest.fidl",
    "handle.fidl",
    "interrupt.fidl",
    "iommu.fidl",
    "ioports.fidl",
    "job.fidl",
    "ktrace.fidl",
    "misc.fidl",
    "mtrace.fidl",
    "object.fidl",
    "pager.fidl",
    "pc.fidl",
    "pci.fidl",
    "pmt.fidl",
    "port.fidl",
    "process.fidl",
    "profile.fidl",
    "resource.fidl",
    "rights.fidl",
    "smc.fidl",
    "socket.fidl",
    "stream.fidl",
    "syscall.fidl",
    "system.fidl",
    "task.fidl",
    "thread.fidl",
    "timer.fidl",
    "vcpu.fidl",
    "vmar.fidl",
    "vmo.fidl",
    "zx_common.fidl",
    "zx_syscall.fidl",
  ]
}

# The generated stuff is identical regardless of how it gets compiled.
# Dependents must use "$zx/vdso:public($default_toolchain)" or
# "$zx/vdso:private($default_toolchain)".
assert(current_toolchain == default_toolchain)

# This provides the public headers that go with the vDSO API, which are
# seen as <zircon/...>.
group("public") {
  visibility = [ "$zx/system/ulib/zircon/*" ]
  public_configs = [ ":public.config" ]
  public_deps = [ ":generate" ]
}

public_gen_dir = "$root_gen_dir/include/zircon/syscalls"
config("public.config") {
  visibility = [ ":public" ]
  include_dirs = [ "$root_gen_dir/include" ]
}

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

private_gen_dir = "$target_gen_dir/include/lib/syscalls"
config("private.config") {
  visibility = [ ":private" ]
  include_dirs = [ "$target_gen_dir/include" ]
}

# The FIDL compiler translates the sources into generic FIDL JSON IR.
# This collects the location of that file.
json_rspfile = "$target_gen_dir/json.rspfile"
link_output_rspfile("json.rspfile") {
  visibility = [ ":*" ]
  outputs = [ json_rspfile ]
  deps = [ ":json" ]
}

# The kazoo compiler translates FIDL's IR into syscall-oriented outputs.
# These are logically distinct things that are used by different modules in
# the kernel or in public library code.  But they all depend on the same
# inputs, the front-end work is the same for each one, and the back-end
# work is not very costly.  So doing a single kazoo run to generate them
# all together is faster than parallelizing the independent generation
# steps that duplicate redundant process overhead and front-end work.

public_generated = [
  {
    args = [ "--json" ]
    outputs = [ "$public_gen_dir/definitions.json" ]
  },
  {
    args = [ "--public-header" ]
    outputs = [ "$public_gen_dir/internal/cdecls.inc" ]
  },
  {
    args = [ "--rust" ]
    outputs = [ "$public_gen_dir/definitions.rs" ]
  },
]

if (!exclude_testonly_syscalls) {
  public_generated += [
    {
      args = [ "--testonly-public-header" ]
      outputs = [ "$public_gen_dir/internal/testonly-cdecls.inc" ]
    },
  ]
}

private_generated = [
  {
    args = [ "--category" ]
    outputs = [ "$private_gen_dir/category.inc" ]
  },
  {
    args = [ "--syscall-numbers" ]
    outputs = [ "$private_gen_dir/zx-syscall-numbers.h" ]
  },
  {
    args = [ "--kernel-header" ]
    outputs = [ "$private_gen_dir/kernel.inc" ]
  },
  {
    args = [ "--kernel-wrappers" ]
    outputs = [ "$private_gen_dir/kernel-wrappers.inc" ]
  },
  {
    args = [ "--private-header" ]
    outputs = [ "$private_gen_dir/syscalls.inc" ]
  },
]

host_tool_action("generate") {
  visibility = [
    ":private",
    ":public",
  ]

  tool = "$zx/tools/kazoo"

  args = []
  if (exclude_testonly_syscalls) {
    args += [ "--exclude=testonly" ]
  }

  outputs = []
  foreach(gen, public_generated + private_generated) {
    args += gen.args + rebase_path(gen.outputs, root_build_dir)
    outputs += gen.outputs
  }

  deps = [ ":json.rspfile" ]
  sources = get_target_outputs(deps[0])
  assert(sources == [ sources[0] ])  # There can be only one.
  args += [ "@" + rebase_path(sources[0], root_build_dir) ]

  metadata = {
    generated_sources = rebase_path(outputs, root_build_dir)
  }
}
