1 # Copyright 2014 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 assert(is_win) 6 7 import("//build/config/win/visual_studio_version.gni") 8 9 # This template defines a rule to invoke the MS IDL compiler. 10 # 11 # Parameters 12 # 13 # sources 14 # List of .idl file to process. 15 # 16 # out_dir (optional) 17 # Directory to write the generated files to. Defaults to target_gen_dir. 18 # 19 # visibility (optional) 20 21 template("midl") { 22 action_name = "${target_name}_idl_action" 23 source_set_name = target_name 24 25 assert(defined(invoker.sources), "Source must be defined for $target_name") 26 27 if (defined(invoker.out_dir)) { 28 out_dir = invoker.out_dir 29 } else { 30 out_dir = target_gen_dir 31 } 32 33 header_file = "{{source_name_part}}.h" 34 dlldata_file = "{{source_name_part}}.dlldata.c" 35 interface_identifier_file = "{{source_name_part}}_i.c" 36 proxy_file = "{{source_name_part}}_p.c" 37 type_library_file = "{{source_name_part}}.tlb" 38 39 action_foreach(action_name) { 40 visibility = [ ":$source_set_name" ] 41 42 # This functionality is handled by the win-tool because the GYP build has 43 # MIDL support built-in. 44 # TODO(brettw) move this to a separate MIDL wrapper script for better 45 # clarity once GYP support is not needed. 46 script = "$root_build_dir/gyp-win-tool" 47 48 sources = invoker.sources 49 50 # Note that .tlb is not included in the outputs as it is not always 51 # generated depending on the content of the input idl file. 52 outputs = [ 53 "$out_dir/$header_file", 54 "$out_dir/$dlldata_file", 55 "$out_dir/$interface_identifier_file", 56 "$out_dir/$proxy_file", 57 ] 58 59 if (cpu_arch == "x86") { 60 win_tool_arch = "environment.x86" 61 idl_target_platform = "win32" 62 } else if (cpu_arch == "x64") { 63 win_tool_arch = "environment.x64" 64 idl_target_platform = "x64" 65 } else { 66 assert(false, "Need environment for this arch") 67 } 68 69 args = [ 70 "midl-wrapper", win_tool_arch, 71 rebase_path(out_dir, root_build_dir), 72 type_library_file, 73 header_file, 74 dlldata_file, 75 interface_identifier_file, 76 proxy_file, 77 "{{source}}", 78 "/char", "signed", 79 "/env", idl_target_platform, 80 "/Oicf", 81 ] 82 83 foreach(include, system_include_dirs) { 84 args += [ "/I", include ] 85 } 86 } 87 88 source_set(target_name) { 89 if (defined(invoker.visibility)) { 90 visibility = invoker.visibility 91 } 92 93 # We only compile the IID files from the IDL tool rather than all outputs. 94 sources = process_file_template( 95 invoker.sources, 96 [ "$out_dir/$interface_identifier_file" ]) 97 98 deps = [ ":$action_name" ] 99 } 100 } 101