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