# 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.
#
# Parameters
#
#   sources
#      List of .idl file to process.
#
#   out_dir (optional)
#       Directory to write the generated files to. Defaults to target_gen_dir.
#
#   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
  }

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

    # This functionality is handled by the win-tool because the GYP build has
    # MIDL support built-in.
    # TODO(brettw) move this to a separate MIDL wrapper script for better
    # clarity once GYP support is not needed.
    script = "$root_build_dir/gyp-win-tool"

    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 = [
      "midl-wrapper",
      win_tool_arch,
      rebase_path(out_dir, root_build_dir),
      type_library_file,
      header_file,
      dlldata_file,
      interface_identifier_file,
      proxy_file,
      "{{source}}",
      "/char",
      "signed",
      "/env",
      idl_target_platform,
      "/Oicf",
    ]
  }

  source_set(target_name) {
    if (defined(invoker.visibility)) {
      visibility = 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" ])

    deps = [
      ":$action_name",
    ]
  }
}
