xref: /aosp_15_r20/external/cronet/build/toolchain/win/midl.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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