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

declare_args() {
  fidlc_union_not_simple = false
  fidlc_deprecate_c_unions = false
}

config("fidlc_config") {
  defines = []
  if (defined(fidlc_deprecate_c_unions) && fidlc_deprecate_c_unions) {
    defines += [ "FIDLC_DEPRECATE_C_UNIONS" ]
  }
}

if (defined(zx)) {
  zx_library("fidl") {
    host = true
    sources = [
      "lib/attributes.cc",
      "lib/c_generator.cc",
      "lib/coded_types_generator.cc",
      "lib/error_reporter.cc",
      "lib/experimental_flags.cc",
      "lib/findings_json.cc",
      "lib/flat_ast.cc",
      "lib/formatter.cc",
      "lib/json_generator.cc",
      "lib/lexer.cc",
      "lib/library_zx.cc",
      "lib/linter.cc",
      "lib/linting_tree_callbacks.cc",
      "lib/names.cc",
      "lib/ordinals.cc",
      "lib/parser.cc",
      "lib/raw_ast.cc",
      "lib/source_file.cc",
      "lib/source_manager.cc",
      "lib/source_span.cc",
      "lib/tables_generator.cc",
      "lib/template_string.cc",
      "lib/tree_visitor.cc",
      "lib/type_shape.cc",
      "lib/utils.cc",
      "lib/virtual_source_file.cc",
    ]
    public_deps = [
      "$zx/system/ulib/cmdline:headers",
      "$zx/system/ulib/fit:headers",
      "$zx/third_party/ulib/safemath",
    ]
    deps = [
      ":json_schema",
      "$zx/system/ulib/cmdline",
      "$zx/system/ulib/fit",
      "$zx/third_party/ulib/uboringssl",
    ]
    configs += [ ":fidlc_config" ]
    public_configs = [ "$zx/public/gn/config:Wno-unused-function" ]
  }

  source_set("json_schema") {
    visibility = [ ":*" ]
    sources = [ "$target_gen_dir/json_schema.cc" ]
    deps = [
      ":gen-json-schema",
      ":headers",
    ]
  }

  action("gen-json-schema") {
    visibility = [ ":json_schema" ]
    outputs = [ "$target_gen_dir/json_schema.cc" ]
    sources = [ "schema.json" ]
    script = "gen-json-schema.sh"
    args = rebase_path(outputs, root_build_dir) +
           rebase_path(sources, root_build_dir)
  }

  group("tools") {
    deps = [
      ":fidl-format",
      ":fidl-lint",
      ":fidlc",
    ]
  }

  zx_host_tool("fidlc") {
    sources = [ "compiler/main.cc" ]
    deps = [ ":fidl" ]
  }

  zx_host_tool("fidl-format") {
    sources = [ "formatter/main.cc" ]
    deps = [ ":fidl" ]
  }

  zx_host_tool("fidl-lint") {
    sources = [
      "linter/command_line_options.cc",
      "linter/main.cc",
    ]
    deps = [ ":fidl" ]
  }

  template("fidlgen_executable") {
    assert(current_os != "fuchsia")
    assert(defined(invoker.go_path))
    assert(defined(invoker.go_package))

    if (defined(invoker.output_name)) {
      output_name = invoker.output_name
    } else {
      output_name = target_name
    }
    output_path = "${target_gen_dir}/${output_name}"
    depfile_path = "${output_path}.d"

    go_root = "$zx/../prebuilt/third_party/go/${host_platform}"
    go_executable = "${go_root}/bin/go"
    godepfile_executable =
        "$zx/../prebuilt/tools/godepfile/${host_platform}/godepfile"

    go_cache = "${root_build_dir}/gocache"

    if (current_os == "mac") {
      go_os = "darwin"
    } else {
      go_os = current_os
    }
    if (current_cpu == "x64") {
      go_arch = "amd64"
    } else {
      go_arch = current_cpu
    }

    action(target_name) {
      script = "build_fidlgen_executable.sh"
      # go_root, go_path, go_cache must be absolute.
      args = [
        rebase_path(go_executable, root_build_dir),
        rebase_path(godepfile_executable, root_build_dir),
        rebase_path(go_root),
        rebase_path(invoker.go_path),
        invoker.go_package,
        go_os,
        go_arch,
        rebase_path(depfile_path, root_build_dir),
        rebase_path(output_path, root_build_dir),
        rebase_path(go_cache),
      ]
      depfile = depfile_path
      inputs = [
        go_executable,
        godepfile_executable,
      ]
      outputs = [ output_path ]

      # See host_tool_action().
      metadata = {
        # Dependencies come before the "--".
        host_tool_rspfile = rebase_path(inputs, root_build_dir)
        host_tool_rspfile += [ "--" ]

        # The command line to run comes after the "--".
        host_tool_rspfile += [ rebase_path(output_path, root_build_dir) ]
      }
    }
  }

  fidlgen_executable("fidlgen_llcpp") {
    go_path = "$zx/../garnet/go"
    go_package = "fidl/compiler/llcpp_backend"
  }
} else {
  # TODO(BLD-353): Referenced by //garnet/public/lib/fidl/fuzz:compiler.

  config("fidl_config") {
    visibility = [ ":*" ]
    include_dirs = [ "include" ]
  }

  source_set("compiler") {
    public_configs = [ ":fidl_config" ]
    sources = [
      "lib/attributes.cc",
      "lib/c_generator.cc",
      "lib/error_reporter.cc",
      "lib/findings_json.cc",
      "lib/flat_ast.cc",
      "lib/formatter.cc",
      "lib/json_generator.cc",
      "lib/lexer.cc",
      "lib/library_zx.cc",
      "lib/linter.cc",
      "lib/names.cc",
      "lib/parser.cc",
      "lib/raw_ast.cc",
      "lib/source_file.cc",
      "lib/source_manager.cc",
      "lib/source_span.cc",
      "lib/tables_generator.cc",
      "lib/tree_visitor.cc",
      "lib/type_shape.cc",
    ]
  }
}
