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