# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

assert(is_win)

import("//build/config/win/visual_studio_version.gni")

# This template defines a rule to invoke the MS IDL compiler. The generated
# source code will be compiled and linked into targets that depend on this.
#
# Parameters
#
#   sources
#       List of .idl file to process.
#
#   header_file (optional)
#       File name of generated header file.  Defaults to the basename of the
#       source idl file with a .h extension.
#
#   out_dir (optional)
#       Directory to write the generated files to. Defaults to target_gen_dir.
#
#   generated_dir (optional)
#       Directory where generated files were previously persisted.
#       Defaults to third_party\win_build_output\midl\|out_dir|.
#
#   dynamic_guids (optional)
#       If the GUIDs are not constant across builds, the current GUID
#       substitutions.
#       |dynamic_guids| is of the form:
#         "PLACEHOLDER-GUID-158428a4-6014-4978-83ba-9fad0dabe791="
#         "3d852661-c795-4d20-9b95-5561e9a1d2d9,"
#         "PLACEHOLDER-GUID-63B8FFB1-5314-48C9-9C57-93EC8BC6184B="
#         "D0E1CACC-C63C-4192-94AB-BF8EAD0E3B83".
#       See midl.py for more details.
#
#   writes_tlb (optional)
#       Whether a .tlb file should be added to outputs. Defaults to false.
#
#   writes_proxy(optional)
#       Whether a _p.c file should be added to outputs. Defaults to true.
#
#   writes_dlldata(optional)
#       Whether a .dlldata.c file should be added to outputs. Defaults to true.
#
#   deps (optional)
#
#   defines (optional)
#       Build time defines to be passed to midl.exe as /D parameter.
#
#   testonly (optional)
#
#   visibility (optional)

template("midl") {
  action_name = "${target_name}_idl_action"
  source_set_name = target_name

  assert(defined(invoker.sources), "Source must be defined for $target_name")

  if (defined(invoker.out_dir)) {
    out_dir = invoker.out_dir
  } else {
    out_dir = target_gen_dir
  }

  if (defined(invoker.generated_dir)) {
    generated_dir = rebase_path(invoker.generated_dir, root_build_dir)
  } else {
    # midl.py expects 'gen' to be replaced with 'midl'.
    generated_dir =
        rebase_path("//third_party/win_build_output", root_build_dir) +
        "/midl/" + rebase_path(out_dir, root_gen_dir)
  }

  if (defined(invoker.dynamic_guids)) {
    dynamic_guids = invoker.dynamic_guids
  } else {
    dynamic_guids = "none"
  }

  if (defined(invoker.header_file)) {
    header_file = invoker.header_file
  } else {
    header_file = "{{source_name_part}}.h"
  }

  if (defined(invoker.writes_tlb)) {
    writes_tlb = invoker.writes_tlb
  } else {
    writes_tlb = false
  }

  if (defined(invoker.writes_proxy)) {
    writes_proxy = invoker.writes_proxy
  } else {
    writes_proxy = true
  }

  if (defined(invoker.writes_dlldata)) {
    writes_dlldata = invoker.writes_dlldata
  } else {
    writes_dlldata = true
  }

  if (writes_tlb) {
    type_library_file = "{{source_name_part}}.tlb"
  } else {
    type_library_file = "none"
  }

  if (writes_dlldata) {
    dlldata_file = "{{source_name_part}}.dlldata.c"
  } else {
    dlldata_file = "none"
  }

  if (writes_proxy) {
    proxy_file = "{{source_name_part}}_p.c"
  } else {
    proxy_file = "none"
  }

  interface_identifier_file = "{{source_name_part}}_i.c"

  action_foreach(action_name) {
    visibility = [ ":$source_set_name" ]
    script = "//build/toolchain/win/midl.py"

    sources = invoker.sources

    outputs = [
      "$out_dir/$header_file",
      "$out_dir/$interface_identifier_file",
    ]

    # These files are only added to outputs if the invoker so desires, as it
    # they are not always generated depending on the content of the input idl
    # file.
    if (writes_tlb) {
      outputs += [ "$out_dir/$type_library_file" ]
    }
    if (writes_dlldata) {
      outputs += [ "$out_dir/$dlldata_file" ]
    }
    if (writes_proxy) {
      outputs += [ "$out_dir/$proxy_file" ]
    }

    if (current_cpu == "x86") {
      win_tool_arch = "environment.x86"
      idl_target_platform = "win32"
    } else if (current_cpu == "x64") {
      win_tool_arch = "environment.x64"
      idl_target_platform = "x64"
    } else if (current_cpu == "arm64") {
      win_tool_arch = "environment.arm64"
      idl_target_platform = "arm64"
    } else {
      assert(false, "Need environment for this arch")
    }

    args = [
      win_tool_arch,
      generated_dir,
      rebase_path(out_dir, root_build_dir),
      dynamic_guids,
      type_library_file,
      header_file,
      dlldata_file,
      interface_identifier_file,
      proxy_file,
      rebase_path("//third_party/llvm-build/Release+Asserts/bin/clang-cl.exe",
                  root_build_dir),
      "{{source}}",
      "/char",
      "signed",
      "/env",
      idl_target_platform,
      "/Oicf",
    ]

    if (defined(invoker.defines)) {
      foreach(define, invoker.defines) {
        args += [ "/D" + define ]
      }
    }

    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])
  }

  source_set(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    # We only compile the IID files from the IDL tool rather than all outputs.
    sources = process_file_template(invoker.sources,
                                    [ "$out_dir/$interface_identifier_file" ])

    public_deps = [ ":$action_name" ]
  }
}
