xref: /aosp_15_r20/external/angle/build/config/mac/rules.gni (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2015 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 Workerimport("//build/apple/apple_info_plist.gni")
6*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/apple/symbols.gni")
7*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/mac/mac_sdk.gni")
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker# Generates Info.plist files for Mac apps and frameworks.
10*8975f5c5SAndroid Build Coastguard Worker#
11*8975f5c5SAndroid Build Coastguard Worker# Arguments
12*8975f5c5SAndroid Build Coastguard Worker#
13*8975f5c5SAndroid Build Coastguard Worker#     info_plist:
14*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, path to the Info.plist file that will be used for
15*8975f5c5SAndroid Build Coastguard Worker#         the bundle.
16*8975f5c5SAndroid Build Coastguard Worker#
17*8975f5c5SAndroid Build Coastguard Worker#     info_plist_target:
18*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, if the info_plist is generated from an action,
19*8975f5c5SAndroid Build Coastguard Worker#         rather than a regular source file, specify the target name in lieu
20*8975f5c5SAndroid Build Coastguard Worker#         of info_plist. The two arguments are mutually exclusive.
21*8975f5c5SAndroid Build Coastguard Worker#
22*8975f5c5SAndroid Build Coastguard Worker#     executable_name:
23*8975f5c5SAndroid Build Coastguard Worker#         string, name of the generated target used for the product
24*8975f5c5SAndroid Build Coastguard Worker#         and executable name as specified in the output Info.plist.
25*8975f5c5SAndroid Build Coastguard Worker#
26*8975f5c5SAndroid Build Coastguard Worker#     extra_substitutions:
27*8975f5c5SAndroid Build Coastguard Worker#         (optional) string array, 'key=value' pairs for extra fields which are
28*8975f5c5SAndroid Build Coastguard Worker#         specified in a source Info.plist template.
29*8975f5c5SAndroid Build Coastguard Workertemplate("mac_info_plist") {
30*8975f5c5SAndroid Build Coastguard Worker  assert(defined(invoker.info_plist) != defined(invoker.info_plist_target),
31*8975f5c5SAndroid Build Coastguard Worker         "Only one of info_plist or info_plist_target may be specified in " +
32*8975f5c5SAndroid Build Coastguard Worker             target_name)
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.info_plist)) {
35*8975f5c5SAndroid Build Coastguard Worker    _info_plist = invoker.info_plist
36*8975f5c5SAndroid Build Coastguard Worker  } else {
37*8975f5c5SAndroid Build Coastguard Worker    _info_plist_target_output = get_target_outputs(invoker.info_plist_target)
38*8975f5c5SAndroid Build Coastguard Worker    _info_plist = _info_plist_target_output[0]
39*8975f5c5SAndroid Build Coastguard Worker  }
40*8975f5c5SAndroid Build Coastguard Worker
41*8975f5c5SAndroid Build Coastguard Worker  apple_info_plist(target_name) {
42*8975f5c5SAndroid Build Coastguard Worker    format = "xml1"
43*8975f5c5SAndroid Build Coastguard Worker    extra_substitutions = [
44*8975f5c5SAndroid Build Coastguard Worker      "MAC_SDK_BUILD=$mac_sdk_build_version",
45*8975f5c5SAndroid Build Coastguard Worker      "MAC_SDK_NAME=$mac_sdk_name$mac_sdk_version",
46*8975f5c5SAndroid Build Coastguard Worker      "MACOSX_DEPLOYMENT_TARGET=$mac_deployment_target",
47*8975f5c5SAndroid Build Coastguard Worker      "CHROMIUM_MIN_SYSTEM_VERSION=$mac_min_system_version",
48*8975f5c5SAndroid Build Coastguard Worker      "XCODE_BUILD=$xcode_build",
49*8975f5c5SAndroid Build Coastguard Worker      "XCODE_VERSION=$xcode_version",
50*8975f5c5SAndroid Build Coastguard Worker    ]
51*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.extra_substitutions)) {
52*8975f5c5SAndroid Build Coastguard Worker      extra_substitutions += invoker.extra_substitutions
53*8975f5c5SAndroid Build Coastguard Worker    }
54*8975f5c5SAndroid Build Coastguard Worker    plist_templates = [
55*8975f5c5SAndroid Build Coastguard Worker      "//build/config/mac/BuildInfo.plist",
56*8975f5c5SAndroid Build Coastguard Worker      _info_plist,
57*8975f5c5SAndroid Build Coastguard Worker    ]
58*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.info_plist_target)) {
59*8975f5c5SAndroid Build Coastguard Worker      deps = [ invoker.info_plist_target ]
60*8975f5c5SAndroid Build Coastguard Worker    }
61*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
62*8975f5c5SAndroid Build Coastguard Worker                           [
63*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
64*8975f5c5SAndroid Build Coastguard Worker                             "executable_name",
65*8975f5c5SAndroid Build Coastguard Worker                           ])
66*8975f5c5SAndroid Build Coastguard Worker  }
67*8975f5c5SAndroid Build Coastguard Worker}
68*8975f5c5SAndroid Build Coastguard Worker
69*8975f5c5SAndroid Build Coastguard Worker# Template to package a shared library into a Mac framework bundle.
70*8975f5c5SAndroid Build Coastguard Worker#
71*8975f5c5SAndroid Build Coastguard Worker# By default, the bundle target this template generates does not link the
72*8975f5c5SAndroid Build Coastguard Worker# resulting framework into anything that depends on it. If a dependency wants
73*8975f5c5SAndroid Build Coastguard Worker# a link-time (as well as build-time) dependency on the framework bundle,
74*8975f5c5SAndroid Build Coastguard Worker# depend against "$target_name+link". If only the build-time dependency is
75*8975f5c5SAndroid Build Coastguard Worker# required (e.g., for copying into another bundle), then use "$target_name".
76*8975f5c5SAndroid Build Coastguard Worker#
77*8975f5c5SAndroid Build Coastguard Worker# Arguments
78*8975f5c5SAndroid Build Coastguard Worker#
79*8975f5c5SAndroid Build Coastguard Worker#     framework_version:
80*8975f5c5SAndroid Build Coastguard Worker#         string, version of the framework. Typically this is a
81*8975f5c5SAndroid Build Coastguard Worker#         single letter, like "A".
82*8975f5c5SAndroid Build Coastguard Worker#
83*8975f5c5SAndroid Build Coastguard Worker#     framework_contents:
84*8975f5c5SAndroid Build Coastguard Worker#         list of string, top-level items in the framework. This is
85*8975f5c5SAndroid Build Coastguard Worker#         the list of symlinks to create in the .framework directory that link
86*8975f5c5SAndroid Build Coastguard Worker#         into Versions/Current/.
87*8975f5c5SAndroid Build Coastguard Worker#
88*8975f5c5SAndroid Build Coastguard Worker#     info_plist:
89*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, path to the Info.plist file that will be used for
90*8975f5c5SAndroid Build Coastguard Worker#         the bundle.
91*8975f5c5SAndroid Build Coastguard Worker#
92*8975f5c5SAndroid Build Coastguard Worker#     info_plist_target:
93*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, if the info_plist is generated from an action,
94*8975f5c5SAndroid Build Coastguard Worker#         rather than a regular source file, specify the target name in lieu
95*8975f5c5SAndroid Build Coastguard Worker#         of info_plist. The two arguments are mutually exclusive.
96*8975f5c5SAndroid Build Coastguard Worker#
97*8975f5c5SAndroid Build Coastguard Worker#     output_name:
98*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, name of the generated framework without the
99*8975f5c5SAndroid Build Coastguard Worker#         .framework suffix. If omitted, defaults to target_name.
100*8975f5c5SAndroid Build Coastguard Worker#
101*8975f5c5SAndroid Build Coastguard Worker#     extra_substitutions:
102*8975f5c5SAndroid Build Coastguard Worker#         (optional) string array, 'key=value' pairs for extra fields which are
103*8975f5c5SAndroid Build Coastguard Worker#         specified in a source Info.plist template.
104*8975f5c5SAndroid Build Coastguard Worker#
105*8975f5c5SAndroid Build Coastguard Worker# This template provides three targets for the resulting framework bundle. The
106*8975f5c5SAndroid Build Coastguard Worker# link-time behavior varies depending on which of the two targets below is
107*8975f5c5SAndroid Build Coastguard Worker# added as a dependency:
108*8975f5c5SAndroid Build Coastguard Worker#   - $target_name only adds a build-time dependency. Targets that depend on
109*8975f5c5SAndroid Build Coastguard Worker#     it will not link against the framework.
110*8975f5c5SAndroid Build Coastguard Worker#   - $target_name+link adds a build-time and link-time dependency. Targets
111*8975f5c5SAndroid Build Coastguard Worker#     that depend on it will link against the framework.
112*8975f5c5SAndroid Build Coastguard Worker#   - $target_name+link_nested adds a build-time and link-time dependency, but
113*8975f5c5SAndroid Build Coastguard Worker#     only on the shared library and not the fully-assembled framework bundle.
114*8975f5c5SAndroid Build Coastguard Worker#     This should only be used for other nested binary components of the
115*8975f5c5SAndroid Build Coastguard Worker#     framework bundle (e.g. Helpers) that themselves depend on the main shared
116*8975f5c5SAndroid Build Coastguard Worker#     library of the framework bundle.
117*8975f5c5SAndroid Build Coastguard Worker#
118*8975f5c5SAndroid Build Coastguard Worker# The build-time-only dependency is used for when a target needs to use the
119*8975f5c5SAndroid Build Coastguard Worker# framework either only for resources, or because the target loads it at run-
120*8975f5c5SAndroid Build Coastguard Worker# time, via dlopen() or NSBundle. The link-time dependency will cause the
121*8975f5c5SAndroid Build Coastguard Worker# dependee to have the framework loaded by dyld at launch.
122*8975f5c5SAndroid Build Coastguard Worker#
123*8975f5c5SAndroid Build Coastguard Worker# Example of build-time only dependency:
124*8975f5c5SAndroid Build Coastguard Worker#
125*8975f5c5SAndroid Build Coastguard Worker#     mac_framework_bundle("CoreTeleportation") {
126*8975f5c5SAndroid Build Coastguard Worker#       sources = [ ... ]
127*8975f5c5SAndroid Build Coastguard Worker#     }
128*8975f5c5SAndroid Build Coastguard Worker#
129*8975f5c5SAndroid Build Coastguard Worker#     bundle_data("core_teleportation_bundle_data") {
130*8975f5c5SAndroid Build Coastguard Worker#       deps = [ ":CoreTeleportation" ]
131*8975f5c5SAndroid Build Coastguard Worker#       sources = [ "$root_out_dir/CoreTeleportation.framework" ]
132*8975f5c5SAndroid Build Coastguard Worker#       outputs = [ "{{bundle_contents_dir}}/Frameworks/{{source_file_part}}" ]
133*8975f5c5SAndroid Build Coastguard Worker#     }
134*8975f5c5SAndroid Build Coastguard Worker#
135*8975f5c5SAndroid Build Coastguard Worker#     app_bundle("GoatTeleporter") {
136*8975f5c5SAndroid Build Coastguard Worker#       sources = [ ... ]
137*8975f5c5SAndroid Build Coastguard Worker#       deps = [
138*8975f5c5SAndroid Build Coastguard Worker#         ":core_teleportation_bundle_data",
139*8975f5c5SAndroid Build Coastguard Worker#       ]
140*8975f5c5SAndroid Build Coastguard Worker#     }
141*8975f5c5SAndroid Build Coastguard Worker#
142*8975f5c5SAndroid Build Coastguard Worker# The GoatTeleporter.app will not directly link against
143*8975f5c5SAndroid Build Coastguard Worker# CoreTeleportation.framework, but it will be included in the bundle's
144*8975f5c5SAndroid Build Coastguard Worker# Frameworks directory.
145*8975f5c5SAndroid Build Coastguard Worker#
146*8975f5c5SAndroid Build Coastguard Worker# Example of link-time dependency:
147*8975f5c5SAndroid Build Coastguard Worker#
148*8975f5c5SAndroid Build Coastguard Worker#     mac_framework_bundle("CoreTeleportation") {
149*8975f5c5SAndroid Build Coastguard Worker#       sources = [ ... ]
150*8975f5c5SAndroid Build Coastguard Worker#       ldflags = [
151*8975f5c5SAndroid Build Coastguard Worker#         "-install_name",
152*8975f5c5SAndroid Build Coastguard Worker#         "@executable_path/../Frameworks/$target_name.framework"
153*8975f5c5SAndroid Build Coastguard Worker#       ]
154*8975f5c5SAndroid Build Coastguard Worker#     }
155*8975f5c5SAndroid Build Coastguard Worker#
156*8975f5c5SAndroid Build Coastguard Worker#     bundle_data("core_teleportation_bundle_data") {
157*8975f5c5SAndroid Build Coastguard Worker#       deps = [ ":CoreTeleportation+link" ]
158*8975f5c5SAndroid Build Coastguard Worker#       sources = [ "$root_out_dir/CoreTeleportation.framework" ]
159*8975f5c5SAndroid Build Coastguard Worker#       outputs = [ "{{bundle_contents_dir}}/Frameworks/{{source_file_part}}" ]
160*8975f5c5SAndroid Build Coastguard Worker#     }
161*8975f5c5SAndroid Build Coastguard Worker#
162*8975f5c5SAndroid Build Coastguard Worker#     app_bundle("GoatTeleporter") {
163*8975f5c5SAndroid Build Coastguard Worker#       sources = [ ... ]
164*8975f5c5SAndroid Build Coastguard Worker#       deps = [
165*8975f5c5SAndroid Build Coastguard Worker#         ":core_teleportation_bundle_data",
166*8975f5c5SAndroid Build Coastguard Worker#       ]
167*8975f5c5SAndroid Build Coastguard Worker#     }
168*8975f5c5SAndroid Build Coastguard Worker#
169*8975f5c5SAndroid Build Coastguard Worker# Note that the framework is still copied to the app's bundle, but dyld will
170*8975f5c5SAndroid Build Coastguard Worker# load this library when the app is launched because it uses the "+link"
171*8975f5c5SAndroid Build Coastguard Worker# target as a dependency. This also requires that the framework set its
172*8975f5c5SAndroid Build Coastguard Worker# install_name so that dyld can locate it.
173*8975f5c5SAndroid Build Coastguard Worker#
174*8975f5c5SAndroid Build Coastguard Worker# See "gn help shared_library" for more information on arguments supported
175*8975f5c5SAndroid Build Coastguard Worker# by shared library target.
176*8975f5c5SAndroid Build Coastguard Workertemplate("mac_framework_bundle") {
177*8975f5c5SAndroid Build Coastguard Worker  assert(defined(invoker.deps) || defined(invoker.public_deps),
178*8975f5c5SAndroid Build Coastguard Worker         "Dependencies must be specified for $target_name")
179*8975f5c5SAndroid Build Coastguard Worker  assert(invoker.framework_version != "", "framework_version is required")
180*8975f5c5SAndroid Build Coastguard Worker  assert(defined(invoker.framework_contents), "framework_contents is required")
181*8975f5c5SAndroid Build Coastguard Worker
182*8975f5c5SAndroid Build Coastguard Worker  _info_plist_target = target_name + "_info_plist"
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker  mac_info_plist(_info_plist_target) {
185*8975f5c5SAndroid Build Coastguard Worker    executable_name = target_name
186*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.output_name)) {
187*8975f5c5SAndroid Build Coastguard Worker      executable_name = invoker.output_name
188*8975f5c5SAndroid Build Coastguard Worker    }
189*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
190*8975f5c5SAndroid Build Coastguard Worker                           [
191*8975f5c5SAndroid Build Coastguard Worker                             "extra_substitutions",
192*8975f5c5SAndroid Build Coastguard Worker                             "info_plist",
193*8975f5c5SAndroid Build Coastguard Worker                             "info_plist_target",
194*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
195*8975f5c5SAndroid Build Coastguard Worker                           ])
196*8975f5c5SAndroid Build Coastguard Worker  }
197*8975f5c5SAndroid Build Coastguard Worker
198*8975f5c5SAndroid Build Coastguard Worker  _info_plist_bundle_data = _info_plist_target + "_bundle_data"
199*8975f5c5SAndroid Build Coastguard Worker
200*8975f5c5SAndroid Build Coastguard Worker  bundle_data(_info_plist_bundle_data) {
201*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "testonly" ])
202*8975f5c5SAndroid Build Coastguard Worker    sources = get_target_outputs(":$_info_plist_target")
203*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "{{bundle_resources_dir}}/Info.plist" ]
204*8975f5c5SAndroid Build Coastguard Worker    public_deps = [ ":$_info_plist_target" ]
205*8975f5c5SAndroid Build Coastguard Worker  }
206*8975f5c5SAndroid Build Coastguard Worker
207*8975f5c5SAndroid Build Coastguard Worker  _target_name = target_name
208*8975f5c5SAndroid Build Coastguard Worker  _output_name = target_name
209*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.output_name)) {
210*8975f5c5SAndroid Build Coastguard Worker    _output_name = invoker.output_name
211*8975f5c5SAndroid Build Coastguard Worker  }
212*8975f5c5SAndroid Build Coastguard Worker
213*8975f5c5SAndroid Build Coastguard Worker  # Create a file to track the build dependency on the framework_version and
214*8975f5c5SAndroid Build Coastguard Worker  # framework_contents variables.
215*8975f5c5SAndroid Build Coastguard Worker  _framework_toc = [
216*8975f5c5SAndroid Build Coastguard Worker                     "Version=" + invoker.framework_version,
217*8975f5c5SAndroid Build Coastguard Worker                     _output_name,
218*8975f5c5SAndroid Build Coastguard Worker                   ] + invoker.framework_contents
219*8975f5c5SAndroid Build Coastguard Worker  _framework_contents = [ _output_name ] + invoker.framework_contents
220*8975f5c5SAndroid Build Coastguard Worker  _framework_toc_file = "$target_out_dir/${target_name}.toc"
221*8975f5c5SAndroid Build Coastguard Worker  write_file(_framework_toc_file, _framework_toc)
222*8975f5c5SAndroid Build Coastguard Worker
223*8975f5c5SAndroid Build Coastguard Worker  # Create local variables for referencing different parts of the bundle.
224*8975f5c5SAndroid Build Coastguard Worker  _framework_target = _target_name
225*8975f5c5SAndroid Build Coastguard Worker  _framework_name = _output_name + ".framework"
226*8975f5c5SAndroid Build Coastguard Worker  _framework_base_dir = "$root_out_dir/$_framework_name"
227*8975f5c5SAndroid Build Coastguard Worker  _framework_root_dir =
228*8975f5c5SAndroid Build Coastguard Worker      _framework_base_dir + "/Versions/${invoker.framework_version}"
229*8975f5c5SAndroid Build Coastguard Worker
230*8975f5c5SAndroid Build Coastguard Worker  # Clean the entire framework if the framework_version changes.
231*8975f5c5SAndroid Build Coastguard Worker  _version_file = "$target_out_dir/${target_name}_version"
232*8975f5c5SAndroid Build Coastguard Worker  exec_script("//build/config/mac/prepare_framework_version.py",
233*8975f5c5SAndroid Build Coastguard Worker              [
234*8975f5c5SAndroid Build Coastguard Worker                rebase_path(_version_file),
235*8975f5c5SAndroid Build Coastguard Worker                rebase_path(_framework_base_dir),
236*8975f5c5SAndroid Build Coastguard Worker                invoker.framework_version,
237*8975f5c5SAndroid Build Coastguard Worker              ])
238*8975f5c5SAndroid Build Coastguard Worker
239*8975f5c5SAndroid Build Coastguard Worker  # Create the symlinks.
240*8975f5c5SAndroid Build Coastguard Worker  _framework_package_target = target_name + "_package"
241*8975f5c5SAndroid Build Coastguard Worker  action(_framework_package_target) {
242*8975f5c5SAndroid Build Coastguard Worker    script = "//build/config/mac/package_framework.py"
243*8975f5c5SAndroid Build Coastguard Worker
244*8975f5c5SAndroid Build Coastguard Worker    # The TOC file never needs to be read, since its contents are the values
245*8975f5c5SAndroid Build Coastguard Worker    # of GN variables. It is only used to trigger this rule when the values
246*8975f5c5SAndroid Build Coastguard Worker    # change.
247*8975f5c5SAndroid Build Coastguard Worker    inputs = [ _framework_toc_file ]
248*8975f5c5SAndroid Build Coastguard Worker
249*8975f5c5SAndroid Build Coastguard Worker    _stamp_file = "$target_out_dir/run_${_framework_package_target}.stamp"
250*8975f5c5SAndroid Build Coastguard Worker    outputs = [ _stamp_file ]
251*8975f5c5SAndroid Build Coastguard Worker
252*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_framework_target" ]
253*8975f5c5SAndroid Build Coastguard Worker
254*8975f5c5SAndroid Build Coastguard Worker    args = [
255*8975f5c5SAndroid Build Coastguard Worker             "--framework",
256*8975f5c5SAndroid Build Coastguard Worker             rebase_path(_framework_base_dir, root_build_dir),
257*8975f5c5SAndroid Build Coastguard Worker             "--stamp",
258*8975f5c5SAndroid Build Coastguard Worker             rebase_path(_stamp_file, root_build_dir),
259*8975f5c5SAndroid Build Coastguard Worker             "--version",
260*8975f5c5SAndroid Build Coastguard Worker             invoker.framework_version,
261*8975f5c5SAndroid Build Coastguard Worker             "--contents",
262*8975f5c5SAndroid Build Coastguard Worker           ] + _framework_contents
263*8975f5c5SAndroid Build Coastguard Worker
264*8975f5c5SAndroid Build Coastguard Worker    # It is not possible to list _framework_contents as outputs, since
265*8975f5c5SAndroid Build Coastguard Worker    # ninja does not properly stat symbolic links.
266*8975f5c5SAndroid Build Coastguard Worker    # https://github.com/ninja-build/ninja/issues/1186
267*8975f5c5SAndroid Build Coastguard Worker  }
268*8975f5c5SAndroid Build Coastguard Worker
269*8975f5c5SAndroid Build Coastguard Worker  _link_shared_library_target = target_name + "_shared_library"
270*8975f5c5SAndroid Build Coastguard Worker  _shared_library_bundle_data = target_name + "_shared_library_bundle_data"
271*8975f5c5SAndroid Build Coastguard Worker
272*8975f5c5SAndroid Build Coastguard Worker  shared_library(_link_shared_library_target) {
273*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
274*8975f5c5SAndroid Build Coastguard Worker                           "*",
275*8975f5c5SAndroid Build Coastguard Worker                           [
276*8975f5c5SAndroid Build Coastguard Worker                             "assert_no_deps",
277*8975f5c5SAndroid Build Coastguard Worker                             "bundle_deps",
278*8975f5c5SAndroid Build Coastguard Worker                             "code_signing_enabled",
279*8975f5c5SAndroid Build Coastguard Worker                             "data_deps",
280*8975f5c5SAndroid Build Coastguard Worker                             "info_plist",
281*8975f5c5SAndroid Build Coastguard Worker                             "info_plist_target",
282*8975f5c5SAndroid Build Coastguard Worker                             "output_name",
283*8975f5c5SAndroid Build Coastguard Worker                             "visibility",
284*8975f5c5SAndroid Build Coastguard Worker                           ])
285*8975f5c5SAndroid Build Coastguard Worker    visibility = [
286*8975f5c5SAndroid Build Coastguard Worker      ":$_shared_library_bundle_data",
287*8975f5c5SAndroid Build Coastguard Worker      ":${_framework_target}+link_nested",
288*8975f5c5SAndroid Build Coastguard Worker    ]
289*8975f5c5SAndroid Build Coastguard Worker    output_name = _output_name
290*8975f5c5SAndroid Build Coastguard Worker    output_prefix_override = true
291*8975f5c5SAndroid Build Coastguard Worker    output_extension = ""
292*8975f5c5SAndroid Build Coastguard Worker    output_dir = "$target_out_dir/$_link_shared_library_target"
293*8975f5c5SAndroid Build Coastguard Worker  }
294*8975f5c5SAndroid Build Coastguard Worker
295*8975f5c5SAndroid Build Coastguard Worker  bundle_data(_shared_library_bundle_data) {
296*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_framework_target" ]
297*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "testonly" ])
298*8975f5c5SAndroid Build Coastguard Worker    sources = [ "$target_out_dir/$_link_shared_library_target/$_output_name" ]
299*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "{{bundle_executable_dir}}/$_output_name" ]
300*8975f5c5SAndroid Build Coastguard Worker    public_deps = [ ":$_link_shared_library_target" ]
301*8975f5c5SAndroid Build Coastguard Worker  }
302*8975f5c5SAndroid Build Coastguard Worker
303*8975f5c5SAndroid Build Coastguard Worker  _framework_public_config = _target_name + "_public_config"
304*8975f5c5SAndroid Build Coastguard Worker  config(_framework_public_config) {
305*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_framework_target+link" ]
306*8975f5c5SAndroid Build Coastguard Worker    framework_dirs = [ root_out_dir ]
307*8975f5c5SAndroid Build Coastguard Worker    frameworks = [ _framework_name ]
308*8975f5c5SAndroid Build Coastguard Worker  }
309*8975f5c5SAndroid Build Coastguard Worker
310*8975f5c5SAndroid Build Coastguard Worker  create_bundle(_framework_target) {
311*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
312*8975f5c5SAndroid Build Coastguard Worker                           [
313*8975f5c5SAndroid Build Coastguard Worker                             "data_deps",
314*8975f5c5SAndroid Build Coastguard Worker                             "deps",
315*8975f5c5SAndroid Build Coastguard Worker                             "public_deps",
316*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
317*8975f5c5SAndroid Build Coastguard Worker                           ])
318*8975f5c5SAndroid Build Coastguard Worker
319*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.visibility)) {
320*8975f5c5SAndroid Build Coastguard Worker      visibility = invoker.visibility
321*8975f5c5SAndroid Build Coastguard Worker      visibility += [ ":$_target_name+link" ]
322*8975f5c5SAndroid Build Coastguard Worker    }
323*8975f5c5SAndroid Build Coastguard Worker
324*8975f5c5SAndroid Build Coastguard Worker    if (!defined(deps)) {
325*8975f5c5SAndroid Build Coastguard Worker      deps = []
326*8975f5c5SAndroid Build Coastguard Worker    }
327*8975f5c5SAndroid Build Coastguard Worker    deps += [ ":$_info_plist_bundle_data" ]
328*8975f5c5SAndroid Build Coastguard Worker
329*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.bundle_deps)) {
330*8975f5c5SAndroid Build Coastguard Worker      deps += invoker.bundle_deps
331*8975f5c5SAndroid Build Coastguard Worker    }
332*8975f5c5SAndroid Build Coastguard Worker
333*8975f5c5SAndroid Build Coastguard Worker    if (!defined(public_deps)) {
334*8975f5c5SAndroid Build Coastguard Worker      public_deps = []
335*8975f5c5SAndroid Build Coastguard Worker    }
336*8975f5c5SAndroid Build Coastguard Worker    public_deps += [
337*8975f5c5SAndroid Build Coastguard Worker      ":$_framework_package_target",
338*8975f5c5SAndroid Build Coastguard Worker      ":$_shared_library_bundle_data",
339*8975f5c5SAndroid Build Coastguard Worker    ]
340*8975f5c5SAndroid Build Coastguard Worker
341*8975f5c5SAndroid Build Coastguard Worker    if (enable_dsyms) {
342*8975f5c5SAndroid Build Coastguard Worker      data = [
343*8975f5c5SAndroid Build Coastguard Worker        "$root_out_dir/$_output_name.dSYM/Contents/Info.plist",
344*8975f5c5SAndroid Build Coastguard Worker        "$root_out_dir/$_output_name.dSYM/Contents/Resources/DWARF/$_output_name",
345*8975f5c5SAndroid Build Coastguard Worker      ]
346*8975f5c5SAndroid Build Coastguard Worker    }
347*8975f5c5SAndroid Build Coastguard Worker
348*8975f5c5SAndroid Build Coastguard Worker    bundle_root_dir = _framework_base_dir
349*8975f5c5SAndroid Build Coastguard Worker    bundle_contents_dir = _framework_root_dir
350*8975f5c5SAndroid Build Coastguard Worker    bundle_resources_dir = "$bundle_contents_dir/Resources"
351*8975f5c5SAndroid Build Coastguard Worker    bundle_executable_dir = bundle_contents_dir
352*8975f5c5SAndroid Build Coastguard Worker  }
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker  group(_target_name + "+link") {
355*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
356*8975f5c5SAndroid Build Coastguard Worker                           [
357*8975f5c5SAndroid Build Coastguard Worker                             "public_configs",
358*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
359*8975f5c5SAndroid Build Coastguard Worker                             "visibility",
360*8975f5c5SAndroid Build Coastguard Worker                           ])
361*8975f5c5SAndroid Build Coastguard Worker    public_deps = [ ":$_target_name" ]
362*8975f5c5SAndroid Build Coastguard Worker    if (!defined(public_configs)) {
363*8975f5c5SAndroid Build Coastguard Worker      public_configs = []
364*8975f5c5SAndroid Build Coastguard Worker    }
365*8975f5c5SAndroid Build Coastguard Worker    public_configs += [ ":$_framework_public_config" ]
366*8975f5c5SAndroid Build Coastguard Worker  }
367*8975f5c5SAndroid Build Coastguard Worker
368*8975f5c5SAndroid Build Coastguard Worker  group(_target_name + "+link_nested") {
369*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
370*8975f5c5SAndroid Build Coastguard Worker                           [
371*8975f5c5SAndroid Build Coastguard Worker                             "public_configs",
372*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
373*8975f5c5SAndroid Build Coastguard Worker                             "visibility",
374*8975f5c5SAndroid Build Coastguard Worker                           ])
375*8975f5c5SAndroid Build Coastguard Worker
376*8975f5c5SAndroid Build Coastguard Worker    # Depend only on the shared library. Nested code will be a dependency of
377*8975f5c5SAndroid Build Coastguard Worker    # the create_bundle target, which would be cyclic with depending on the
378*8975f5c5SAndroid Build Coastguard Worker    # framework itself. This is sufficient to link; for loading, a proper
379*8975f5c5SAndroid Build Coastguard Worker    # install_name should be set.
380*8975f5c5SAndroid Build Coastguard Worker    public_deps = [ ":$_link_shared_library_target" ]
381*8975f5c5SAndroid Build Coastguard Worker  }
382*8975f5c5SAndroid Build Coastguard Worker}
383*8975f5c5SAndroid Build Coastguard Worker
384*8975f5c5SAndroid Build Coastguard Workerset_defaults("mac_framework_bundle") {
385*8975f5c5SAndroid Build Coastguard Worker  configs = default_shared_library_configs
386*8975f5c5SAndroid Build Coastguard Worker}
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker# Template to create a Mac executable application bundle.
389*8975f5c5SAndroid Build Coastguard Worker#
390*8975f5c5SAndroid Build Coastguard Worker# Arguments
391*8975f5c5SAndroid Build Coastguard Worker#
392*8975f5c5SAndroid Build Coastguard Worker#     package_type:
393*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, the product package type to create. Options are:
394*8975f5c5SAndroid Build Coastguard Worker#             "app" to create a .app bundle (default)
395*8975f5c5SAndroid Build Coastguard Worker#             "xpc" to create an .xpc service bundle
396*8975f5c5SAndroid Build Coastguard Worker#
397*8975f5c5SAndroid Build Coastguard Worker#     info_plist:
398*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, path to the Info.plist file that will be used for
399*8975f5c5SAndroid Build Coastguard Worker#         the bundle.
400*8975f5c5SAndroid Build Coastguard Worker#
401*8975f5c5SAndroid Build Coastguard Worker#     info_plist_target:
402*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, if the info_plist is generated from an action,
403*8975f5c5SAndroid Build Coastguard Worker#         rather than a regular source file, specify the target name in lieu
404*8975f5c5SAndroid Build Coastguard Worker#         of info_plist. The two arguments are mutually exclusive.
405*8975f5c5SAndroid Build Coastguard Worker#
406*8975f5c5SAndroid Build Coastguard Worker#     output_name:
407*8975f5c5SAndroid Build Coastguard Worker#         (optional) string, name of the generated app without the
408*8975f5c5SAndroid Build Coastguard Worker#         .app suffix. If omitted, defaults to target_name.
409*8975f5c5SAndroid Build Coastguard Worker#
410*8975f5c5SAndroid Build Coastguard Worker#     extra_substitutions:
411*8975f5c5SAndroid Build Coastguard Worker#         (optional) string array, 'key=value' pairs for extra fields which are
412*8975f5c5SAndroid Build Coastguard Worker#         specified in a source Info.plist template.
413*8975f5c5SAndroid Build Coastguard Workertemplate("mac_app_bundle") {
414*8975f5c5SAndroid Build Coastguard Worker  _target_name = target_name
415*8975f5c5SAndroid Build Coastguard Worker  _output_name = target_name
416*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.output_name)) {
417*8975f5c5SAndroid Build Coastguard Worker    _output_name = invoker.output_name
418*8975f5c5SAndroid Build Coastguard Worker  }
419*8975f5c5SAndroid Build Coastguard Worker
420*8975f5c5SAndroid Build Coastguard Worker  _package_type = "app"
421*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.package_type)) {
422*8975f5c5SAndroid Build Coastguard Worker    _package_type = invoker.package_type
423*8975f5c5SAndroid Build Coastguard Worker  }
424*8975f5c5SAndroid Build Coastguard Worker
425*8975f5c5SAndroid Build Coastguard Worker  if (_package_type == "app") {
426*8975f5c5SAndroid Build Coastguard Worker    _output_extension = "app"
427*8975f5c5SAndroid Build Coastguard Worker    _product_type = "com.apple.product-type.application"
428*8975f5c5SAndroid Build Coastguard Worker    _write_pkg_info = true
429*8975f5c5SAndroid Build Coastguard Worker  } else if (_package_type == "xpc") {
430*8975f5c5SAndroid Build Coastguard Worker    _output_extension = "xpc"
431*8975f5c5SAndroid Build Coastguard Worker    _product_type = "com.apple.product-type.xpc-service"
432*8975f5c5SAndroid Build Coastguard Worker    _write_pkg_info = false
433*8975f5c5SAndroid Build Coastguard Worker  } else if (_package_type == "bundle") {
434*8975f5c5SAndroid Build Coastguard Worker    _output_extension = "bundle"
435*8975f5c5SAndroid Build Coastguard Worker    _product_type = "com.apple.product-type.bundle"
436*8975f5c5SAndroid Build Coastguard Worker    _write_pkg_info = false
437*8975f5c5SAndroid Build Coastguard Worker  } else {
438*8975f5c5SAndroid Build Coastguard Worker    assert(false, "Unsupported packge_type: " + packge_type)
439*8975f5c5SAndroid Build Coastguard Worker  }
440*8975f5c5SAndroid Build Coastguard Worker
441*8975f5c5SAndroid Build Coastguard Worker  _executable_target = target_name + "_executable"
442*8975f5c5SAndroid Build Coastguard Worker  _executable_bundle_data = _executable_target + "_bundle_data"
443*8975f5c5SAndroid Build Coastguard Worker
444*8975f5c5SAndroid Build Coastguard Worker  _info_plist_target = target_name + "_info_plist"
445*8975f5c5SAndroid Build Coastguard Worker
446*8975f5c5SAndroid Build Coastguard Worker  mac_info_plist(_info_plist_target) {
447*8975f5c5SAndroid Build Coastguard Worker    executable_name = _output_name
448*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
449*8975f5c5SAndroid Build Coastguard Worker                           [
450*8975f5c5SAndroid Build Coastguard Worker                             "extra_substitutions",
451*8975f5c5SAndroid Build Coastguard Worker                             "info_plist",
452*8975f5c5SAndroid Build Coastguard Worker                             "info_plist_target",
453*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
454*8975f5c5SAndroid Build Coastguard Worker                           ])
455*8975f5c5SAndroid Build Coastguard Worker  }
456*8975f5c5SAndroid Build Coastguard Worker
457*8975f5c5SAndroid Build Coastguard Worker  if (_write_pkg_info) {
458*8975f5c5SAndroid Build Coastguard Worker    _pkg_info_target = target_name + "_pkg_info"
459*8975f5c5SAndroid Build Coastguard Worker
460*8975f5c5SAndroid Build Coastguard Worker    action(_pkg_info_target) {
461*8975f5c5SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "testonly" ])
462*8975f5c5SAndroid Build Coastguard Worker      script = "//build/apple/write_pkg_info.py"
463*8975f5c5SAndroid Build Coastguard Worker      inputs = [ "//build/apple/plist_util.py" ]
464*8975f5c5SAndroid Build Coastguard Worker      sources = get_target_outputs(":$_info_plist_target")
465*8975f5c5SAndroid Build Coastguard Worker      outputs = [ "$target_gen_dir/$_pkg_info_target" ]
466*8975f5c5SAndroid Build Coastguard Worker      args = [ "--plist" ] + rebase_path(sources, root_build_dir) +
467*8975f5c5SAndroid Build Coastguard Worker             [ "--output" ] + rebase_path(outputs, root_build_dir)
468*8975f5c5SAndroid Build Coastguard Worker      deps = [ ":$_info_plist_target" ]
469*8975f5c5SAndroid Build Coastguard Worker    }
470*8975f5c5SAndroid Build Coastguard Worker  }
471*8975f5c5SAndroid Build Coastguard Worker
472*8975f5c5SAndroid Build Coastguard Worker  executable(_executable_target) {
473*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_executable_bundle_data" ]
474*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
475*8975f5c5SAndroid Build Coastguard Worker                           "*",
476*8975f5c5SAndroid Build Coastguard Worker                           [
477*8975f5c5SAndroid Build Coastguard Worker                             "assert_no_deps",
478*8975f5c5SAndroid Build Coastguard Worker                             "data_deps",
479*8975f5c5SAndroid Build Coastguard Worker                             "info_plist",
480*8975f5c5SAndroid Build Coastguard Worker                             "output_name",
481*8975f5c5SAndroid Build Coastguard Worker                             "visibility",
482*8975f5c5SAndroid Build Coastguard Worker                           ])
483*8975f5c5SAndroid Build Coastguard Worker    output_name = _output_name
484*8975f5c5SAndroid Build Coastguard Worker    output_dir = "$target_out_dir/$_executable_target"
485*8975f5c5SAndroid Build Coastguard Worker  }
486*8975f5c5SAndroid Build Coastguard Worker
487*8975f5c5SAndroid Build Coastguard Worker  bundle_data(_executable_bundle_data) {
488*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_target_name" ]
489*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "testonly" ])
490*8975f5c5SAndroid Build Coastguard Worker    sources = [ "$target_out_dir/$_executable_target/$_output_name" ]
491*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "{{bundle_executable_dir}}/$_output_name" ]
492*8975f5c5SAndroid Build Coastguard Worker    public_deps = [ ":$_executable_target" ]
493*8975f5c5SAndroid Build Coastguard Worker  }
494*8975f5c5SAndroid Build Coastguard Worker
495*8975f5c5SAndroid Build Coastguard Worker  _info_plist_bundle_data = _info_plist_target + "_bundle_data"
496*8975f5c5SAndroid Build Coastguard Worker
497*8975f5c5SAndroid Build Coastguard Worker  bundle_data(_info_plist_bundle_data) {
498*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "testonly" ])
499*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_target_name" ]
500*8975f5c5SAndroid Build Coastguard Worker    sources = get_target_outputs(":$_info_plist_target")
501*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "{{bundle_contents_dir}}/Info.plist" ]
502*8975f5c5SAndroid Build Coastguard Worker    public_deps = [ ":$_info_plist_target" ]
503*8975f5c5SAndroid Build Coastguard Worker  }
504*8975f5c5SAndroid Build Coastguard Worker
505*8975f5c5SAndroid Build Coastguard Worker  if (_write_pkg_info) {
506*8975f5c5SAndroid Build Coastguard Worker    _pkg_info_bundle_data = _pkg_info_target + "_bundle_data"
507*8975f5c5SAndroid Build Coastguard Worker
508*8975f5c5SAndroid Build Coastguard Worker    bundle_data(_pkg_info_bundle_data) {
509*8975f5c5SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "testonly" ])
510*8975f5c5SAndroid Build Coastguard Worker      visibility = [ ":$_target_name" ]
511*8975f5c5SAndroid Build Coastguard Worker      sources = get_target_outputs(":$_pkg_info_target")
512*8975f5c5SAndroid Build Coastguard Worker      outputs = [ "{{bundle_contents_dir}}/PkgInfo" ]
513*8975f5c5SAndroid Build Coastguard Worker      public_deps = [ ":$_pkg_info_target" ]
514*8975f5c5SAndroid Build Coastguard Worker    }
515*8975f5c5SAndroid Build Coastguard Worker  }
516*8975f5c5SAndroid Build Coastguard Worker
517*8975f5c5SAndroid Build Coastguard Worker  create_bundle(_target_name) {
518*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
519*8975f5c5SAndroid Build Coastguard Worker                           [
520*8975f5c5SAndroid Build Coastguard Worker                             "data_deps",
521*8975f5c5SAndroid Build Coastguard Worker                             "deps",
522*8975f5c5SAndroid Build Coastguard Worker                             "public_deps",
523*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
524*8975f5c5SAndroid Build Coastguard Worker                           ])
525*8975f5c5SAndroid Build Coastguard Worker    if (!defined(deps)) {
526*8975f5c5SAndroid Build Coastguard Worker      deps = []
527*8975f5c5SAndroid Build Coastguard Worker    }
528*8975f5c5SAndroid Build Coastguard Worker    deps += [
529*8975f5c5SAndroid Build Coastguard Worker      ":$_executable_bundle_data",
530*8975f5c5SAndroid Build Coastguard Worker      ":$_info_plist_bundle_data",
531*8975f5c5SAndroid Build Coastguard Worker    ]
532*8975f5c5SAndroid Build Coastguard Worker    if (_write_pkg_info) {
533*8975f5c5SAndroid Build Coastguard Worker      deps += [ ":$_pkg_info_bundle_data" ]
534*8975f5c5SAndroid Build Coastguard Worker    }
535*8975f5c5SAndroid Build Coastguard Worker
536*8975f5c5SAndroid Build Coastguard Worker    if (enable_dsyms) {
537*8975f5c5SAndroid Build Coastguard Worker      data = [
538*8975f5c5SAndroid Build Coastguard Worker        "$root_out_dir/$_output_name.dSYM/Contents/Info.plist",
539*8975f5c5SAndroid Build Coastguard Worker        "$root_out_dir/$_output_name.dSYM/Contents/Resources/DWARF/$_output_name",
540*8975f5c5SAndroid Build Coastguard Worker      ]
541*8975f5c5SAndroid Build Coastguard Worker    }
542*8975f5c5SAndroid Build Coastguard Worker
543*8975f5c5SAndroid Build Coastguard Worker    product_type = _product_type
544*8975f5c5SAndroid Build Coastguard Worker    bundle_root_dir = "$root_out_dir/${_output_name}.${_output_extension}"
545*8975f5c5SAndroid Build Coastguard Worker    bundle_contents_dir = "$bundle_root_dir/Contents"
546*8975f5c5SAndroid Build Coastguard Worker    bundle_resources_dir = "$bundle_contents_dir/Resources"
547*8975f5c5SAndroid Build Coastguard Worker    bundle_executable_dir = "$bundle_contents_dir/MacOS"
548*8975f5c5SAndroid Build Coastguard Worker  }
549*8975f5c5SAndroid Build Coastguard Worker}
550*8975f5c5SAndroid Build Coastguard Worker
551*8975f5c5SAndroid Build Coastguard Workerset_defaults("mac_app_bundle") {
552*8975f5c5SAndroid Build Coastguard Worker  configs = default_executable_configs
553*8975f5c5SAndroid Build Coastguard Worker}
554*8975f5c5SAndroid Build Coastguard Worker
555*8975f5c5SAndroid Build Coastguard Worker# Template to package a loadable_module into a .plugin bundle.
556*8975f5c5SAndroid Build Coastguard Worker#
557*8975f5c5SAndroid Build Coastguard Worker# This takes no extra arguments that differ from a loadable_module.
558*8975f5c5SAndroid Build Coastguard Workertemplate("mac_plugin_bundle") {
559*8975f5c5SAndroid Build Coastguard Worker  assert(defined(invoker.deps),
560*8975f5c5SAndroid Build Coastguard Worker         "Dependencies must be specified for $target_name")
561*8975f5c5SAndroid Build Coastguard Worker
562*8975f5c5SAndroid Build Coastguard Worker  _target_name = target_name
563*8975f5c5SAndroid Build Coastguard Worker  _loadable_module_target = _target_name + "_loadable_module"
564*8975f5c5SAndroid Build Coastguard Worker  _loadable_module_bundle_data = _loadable_module_target + "_bundle_data"
565*8975f5c5SAndroid Build Coastguard Worker
566*8975f5c5SAndroid Build Coastguard Worker  _output_name = _target_name
567*8975f5c5SAndroid Build Coastguard Worker  if (defined(invoker.output_name)) {
568*8975f5c5SAndroid Build Coastguard Worker    _output_name = invoker.output_name
569*8975f5c5SAndroid Build Coastguard Worker  }
570*8975f5c5SAndroid Build Coastguard Worker
571*8975f5c5SAndroid Build Coastguard Worker  loadable_module(_loadable_module_target) {
572*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_loadable_module_bundle_data" ]
573*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
574*8975f5c5SAndroid Build Coastguard Worker                           "*",
575*8975f5c5SAndroid Build Coastguard Worker                           [
576*8975f5c5SAndroid Build Coastguard Worker                             "assert_no_deps",
577*8975f5c5SAndroid Build Coastguard Worker                             "data_deps",
578*8975f5c5SAndroid Build Coastguard Worker                             "output_name",
579*8975f5c5SAndroid Build Coastguard Worker                             "visibility",
580*8975f5c5SAndroid Build Coastguard Worker                           ])
581*8975f5c5SAndroid Build Coastguard Worker    output_dir = "$target_out_dir"
582*8975f5c5SAndroid Build Coastguard Worker    output_name = _output_name
583*8975f5c5SAndroid Build Coastguard Worker  }
584*8975f5c5SAndroid Build Coastguard Worker
585*8975f5c5SAndroid Build Coastguard Worker  bundle_data(_loadable_module_bundle_data) {
586*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "testonly" ])
587*8975f5c5SAndroid Build Coastguard Worker    visibility = [ ":$_target_name" ]
588*8975f5c5SAndroid Build Coastguard Worker    sources = [ "$target_out_dir/$_output_name.so" ]
589*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "{{bundle_executable_dir}}/$_output_name" ]
590*8975f5c5SAndroid Build Coastguard Worker    public_deps = [ ":$_loadable_module_target" ]
591*8975f5c5SAndroid Build Coastguard Worker  }
592*8975f5c5SAndroid Build Coastguard Worker
593*8975f5c5SAndroid Build Coastguard Worker  create_bundle(_target_name) {
594*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
595*8975f5c5SAndroid Build Coastguard Worker                           [
596*8975f5c5SAndroid Build Coastguard Worker                             "data_deps",
597*8975f5c5SAndroid Build Coastguard Worker                             "deps",
598*8975f5c5SAndroid Build Coastguard Worker                             "public_deps",
599*8975f5c5SAndroid Build Coastguard Worker                             "testonly",
600*8975f5c5SAndroid Build Coastguard Worker                             "visibility",
601*8975f5c5SAndroid Build Coastguard Worker                           ])
602*8975f5c5SAndroid Build Coastguard Worker    if (!defined(deps)) {
603*8975f5c5SAndroid Build Coastguard Worker      deps = []
604*8975f5c5SAndroid Build Coastguard Worker    }
605*8975f5c5SAndroid Build Coastguard Worker    deps += [ ":$_loadable_module_bundle_data" ]
606*8975f5c5SAndroid Build Coastguard Worker
607*8975f5c5SAndroid Build Coastguard Worker    if (enable_dsyms) {
608*8975f5c5SAndroid Build Coastguard Worker      data = [
609*8975f5c5SAndroid Build Coastguard Worker        "$root_out_dir/$_output_name.so.dSYM/Contents/Info.plist",
610*8975f5c5SAndroid Build Coastguard Worker        "$root_out_dir/$_output_name.so.dSYM/Contents/Resources/DWARF/$_output_name.so",
611*8975f5c5SAndroid Build Coastguard Worker      ]
612*8975f5c5SAndroid Build Coastguard Worker    }
613*8975f5c5SAndroid Build Coastguard Worker
614*8975f5c5SAndroid Build Coastguard Worker    bundle_root_dir = "$root_out_dir/$_output_name.plugin"
615*8975f5c5SAndroid Build Coastguard Worker    bundle_contents_dir = "$bundle_root_dir/Contents"
616*8975f5c5SAndroid Build Coastguard Worker    bundle_executable_dir = "$bundle_contents_dir/MacOS"
617*8975f5c5SAndroid Build Coastguard Worker  }
618*8975f5c5SAndroid Build Coastguard Worker}
619