xref: /aosp_15_r20/external/angle/build/toolchain/win/midl.gni (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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