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

import("$zx_build/public/gn/migrated_targets.gni")

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

if (zx != "/") {
  group("headers") {
    public_configs = [ ":headers.config" ]
  }

  config("headers.config") {
    include_dirs = [ "include" ]
  }
}

zx_library("fidl") {
  host = true
  sdk = "source"
  sdk_headers = []
  sdk_migrated = true
  sources = [
    "lib/attributes.cc",
    "lib/c_generator.cc",
    "lib/check.cc",
    "lib/coded_types_generator.cc",
    "lib/diagnostic_types.cc",
    "lib/diagnostics_json.cc",
    "lib/experimental_flags.cc",
    "lib/findings_json.cc",
    "lib/flat_ast.cc",
    "lib/formatter.cc",
    "lib/json_generator.cc",
    "lib/lexer.cc",
    "lib/linter.cc",
    "lib/linting_tree_callbacks.cc",
    "lib/names.cc",
    "lib/ordinals.cc",
    "lib/parser.cc",
    "lib/raw_ast.cc",
    "lib/reporter.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",
  ]
  if (zx == "/") {
    deps += [ "$zx/third_party/ulib/boringssl" ]
  } else {
    deps += [ "//third_party/boringssl" ]
  }

  if (zx == "/") {
    assert_no_deps = [ "//zircon/system/public" ]
  }
  configs += [ ":fidlc_config" ]
}

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") {
  if (current_os != "fuchsia") {
    deps = [
      ":fidl-format",
      ":fidl-lint",
      ":fidlc",
    ]
  }
}

if (current_os != "fuchsia") {
  zx_host_tool("fidlc") {
    sources = [ "compiler/main.cc" ]
    deps = [ ":fidl" ]
    sdk_migrated = true
  }

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

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

  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/../tools/fidl/fidlgen_llcpp"
    go_package = "fidl/compiler/llcpp_backend"
  }
}
