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

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

    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
  }

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

    public_deps = [
      ":$action_name",
    ]

    config("midl_warnings") {
      if (is_clang) {
        # MIDL generates code like "#endif !_MIDL_USE_GUIDDEF_"
        cflags = [ "-Wno-extra-tokens" ]
      }
    }
    configs += [ ":midl_warnings" ]
  }
}
