# Copyright 2014 The Chromium Authors. All rights reserved.
# 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.
#
#   dynamic_guid (optional)
#       If the GUID is not constant across builds, the current GUID.
#
#   deps (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.dynamic_guid)) {
    dynamic_guid = invoker.dynamic_guid
  } else {
    dynamic_guid = "none"
  }

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

  dlldata_file = "{{source_name_part}}.dlldata.c"
  interface_identifier_file = "{{source_name_part}}_i.c"
  proxy_file = "{{source_name_part}}_p.c"
  type_library_file = "{{source_name_part}}.tlb"

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

    sources = invoker.sources

    # Note that .tlb is not included in the outputs as it is not always
    # generated depending on the content of the input idl file.
    outputs = [
      "$out_dir/$header_file",
      "$out_dir/$dlldata_file",
      "$out_dir/$interface_identifier_file",
      "$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 {
      assert(false, "Need environment for this arch")
    }

    args = [
      win_tool_arch,
      rebase_path(out_dir, root_build_dir),
      dynamic_guid,
      type_library_file,
      header_file,
      dlldata_file,
      interface_identifier_file,
      proxy_file,
      "{{source}}",
      "/char",
      "signed",
      "/env",
      idl_target_platform,
      "/Oicf",
    ]

    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",
    ]
  }
}
