# 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.
#
#   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" ])
  }

  source_set(target_name) {
    forward_variables_from(invoker, [ "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" ]
  }
}
