1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Workerassert(is_win) 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerimport("//build/config/win/visual_studio_version.gni") 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker# This template defines a rule to invoke the MS IDL compiler. The generated 10*6777b538SAndroid Build Coastguard Worker# source code will be compiled and linked into targets that depend on this. 11*6777b538SAndroid Build Coastguard Worker# 12*6777b538SAndroid Build Coastguard Worker# Parameters 13*6777b538SAndroid Build Coastguard Worker# 14*6777b538SAndroid Build Coastguard Worker# sources 15*6777b538SAndroid Build Coastguard Worker# List of .idl file to process. 16*6777b538SAndroid Build Coastguard Worker# 17*6777b538SAndroid Build Coastguard Worker# header_file (optional) 18*6777b538SAndroid Build Coastguard Worker# File name of generated header file. Defaults to the basename of the 19*6777b538SAndroid Build Coastguard Worker# source idl file with a .h extension. 20*6777b538SAndroid Build Coastguard Worker# 21*6777b538SAndroid Build Coastguard Worker# out_dir (optional) 22*6777b538SAndroid Build Coastguard Worker# Directory to write the generated files to. Defaults to target_gen_dir. 23*6777b538SAndroid Build Coastguard Worker# 24*6777b538SAndroid Build Coastguard Worker# generated_dir (optional) 25*6777b538SAndroid Build Coastguard Worker# Directory where generated files were previously persisted. 26*6777b538SAndroid Build Coastguard Worker# Defaults to third_party\win_build_output\midl\|out_dir|. 27*6777b538SAndroid Build Coastguard Worker# 28*6777b538SAndroid Build Coastguard Worker# dynamic_guids (optional) 29*6777b538SAndroid Build Coastguard Worker# If the GUIDs are not constant across builds, the current GUID 30*6777b538SAndroid Build Coastguard Worker# substitutions. 31*6777b538SAndroid Build Coastguard Worker# |dynamic_guids| is of the form: 32*6777b538SAndroid Build Coastguard Worker# "PLACEHOLDER-GUID-158428a4-6014-4978-83ba-9fad0dabe791=" 33*6777b538SAndroid Build Coastguard Worker# "3d852661-c795-4d20-9b95-5561e9a1d2d9," 34*6777b538SAndroid Build Coastguard Worker# "PLACEHOLDER-GUID-63B8FFB1-5314-48C9-9C57-93EC8BC6184B=" 35*6777b538SAndroid Build Coastguard Worker# "D0E1CACC-C63C-4192-94AB-BF8EAD0E3B83". 36*6777b538SAndroid Build Coastguard Worker# See midl.py for more details. 37*6777b538SAndroid Build Coastguard Worker# 38*6777b538SAndroid Build Coastguard Worker# writes_tlb (optional) 39*6777b538SAndroid Build Coastguard Worker# Whether a .tlb file should be added to outputs. Defaults to false. 40*6777b538SAndroid Build Coastguard Worker# 41*6777b538SAndroid Build Coastguard Worker# writes_proxy(optional) 42*6777b538SAndroid Build Coastguard Worker# Whether a _p.c file should be added to outputs. Defaults to true. 43*6777b538SAndroid Build Coastguard Worker# 44*6777b538SAndroid Build Coastguard Worker# writes_dlldata(optional) 45*6777b538SAndroid Build Coastguard Worker# Whether a .dlldata.c file should be added to outputs. Defaults to true. 46*6777b538SAndroid Build Coastguard Worker# 47*6777b538SAndroid Build Coastguard Worker# deps (optional) 48*6777b538SAndroid Build Coastguard Worker# 49*6777b538SAndroid Build Coastguard Worker# defines (optional) 50*6777b538SAndroid Build Coastguard Worker# Build time defines to be passed to midl.exe as /D parameter. 51*6777b538SAndroid Build Coastguard Worker# 52*6777b538SAndroid Build Coastguard Worker# visibility (optional) 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Workertemplate("midl") { 55*6777b538SAndroid Build Coastguard Worker action_name = "${target_name}_idl_action" 56*6777b538SAndroid Build Coastguard Worker source_set_name = target_name 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.sources), "Source must be defined for $target_name") 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker if (defined(invoker.out_dir)) { 61*6777b538SAndroid Build Coastguard Worker out_dir = invoker.out_dir 62*6777b538SAndroid Build Coastguard Worker } else { 63*6777b538SAndroid Build Coastguard Worker out_dir = target_gen_dir 64*6777b538SAndroid Build Coastguard Worker } 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker if (defined(invoker.generated_dir)) { 67*6777b538SAndroid Build Coastguard Worker generated_dir = rebase_path(invoker.generated_dir, root_build_dir) 68*6777b538SAndroid Build Coastguard Worker } else { 69*6777b538SAndroid Build Coastguard Worker # midl.py expects 'gen' to be replaced with 'midl'. 70*6777b538SAndroid Build Coastguard Worker generated_dir = 71*6777b538SAndroid Build Coastguard Worker rebase_path("//third_party/win_build_output", root_build_dir) + 72*6777b538SAndroid Build Coastguard Worker "/midl/" + rebase_path(out_dir, root_gen_dir) 73*6777b538SAndroid Build Coastguard Worker } 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker if (defined(invoker.dynamic_guids)) { 76*6777b538SAndroid Build Coastguard Worker dynamic_guids = invoker.dynamic_guids 77*6777b538SAndroid Build Coastguard Worker } else { 78*6777b538SAndroid Build Coastguard Worker dynamic_guids = "none" 79*6777b538SAndroid Build Coastguard Worker } 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker if (defined(invoker.header_file)) { 82*6777b538SAndroid Build Coastguard Worker header_file = invoker.header_file 83*6777b538SAndroid Build Coastguard Worker } else { 84*6777b538SAndroid Build Coastguard Worker header_file = "{{source_name_part}}.h" 85*6777b538SAndroid Build Coastguard Worker } 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker if (defined(invoker.writes_tlb)) { 88*6777b538SAndroid Build Coastguard Worker writes_tlb = invoker.writes_tlb 89*6777b538SAndroid Build Coastguard Worker } else { 90*6777b538SAndroid Build Coastguard Worker writes_tlb = false 91*6777b538SAndroid Build Coastguard Worker } 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker if (defined(invoker.writes_proxy)) { 94*6777b538SAndroid Build Coastguard Worker writes_proxy = invoker.writes_proxy 95*6777b538SAndroid Build Coastguard Worker } else { 96*6777b538SAndroid Build Coastguard Worker writes_proxy = true 97*6777b538SAndroid Build Coastguard Worker } 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker if (defined(invoker.writes_dlldata)) { 100*6777b538SAndroid Build Coastguard Worker writes_dlldata = invoker.writes_dlldata 101*6777b538SAndroid Build Coastguard Worker } else { 102*6777b538SAndroid Build Coastguard Worker writes_dlldata = true 103*6777b538SAndroid Build Coastguard Worker } 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker if (writes_tlb) { 106*6777b538SAndroid Build Coastguard Worker type_library_file = "{{source_name_part}}.tlb" 107*6777b538SAndroid Build Coastguard Worker } else { 108*6777b538SAndroid Build Coastguard Worker type_library_file = "none" 109*6777b538SAndroid Build Coastguard Worker } 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker if (writes_dlldata) { 112*6777b538SAndroid Build Coastguard Worker dlldata_file = "{{source_name_part}}.dlldata.c" 113*6777b538SAndroid Build Coastguard Worker } else { 114*6777b538SAndroid Build Coastguard Worker dlldata_file = "none" 115*6777b538SAndroid Build Coastguard Worker } 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker if (writes_proxy) { 118*6777b538SAndroid Build Coastguard Worker proxy_file = "{{source_name_part}}_p.c" 119*6777b538SAndroid Build Coastguard Worker } else { 120*6777b538SAndroid Build Coastguard Worker proxy_file = "none" 121*6777b538SAndroid Build Coastguard Worker } 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker interface_identifier_file = "{{source_name_part}}_i.c" 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker action_foreach(action_name) { 126*6777b538SAndroid Build Coastguard Worker visibility = [ ":$source_set_name" ] 127*6777b538SAndroid Build Coastguard Worker script = "//build/toolchain/win/midl.py" 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker sources = invoker.sources 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker outputs = [ 132*6777b538SAndroid Build Coastguard Worker "$out_dir/$header_file", 133*6777b538SAndroid Build Coastguard Worker "$out_dir/$interface_identifier_file", 134*6777b538SAndroid Build Coastguard Worker ] 135*6777b538SAndroid Build Coastguard Worker 136*6777b538SAndroid Build Coastguard Worker # These files are only added to outputs if the invoker so desires, as it 137*6777b538SAndroid Build Coastguard Worker # they are not always generated depending on the content of the input idl 138*6777b538SAndroid Build Coastguard Worker # file. 139*6777b538SAndroid Build Coastguard Worker if (writes_tlb) { 140*6777b538SAndroid Build Coastguard Worker outputs += [ "$out_dir/$type_library_file" ] 141*6777b538SAndroid Build Coastguard Worker } 142*6777b538SAndroid Build Coastguard Worker if (writes_dlldata) { 143*6777b538SAndroid Build Coastguard Worker outputs += [ "$out_dir/$dlldata_file" ] 144*6777b538SAndroid Build Coastguard Worker } 145*6777b538SAndroid Build Coastguard Worker if (writes_proxy) { 146*6777b538SAndroid Build Coastguard Worker outputs += [ "$out_dir/$proxy_file" ] 147*6777b538SAndroid Build Coastguard Worker } 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x86") { 150*6777b538SAndroid Build Coastguard Worker win_tool_arch = "environment.x86" 151*6777b538SAndroid Build Coastguard Worker idl_target_platform = "win32" 152*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "x64") { 153*6777b538SAndroid Build Coastguard Worker win_tool_arch = "environment.x64" 154*6777b538SAndroid Build Coastguard Worker idl_target_platform = "x64" 155*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm64") { 156*6777b538SAndroid Build Coastguard Worker win_tool_arch = "environment.arm64" 157*6777b538SAndroid Build Coastguard Worker idl_target_platform = "arm64" 158*6777b538SAndroid Build Coastguard Worker } else { 159*6777b538SAndroid Build Coastguard Worker assert(false, "Need environment for this arch") 160*6777b538SAndroid Build Coastguard Worker } 161*6777b538SAndroid Build Coastguard Worker 162*6777b538SAndroid Build Coastguard Worker args = [ 163*6777b538SAndroid Build Coastguard Worker win_tool_arch, 164*6777b538SAndroid Build Coastguard Worker generated_dir, 165*6777b538SAndroid Build Coastguard Worker rebase_path(out_dir, root_build_dir), 166*6777b538SAndroid Build Coastguard Worker dynamic_guids, 167*6777b538SAndroid Build Coastguard Worker type_library_file, 168*6777b538SAndroid Build Coastguard Worker header_file, 169*6777b538SAndroid Build Coastguard Worker dlldata_file, 170*6777b538SAndroid Build Coastguard Worker interface_identifier_file, 171*6777b538SAndroid Build Coastguard Worker proxy_file, 172*6777b538SAndroid Build Coastguard Worker rebase_path("//third_party/llvm-build/Release+Asserts/bin/clang-cl.exe", 173*6777b538SAndroid Build Coastguard Worker root_build_dir), 174*6777b538SAndroid Build Coastguard Worker "{{source}}", 175*6777b538SAndroid Build Coastguard Worker "/char", 176*6777b538SAndroid Build Coastguard Worker "signed", 177*6777b538SAndroid Build Coastguard Worker "/env", 178*6777b538SAndroid Build Coastguard Worker idl_target_platform, 179*6777b538SAndroid Build Coastguard Worker "/Oicf", 180*6777b538SAndroid Build Coastguard Worker ] 181*6777b538SAndroid Build Coastguard Worker 182*6777b538SAndroid Build Coastguard Worker if (defined(invoker.defines)) { 183*6777b538SAndroid Build Coastguard Worker foreach(define, invoker.defines) { 184*6777b538SAndroid Build Coastguard Worker args += [ "/D" + define ] 185*6777b538SAndroid Build Coastguard Worker } 186*6777b538SAndroid Build Coastguard Worker } 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, [ "deps" ]) 189*6777b538SAndroid Build Coastguard Worker } 190*6777b538SAndroid Build Coastguard Worker 191*6777b538SAndroid Build Coastguard Worker source_set(target_name) { 192*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, [ "visibility" ]) 193*6777b538SAndroid Build Coastguard Worker 194*6777b538SAndroid Build Coastguard Worker # We only compile the IID files from the IDL tool rather than all outputs. 195*6777b538SAndroid Build Coastguard Worker sources = process_file_template(invoker.sources, 196*6777b538SAndroid Build Coastguard Worker [ "$out_dir/$interface_identifier_file" ]) 197*6777b538SAndroid Build Coastguard Worker 198*6777b538SAndroid Build Coastguard Worker public_deps = [ ":$action_name" ] 199*6777b538SAndroid Build Coastguard Worker } 200*6777b538SAndroid Build Coastguard Worker} 201