| # 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 (cpu_arch == "x86") { | 
 |       win_tool_arch = "environment.x86" | 
 |       idl_target_platform = "win32" | 
 |     } else if (cpu_arch == "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", | 
 |     ] | 
 |   } | 
 | } |