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

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

group("json") {
  public_deps = [ ":zz.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(39732): Rename to "zx".
fidl_library("zz") {
  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.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)
  }
}
