Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Side by Side Diff: build/config/ios/rules.gni

Issue 2219323002: [iOS] Refactor build/config/ios/rules.gni. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@always-use-lipo
Patch Set: Workaround for crbug.com/637065. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import("//build/config/ios/ios_sdk.gni") 5 import("//build/config/ios/ios_sdk.gni")
6 import("//build/config/mac/base_rules.gni") 6 import("//build/config/mac/base_rules.gni")
7 import("//build/config/mac/symbols.gni") 7 import("//build/config/mac/symbols.gni")
8 8
9 _is_secondary_build = 9 # Control whether an intermediate source_set is used when building executables
10 additional_toolchains != [] && current_toolchain != default_toolchain 10 # and shared_libraries for ios_app_bundle and ios_framework_bundle. This is a
11 11 # temporary flag that will be removed once scoped_nsobject_unittest{_arc}.mm
12 _code_signing_script_path = "//build/config/ios/codesign.py" 12 # tests are passing with this flag set to true (see crbug.com/637065)
13 _default_entitlements_path = "//build/config/ios/entitlements.plist" 13 _use_intermediate_source_set = false
14
15 # Invokes lipo on multiple arch-specific binaries to create a fat binary.
16 #
17 # Arguments
18 #
19 # arch_binary_target
20 # name of the target generating the arch-specific binaries, they must
21 # be named $target_out_dir/$toolchain_cpu/$arch_binary_output.
22 #
23 # arch_binary_output
24 # (optional, defaults to the name of $arch_binary_target) base name of
25 # the arch-specific binary generated by arch_binary_target.
26 #
27 # output_name
28 # (optional, defaults to $target_name) base name of the target output,
29 # the full path will be $target_out_dir/$output_name.
30 #
31 # configs
32 # (optional) a list of configurations, this is used to check whether
33 # the binary should be stripped, when "enable_stripping" is true.
34 #
35 template("lipo_binary") {
36 assert(defined(invoker.arch_binary_target),
37 "arch_binary_target must be defined for $target_name")
38
39 _target_name = target_name
40 _output_name = target_name
41 if (defined(invoker.output_name)) {
42 _output_name = invoker.output_name
43 }
44
45 _all_target_cpu = [ current_cpu ] + additional_target_cpus
46 _all_toolchains = [ current_toolchain ] + additional_toolchains
47
48 _arch_binary_target = invoker.arch_binary_target
49 _arch_binary_output = get_label_info(_arch_binary_target, "name")
50 if (defined(invoker.arch_binary_output)) {
51 _arch_binary_output = invoker.arch_binary_output
52 }
53
54 action(_target_name) {
55 forward_variables_from(invoker,
56 "*",
57 [
58 "arch_binary_output",
59 "arch_binary_target",
60 "configs",
61 "output_name",
62 ])
63
64 script = "//build/toolchain/mac/linker_driver.py"
65
66 outputs = [
67 "$target_out_dir/$_output_name",
68 ]
69
70 deps = []
71 _index = 0
72 inputs = []
73 foreach(_cpu, _all_target_cpu) {
74 _toolchain = _all_toolchains[_index]
75 _index = _index + 1
76
77 inputs +=
78 [ get_label_info("$_arch_binary_target($_toolchain)",
79 "target_out_dir") + "/$_cpu/$_arch_binary_output" ]
80
81 deps += [ "$_arch_binary_target($_toolchain)" ]
82 }
83
84 args = [
85 "xcrun",
86 "lipo",
87 "-create",
88 "-output",
89 rebase_path("$target_out_dir/$_output_name", root_build_dir),
90 ] + rebase_path(inputs, root_build_dir)
91
92 if (enable_dsyms) {
93 _dsyms_output_dir = "$root_out_dir/$_output_name.dSYM"
94 outputs += [
95 "$_dsyms_output_dir/",
96 "$_dsyms_output_dir/Contents/Info.plist",
97 "$_dsyms_output_dir/Contents/Resources/DWARF/$_output_name",
98 ]
99 args += [ "-Wcrl,dsym," + rebase_path("$root_out_dir/.", root_build_dir) ]
100 }
101
102 if (enable_stripping) {
103 # Check whether //build/config/mac:strip_all has been removed from the
104 # configs variables (as this is how stripping is disabled for a single
105 # target).
106 _strip_all_in_config = false
107 if (defined(invoker.configs)) {
108 foreach(_config, invoker.configs) {
109 if (_config == "//build/config/mac:strip_all") {
110 _strip_all_in_config = true
111 }
112 }
113 }
114
115 if (_strip_all_in_config) {
116 args += [ "-Wcrl,strip,-x,-S" ]
117 if (save_unstripped_output) {
118 outputs += [ "$root_out_dir/$_output_name.unstripped" ]
119 args += [ "-Wcrl,unstripped," +
120 rebase_path("$root_out_dir/.", root_build_dir) ]
121 }
122 }
123 }
124 }
125 }
126
127 # Wrapper around create_bundle taking care of code signature settings.
128 #
129 # Arguments
130 #
131 # product_type
132 # string, product type for the generated Xcode project.
133 #
134 # bundle_extension
135 # string, extension of the bundle, used to generate bundle name.
136 #
137 # bundle_binary_target
138 # string, label of the target generating the bundle main binary.
139 #
140 # bundle_binary_output
141 # (optional) string, base name of the binary generated by the
142 # bundle_binary_target target, defaults to the target name.
143 #
144 # extra_system_frameworks
145 # (optional) list of system framework to copy to the bundle.
146 #
147 # enable_code_signing
148 # (optional) boolean, control whether code signing is enabled or not,
149 # default to ios_enable_code_signing if not defined.
150 #
151 template("create_signed_bundle") {
152 assert(defined(invoker.product_type),
153 "product_type must be defined for $target_name")
154 assert(defined(invoker.bundle_extension),
155 "bundle_extension must be defined for $target_name")
156 assert(defined(invoker.bundle_binary_target),
157 "bundle_binary_target must be defined for $target_name")
158
159 _target_name = target_name
160 _output_name = target_name
161 if (defined(invoker.output_name)) {
162 _output_name = invoker.output_name
163 }
164
165 _bundle_binary_target = invoker.bundle_binary_target
166 _bundle_binary_output = get_label_info(_bundle_binary_target, "name")
167 if (defined(invoker.bundle_binary_output)) {
168 _bundle_binary_output = invoker.bundle_binary_output
169 }
170
171 _bundle_extension = invoker.bundle_extension
172 _bundle_root_dir = "$root_out_dir/$_output_name$_bundle_extension"
173
174 _entitlements_path = "//build/config/ios/entitlements.plist"
175 if (defined(invoker.entitlements_path)) {
176 _entitlements_path = invoker.entitlements_path
177 }
178
179 _enable_code_signing = ios_enable_code_signing
180 if (defined(invoker.enable_code_signing)) {
181 _enable_code_signing = invoker.enable_code_signing
182 }
183
184 create_bundle(_target_name) {
185 forward_variables_from(invoker,
186 [
187 "data_deps",
188 "deps",
189 "product_type",
190 "public_configs",
191 "public_deps",
192 "testonly",
193 "visibility",
194 ])
195
196 bundle_root_dir = _bundle_root_dir
197 bundle_resources_dir = _bundle_root_dir
198 bundle_executable_dir = _bundle_root_dir
199 bundle_plugins_dir = "$_bundle_root_dir/PlugIns"
200
201 if (!defined(public_deps)) {
202 public_deps = []
203 }
204 public_deps += [ _bundle_binary_target ]
205
206 if (defined(invoker.bundle_deps)) {
207 if (!defined(deps)) {
208 deps = []
209 }
210 deps += invoker.bundle_deps
211 }
212
213 code_signing_script = "//build/config/ios/codesign.py"
214 code_signing_sources = [
215 _entitlements_path,
216 get_label_info(_bundle_binary_target, "target_out_dir") +
217 "/$_bundle_binary_output",
218 ]
219 code_signing_outputs = [ "$_bundle_root_dir/$_output_name" ]
220 if (_enable_code_signing) {
221 code_signing_outputs +=
222 [ "$_bundle_root_dir/_CodeSignature/CodeResources" ]
223 }
224 if (ios_code_signing_identity != "" && ios_sdk_name != "iphonesimulator") {
225 code_signing_outputs += [ "$_bundle_root_dir/embedded.mobileprovision" ]
226 }
227
228 if (defined(invoker.extra_system_frameworks)) {
229 foreach(_framework, invoker.extra_system_frameworks) {
230 code_signing_outputs += [ "$bundle_root_dir/Frameworks/" +
231 get_path_info(_framework, "file") ]
232 }
233 }
234
235 code_signing_args = [
236 "code-sign-bundle",
237 "-t=" + ios_sdk_name,
238 "-i=" + ios_code_signing_identity,
239 "-e=" + rebase_path(_entitlements_path, root_build_dir),
240 "-b=" + rebase_path("$target_out_dir/$_output_name", root_build_dir),
241 rebase_path(bundle_root_dir, root_build_dir),
242 ]
243 if (!_enable_code_signing) {
244 code_signing_args += [ "--disable-code-signature" ]
245 }
246 if (defined(invoker.extra_system_frameworks)) {
247 # All framework in extra_system_frameworks are expected to be
248 # system framework and the path to be already system absolute
249 # so do not use rebase_path here.
250 foreach(_framework, invoker.extra_system_frameworks) {
251 code_signing_args += [ "-F=" + _framework ]
252 }
253 }
254 }
255 }
14 256
15 # Generates Info.plist files for Mac apps and frameworks. 257 # Generates Info.plist files for Mac apps and frameworks.
16 # 258 #
17 # Arguments 259 # Arguments
18 # 260 #
19 # info_plist: 261 # info_plist:
20 # (optional) string, path to the Info.plist file that will be used for 262 # (optional) string, path to the Info.plist file that will be used for
21 # the bundle. 263 # the bundle.
22 # 264 #
23 # info_plist_target: 265 # info_plist_target:
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 # //build/config/ios/entitlements.plist. 352 # //build/config/ios/entitlements.plist.
111 # 353 #
112 # bundle_extension: 354 # bundle_extension:
113 # (optional) bundle extension including the dot, default to ".app". 355 # (optional) bundle extension including the dot, default to ".app".
114 # 356 #
115 # product_type 357 # product_type
116 # (optional) string, product type for the generated Xcode project, 358 # (optional) string, product type for the generated Xcode project,
117 # default to "com.apple.product-type.application". Should generally 359 # default to "com.apple.product-type.application". Should generally
118 # not be overridden. 360 # not be overridden.
119 # 361 #
362 # enable_code_signing
363 # (optional) boolean, control whether code signing is enabled or not,
364 # default to ios_enable_code_signing if not defined.
365 #
120 # For more information, see "gn help executable". 366 # For more information, see "gn help executable".
121 template("ios_app_bundle") { 367 template("ios_app_bundle") {
122 _output_name = target_name 368 _output_name = target_name
123 _target_name = target_name 369 _target_name = target_name
124 if (defined(invoker.output_name)) { 370 if (defined(invoker.output_name)) {
125 _output_name = invoker.output_name 371 _output_name = invoker.output_name
126 } 372 }
127 373
128 # This template expands to multiple targets with some differences between 374 _arch_executable_source = _target_name + "_arch_executable_sources"
129 # the the different build configuration. 375 _arch_executable_target = _target_name + "_arch_executable"
130 # 376 _lipo_executable_target = _target_name + "_executable"
131 # For a thin build (i.e. when additional_target_cpus is an empty list),
132 # it compiles the final application binary with an "executable" target,
133 # performs variable expansions on the Info.plist, defines some "bundle_data"
134 # target to pack Info.plist and the executable into the .app bundle, and
135 # finally a "create_bundle" target that packs everything the bundle. If the
136 # bundle needs to be signed, then the binary is copied into the bundle by
137 # the "create_bundle" target and the intermediate "bundle_data" target is
138 # not generated.
139 #
140 # For a multi-architecture build (aka fat-build), the template expands to
141 # a simple "executable" target for non-default toolchain. This is because
142 # the real application bundle will contains a single binary that supports
143 # all the architectures and creating a separate .app bundle for every
144 # architecture would be a waste of time.
145 #
146 # The target for the default toolchain of a multi-architecture build will
147 # build the executable for current_cpu in a temporary location. The real
148 # fat binary will be created by "lipo" command from all those "executable"
149 # target (including those of the non-default toolchains). This additional
150 # target has the same role as the "executable" target of a thin build.
151 #
152 # The rest of the build, including the codesigning step, are the same for
153 # thin and fat builds.
154 377
155 _executable_extra_deps = [] 378 if (_use_intermediate_source_set) {
156 _executable_extra_inputs = [] 379 source_set(_arch_executable_source) {
157 _executable_extra_ldflags = []
158
159 # Embeds the entitlements file if building for simulator. This is optional
160 # with Xcode 7 or older but required with Xcode 8. This is not necessary for
161 # device build as the entitlement is embedded via the codesigning step.
162 if (use_ios_simulator) {
163 _generate_entitlements_target = _target_name + "_gen_entitlements"
164 _generate_entitlements_target_with_toolchain_suffix =
165 "$_generate_entitlements_target($default_toolchain)"
166
167 _generate_entitlements_output =
168 get_label_info(_generate_entitlements_target_with_toolchain_suffix,
169 "target_gen_dir") + "/$_output_name.xcent"
170
171 _executable_extra_inputs += [ _generate_entitlements_output ]
172 _executable_extra_deps +=
173 [ ":$_generate_entitlements_target_with_toolchain_suffix" ]
174 _executable_extra_ldflags += [
175 "-Xlinker",
176 "-sectcreate",
177 "-Xlinker",
178 "__TEXT",
179 "-Xlinker",
180 "__entitlements",
181 "-Xlinker",
182 rebase_path(_generate_entitlements_output, root_build_dir),
183 ]
184 }
185
186 if (_is_secondary_build) {
187 # For the non-default toolchain of a fat-build, the template expands to a
188 # single "executable" target that creates "$root_out_dir/$_output_name".
189 executable(_target_name) {
190 forward_variables_from(invoker, 380 forward_variables_from(invoker,
191 "*", 381 "*",
192 [ 382 [
193 "bundle_deps", 383 "bundle_deps",
194 "bundle_deps_filter", 384 "bundle_deps_filter",
195 "bundle_extension", 385 "bundle_extension",
386 "enable_code_signing",
196 "entitlements_path", 387 "entitlements_path",
197 "extra_substitutions", 388 "extra_substitutions",
198 "extra_system_frameworks", 389 "extra_system_frameworks",
199 "info_plist", 390 "info_plist",
200 "info_plist_target", 391 "info_plist_target",
201 "output_name", 392 "output_name",
202 "product_type", 393 "product_type",
394 "visibility",
203 ]) 395 ])
204 396
205 if (defined(visibility)) { 397 visibility = [ ":$_arch_executable_target" ]
206 visibility += [ ":*($default_toolchain)" ] 398 }
399 } else {
400 assert(_arch_executable_source != "",
401 "mark _arch_executable_source as used")
402 }
403
404 if (use_ios_simulator) {
405 _generate_entitlements_target = _target_name + "_gen_entitlements"
406 _generate_entitlements_output =
407 get_label_info(":$_generate_entitlements_target($default_toolchain)",
408 "target_out_dir") + "/$_output_name.xcent"
409 }
410
411 executable(_arch_executable_target) {
412 forward_variables_from(invoker,
413 "*",
414 [
415 "bundle_deps",
416 "bundle_deps_filter",
417 "bundle_extension",
418 "enable_code_signing",
419 "entitlements_path",
420 "extra_substitutions",
421 "extra_system_frameworks",
422 "info_plist",
423 "info_plist_target",
424 "output_name",
425 "product_type",
426 "sources",
427 "visibility",
428 ])
429 if (!_use_intermediate_source_set) {
430 forward_variables_from(invoker, [ "sources" ])
431 }
432
433 visibility = [ ":$_lipo_executable_target($default_toolchain)" ]
434 if (current_toolchain != default_toolchain) {
435 visibility += [ ":$_target_name" ]
436 }
437
438 if (!defined(deps)) {
439 deps = []
440 }
441 if (_use_intermediate_source_set) {
442 deps += [ ":$_arch_executable_source" ]
443 }
444
445 if (!defined(libs)) {
446 libs = []
447 }
448 libs += [ "UIKit.framework" ]
449
450 if (use_ios_simulator) {
451 deps += [ ":$_generate_entitlements_target($default_toolchain)" ]
452
453 if (!defined(inputs)) {
454 inputs = []
207 } 455 }
208 456 inputs += [ _generate_entitlements_output ]
209 if (!defined(deps)) {
210 deps = []
211 }
212 deps += _executable_extra_deps
213 457
214 if (!defined(ldflags)) { 458 if (!defined(ldflags)) {
215 ldflags = [] 459 ldflags = []
216 } 460 }
217 ldflags += _executable_extra_ldflags 461 ldflags += [
462 "-Xlinker",
463 "-sectcreate",
464 "-Xlinker",
465 "__TEXT",
466 "-Xlinker",
467 "__entitlements",
468 "-Xlinker",
469 rebase_path(_generate_entitlements_output, root_build_dir),
470 ]
471 }
218 472
219 if (!defined(inputs)) { 473 output_name = _output_name
220 inputs = [] 474 output_prefix_override = true
221 } 475 output_dir = "$target_out_dir/$current_cpu"
222 inputs += _executable_extra_inputs 476 }
223 477
224 output_name = _output_name 478 if (current_toolchain != default_toolchain) {
225 if (!defined(libs)) { 479 # For fat builds, only the default toolchain will generate an application
226 libs = [] 480 # bundle. For the other toolchains, the template is only used for building
227 } 481 # the arch-specific binary, thus the default target is just a group().
228 libs += [ "UIKit.framework" ] 482
483 group(_target_name) {
484 forward_variables_from(invoker,
485 [
486 "visibility",
487 "testonly",
488 ])
489 public_deps = [
490 ":$_arch_executable_target",
491 ]
229 } 492 }
230 } else { 493 } else {
231 # This is either a thin build or the default toolchain of a fat-build. 494 lipo_binary(_lipo_executable_target) {
232 # The template will expand in many different target ($target_name is the 495 forward_variables_from(invoker,
233 # create_bundle target) used as input to the create_bundle target. 496 [
234 _generate_info_plist = target_name + "_generate_info_plist" 497 "configs",
235 _bundle_data_info_plist = target_name + "_bundle_data_info_plist" 498 "testonly",
499 ])
236 500
237 _entitlements_path = _default_entitlements_path 501 visibility = [ ":$_target_name" ]
238 if (defined(invoker.entitlements_path)) { 502 output_name = _output_name
239 _entitlements_path = invoker.entitlements_path 503 arch_binary_target = ":$_arch_executable_target"
504 arch_binary_output = _output_name
240 } 505 }
241 506
507 _generate_info_plist = target_name + "_generate_info_plist"
242 ios_info_plist(_generate_info_plist) { 508 ios_info_plist(_generate_info_plist) {
243 visibility = [ ":$_bundle_data_info_plist" ]
244 if (use_ios_simulator) {
245 visibility += [ ":$_generate_entitlements_target" ]
246 }
247 executable_name = _output_name
248 forward_variables_from(invoker, 509 forward_variables_from(invoker,
249 [ 510 [
250 "extra_substitutions", 511 "extra_substitutions",
251 "info_plist", 512 "info_plist",
252 "info_plist_target", 513 "info_plist_target",
253 ]) 514 ])
254 }
255 515
256 bundle_data(_bundle_data_info_plist) { 516 executable_name = _output_name
257 visibility = [ ":$_target_name" ]
258 forward_variables_from(invoker, [ "testonly" ])
259 sources = get_target_outputs(":$_generate_info_plist")
260 outputs = [
261 "{{bundle_root_dir}}/Info.plist",
262 ]
263 public_deps = [
264 ":$_generate_info_plist",
265 ]
266 } 517 }
267 518
268 if (use_ios_simulator) { 519 if (use_ios_simulator) {
520 _entitlements_path = "//build/config/ios/entitlements.plist"
521 if (defined(invoker.entitlements_path)) {
522 _entitlements_path = invoker.entitlements_path
523 }
524
269 action(_generate_entitlements_target) { 525 action(_generate_entitlements_target) {
270 _gen_info_plist_target = ":$_generate_info_plist" 526 _gen_info_plist_outputs = get_target_outputs(":$_generate_info_plist")
271 _gen_info_plist_outputs = get_target_outputs(_gen_info_plist_target)
272 _info_plist_path = _gen_info_plist_outputs[0] 527 _info_plist_path = _gen_info_plist_outputs[0]
273 528
274 script = _code_signing_script_path 529 script = "//build/config/ios/codesign.py"
275 deps = [ 530 deps = [
276 _gen_info_plist_target, 531 ":$_generate_info_plist",
277 ] 532 ]
278 sources = [ 533 sources = [
279 _entitlements_path, 534 _entitlements_path,
280 _info_plist_path, 535 _info_plist_path,
281 ] 536 ]
282 outputs = [ 537 outputs = [
283 _generate_entitlements_output, 538 _generate_entitlements_output,
284 ] 539 ]
285 args = [ 540 args = [
286 "generate-entitlements", 541 "generate-entitlements",
287 "-e=" + rebase_path(_entitlements_path, root_build_dir), 542 "-e=" + rebase_path(_entitlements_path, root_build_dir),
288 "-p=" + rebase_path(_info_plist_path, root_build_dir), 543 "-p=" + rebase_path(_info_plist_path, root_build_dir),
289 ] + rebase_path(outputs, root_build_dir) 544 ] + rebase_path(outputs, root_build_dir)
290 } 545 }
291 } 546 }
292 547
293 _link_executable = _target_name + "_arch_executable" 548 _bundle_data_info_plist = target_name + "_bundle_data_info_plist"
294 _lipo_executable = _target_name + "_executable" 549 bundle_data(_bundle_data_info_plist) {
550 forward_variables_from(invoker, [ "testonly" ])
295 551
296 _link_executable_visibility = [ ":$_lipo_executable" ] 552 sources = get_target_outputs(":$_generate_info_plist")
297 _lipo_executable_visibility = [ ":$_target_name" ] 553 outputs = [
554 "{{bundle_root_dir}}/Info.plist",
555 ]
556 public_deps = [
557 ":$_generate_info_plist",
558 ]
559 }
298 560
299 executable(_link_executable) { 561 create_signed_bundle(_target_name) {
300 forward_variables_from(invoker, 562 forward_variables_from(invoker,
301 "*",
302 [ 563 [
303 "bundle_deps", 564 "bundle_deps",
304 "bundle_deps_filter",
305 "bundle_extension", 565 "bundle_extension",
306 "data_deps", 566 "data_deps",
567 "deps",
568 "enable_code_signing",
307 "entitlements_path", 569 "entitlements_path",
308 "extra_substitutions",
309 "extra_system_frameworks", 570 "extra_system_frameworks",
310 "info_plist",
311 "info_plist_target",
312 "output_name",
313 "product_type", 571 "product_type",
314 "visibility", 572 "public_configs",
315 ])
316
317 visibility = _link_executable_visibility
318
319 output_name = _output_name
320 output_prefix_override = true
321 output_dir = "$target_out_dir/$current_cpu"
322
323 if (!defined(deps)) {
324 deps = []
325 }
326 deps += _executable_extra_deps
327
328 if (!defined(ldflags)) {
329 ldflags = []
330 }
331 ldflags += _executable_extra_ldflags
332
333 if (!defined(inputs)) {
334 inputs = []
335 }
336 inputs += _executable_extra_inputs
337
338 if (!defined(libs)) {
339 libs = []
340 }
341 libs += [ "UIKit.framework" ]
342 }
343
344 # Create the multi-architecture binary from all the single architecture
345 # binaries using "lipo". This target exists for the default toolchain
346 # of a fat-build only and depends on the expansion of "ios_app_bundle"
347 # for the other toolchains (i.e. a single "executable" target).
348 #
349 # This action only happens once per "ios_app_bundle" template (for the
350 # main toolchain).
351 action(_lipo_executable) {
352 forward_variables_from(invoker, [ "testonly" ])
353 visibility = _lipo_executable_visibility
354 script = "//build/toolchain/mac/linker_driver.py"
355 outputs = [
356 "$target_out_dir/$_output_name",
357 ]
358 inputs = [
359 "$target_out_dir/$current_cpu/$_output_name",
360 ]
361 deps = [
362 ":$_link_executable",
363 ]
364 foreach(_additional_toolchain, additional_toolchains) {
365 _additional_toolchain_target = "$_target_name($_additional_toolchain)"
366 deps += [ ":$_additional_toolchain_target" ]
367 inputs += [ get_label_info(_additional_toolchain_target,
368 "root_out_dir") + "/$_output_name" ]
369 }
370 args = [
371 "xcrun",
372 "lipo",
373 "-create",
374 "-output",
375 rebase_path(outputs[0], root_build_dir),
376 ] + rebase_path(inputs, root_build_dir)
377
378 if (enable_dsyms) {
379 _dsyms_dir = "$root_out_dir/$_output_name.dSYM/"
380 outputs += [
381 "$_dsyms_dir/",
382 "$_dsyms_dir/Contents/Info.plist",
383 "$_dsyms_dir/Contents/Resources/DWARF/$_output_name",
384 ]
385 args +=
386 [ "-Wcrl,dsym," + rebase_path("$root_out_dir/.", root_build_dir) ]
387 }
388
389 if (enable_stripping) {
390 # Check whether //build/config/mac:strip_all has been removed from
391 # the configs variable (as this is how stripping is disabled for a
392 # single target).
393 _strip_all_in_config = false
394 if (defined(invoker.configs)) {
395 foreach(_config, invoker.configs) {
396 if (_config == "//build/config/mac:strip_all") {
397 _strip_all_in_config = true
398 }
399 }
400 }
401
402 if (_strip_all_in_config) {
403 args += [ "-Wcrl,strip,-x,-S" ]
404
405 if (save_unstripped_output) {
406 outputs += [ outputs[0] + ".unstripped" ]
407 args += [ "-Wcrl,unstripped," +
408 rebase_path(get_path_info(outputs[0], "dir"),
409 root_build_dir) ]
410 }
411 }
412 }
413 }
414
415 create_bundle(target_name) {
416 forward_variables_from(invoker,
417 [
418 "bundle_deps_filter",
419 "data_deps",
420 "deps",
421 "public_deps", 573 "public_deps",
422 "testonly", 574 "testonly",
423 "visibility", 575 "visibility",
424 ]) 576 ])
425 577
426 if (!defined(deps)) { 578 output_name = _output_name
427 deps = [] 579 bundle_binary_target = ":$_lipo_executable_target"
580 bundle_binary_output = _output_name
581
582 if (!defined(bundle_deps)) {
583 bundle_deps = []
428 } 584 }
429 deps += [ ":$_bundle_data_info_plist" ] 585 bundle_deps += [ ":$_bundle_data_info_plist" ]
430 if (!defined(public_deps)) {
431 public_deps = []
432 }
433 public_deps += [ ":$_lipo_executable" ]
434 if (defined(invoker.bundle_deps)) {
435 deps += invoker.bundle_deps
436 }
437 586
438 if (use_ios_simulator) { 587 if (use_ios_simulator) {
439 if (!defined(data_deps)) { 588 if (!defined(data_deps)) {
440 data_deps = [] 589 data_deps = []
441 } 590 }
442 data_deps += [ "//testing/iossim" ] 591 data_deps += [ "//testing/iossim" ]
443 } 592 }
444 593
445 if (defined(invoker.product_type)) { 594 if (!defined(product_type)) {
446 product_type = invoker.product_type
447 } else {
448 product_type = "com.apple.product-type.application" 595 product_type = "com.apple.product-type.application"
449 } 596 }
450 597
451 if (defined(invoker.bundle_extension)) { 598 if (!defined(bundle_extension)) {
452 _bundle_extension = invoker.bundle_extension 599 bundle_extension = ".app"
453 } else {
454 _bundle_extension = ".app"
455 }
456
457 bundle_root_dir = "$root_out_dir/$_output_name$_bundle_extension"
458 bundle_resources_dir = bundle_root_dir
459 bundle_executable_dir = bundle_root_dir
460 bundle_plugins_dir = "$bundle_root_dir/PlugIns"
461
462 code_signing_script = _code_signing_script_path
463 code_signing_sources = [
464 _entitlements_path,
465 "$target_out_dir/$_output_name",
466 ]
467 code_signing_outputs = [ "$bundle_root_dir/$_output_name" ]
468 if (ios_enable_code_signing) {
469 code_signing_outputs +=
470 [ "$bundle_root_dir/_CodeSignature/CodeResources" ]
471 }
472 if (ios_code_signing_identity != "") {
473 code_signing_outputs += [ "$bundle_root_dir/embedded.mobileprovision" ]
474 }
475 if (defined(invoker.extra_system_frameworks)) {
476 foreach(_framework, invoker.extra_system_frameworks) {
477 code_signing_outputs += [ "$bundle_root_dir/Frameworks/" +
478 get_path_info(_framework, "file") ]
479 }
480 }
481 code_signing_args = [
482 "code-sign-bundle",
483 "-t=" + ios_sdk_name,
484 "-i=" + ios_code_signing_identity,
485 "-e=" + rebase_path(_entitlements_path, root_build_dir),
486 "-b=" + rebase_path("$target_out_dir/$_output_name", root_build_dir),
487 rebase_path(bundle_root_dir, root_build_dir),
488 ]
489 if (defined(invoker.extra_system_frameworks)) {
490 # All framework in extra_system_frameworks are expected to be
491 # system framework and the path to be already system absolute
492 # so do not use rebase_path here.
493 foreach(_framework, invoker.extra_system_frameworks) {
494 code_signing_args += [ "-F=" + _framework ]
495 }
496 }
497 if (!ios_enable_code_signing) {
498 code_signing_args += [ "--disable-code-signature" ]
499 } 600 }
500 } 601 }
501 } 602 }
502
503 # TODO(crbug.com/395883): ensure those variables are marked as used to
504 # avoid errors while running "gn gen".
505 if (defined(invoker.entitlements_path)) {
506 assert(invoker.entitlements_path != "",
507 "mark invoker.entitlements_path as used")
508 }
509 if (defined(invoker.bundle_extension)) {
510 assert(invoker.bundle_extension != "",
511 "mark invoker.bundle_extension as used")
512 }
513 if (defined(invoker.bundle_extension)) {
514 assert(invoker.bundle_extension != "",
515 "mark invoker.bundle_extension as used")
516 }
517 if (defined(invoker.entitlements_path)) {
518 assert(invoker.entitlements_path != "",
519 "mark invoker.entitlements_path as used")
520 }
521 if (defined(invoker.extra_substitutions)) {
522 assert(invoker.extra_substitutions != [],
523 "mark invoker.extra_substitutions as used")
524 }
525 if (defined(invoker.info_plist)) {
526 assert(invoker.info_plist != "", "mark invoker.info_plist as used")
527 }
528 if (defined(invoker.info_plist_target)) {
529 assert(invoker.info_plist_target != "",
530 "mark invoker.info_plist_target as used")
531 }
532 if (defined(invoker.product_type)) {
533 assert(invoker.product_type != "", "mark product_type as used")
534 }
535 if (defined(invoker.bundle_deps)) {
536 assert(invoker.bundle_deps != [], "mark bundle_deps as used")
537 }
538 if (defined(invoker.bundle_deps_filter)) {
539 assert(invoker.bundle_deps_filter != [], "mark bundle_deps_filter as used")
540 }
541 } 603 }
542 604
543 set_defaults("ios_app_bundle") { 605 set_defaults("ios_app_bundle") {
544 configs = default_executable_configs 606 configs = default_executable_configs
545 } 607 }
546 608
547 # Template to build an application extension bundle for iOS. 609 # Template to build an application extension bundle for iOS.
548 # 610 #
549 # This should be used instead of "executable" built-in target type on iOS. 611 # This should be used instead of "executable" built-in target type on iOS.
550 # As the template forward the generation of the application executable to 612 # As the template forward the generation of the application executable to
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 # a link-time (as well as build-time) dependency on the framework bundle, 772 # a link-time (as well as build-time) dependency on the framework bundle,
711 # depend against "$target_name+link". If only the build-time dependency is 773 # depend against "$target_name+link". If only the build-time dependency is
712 # required (e.g., for copying into another bundle), then use "$target_name". 774 # required (e.g., for copying into another bundle), then use "$target_name".
713 # 775 #
714 # Arguments 776 # Arguments
715 # 777 #
716 # output_name: 778 # output_name:
717 # (optional) string, name of the generated framework without the 779 # (optional) string, name of the generated framework without the
718 # .framework suffix. If omitted, defaults to target_name. 780 # .framework suffix. If omitted, defaults to target_name.
719 # 781 #
720 # framework_version:
721 # (optional) string, version of the framework. Typically this is a
722 # single letter, like "A". If omitted, the Versions/ subdirectory
723 # structure will not be created, and build output will go directly
724 # into the framework subdirectory.
725 #
726 # public_headers: 782 # public_headers:
727 # (optional) list of paths to header file that needs to be copied 783 # (optional) list of paths to header file that needs to be copied
728 # into the framework bundle Headers subdirectory. If omitted or 784 # into the framework bundle Headers subdirectory. If omitted or
729 # empty then the Headers subdirectory is not created. 785 # empty then the Headers subdirectory is not created.
730 # 786 #
731 # sources 787 # sources
732 # (optional) list of files. Needs to be defined and non-empty if 788 # (optional) list of files. Needs to be defined and non-empty if
733 # public_headers is defined and non-empty. 789 # public_headers is defined and non-empty.
734 # 790 #
791 # enable_code_signing
792 # (optional) boolean, control whether code signing is enabled or not,
793 # default to ios_enable_code_signing if not defined.
794 #
735 # This template provides two targets for the resulting framework bundle. The 795 # This template provides two targets for the resulting framework bundle. The
736 # link-time behavior varies depending on which of the two targets below is 796 # link-time behavior varies depending on which of the two targets below is
737 # added as a dependency: 797 # added as a dependency:
738 # - $target_name only adds a build-time dependency. Targets that depend on 798 # - $target_name only adds a build-time dependency. Targets that depend on
739 # it will not link against the framework. 799 # it will not link against the framework.
740 # - $target_name+link adds a build-time and link-time dependency. Targets 800 # - $target_name+link adds a build-time and link-time dependency. Targets
741 # that depend on it will link against the framework. 801 # that depend on it will link against the framework.
742 # 802 #
743 # The build-time-only dependency is used for when a target needs to use the 803 # The build-time-only dependency is used for when a target needs to use the
744 # framework either only for resources, or because the target loads it at run- 804 # framework either only for resources, or because the target loads it at run-
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 867
808 _has_public_headers = 868 _has_public_headers =
809 defined(invoker.public_headers) && invoker.public_headers != [] 869 defined(invoker.public_headers) && invoker.public_headers != []
810 870
811 if (_has_public_headers) { 871 if (_has_public_headers) {
812 _framework_headers_target = _target_name + "_framework_headers" 872 _framework_headers_target = _target_name + "_framework_headers"
813 _framework_headers_config = _target_name + "_framework_headers_config" 873 _framework_headers_config = _target_name + "_framework_headers_config"
814 _headers_map_config = _target_name + "_headers_map" 874 _headers_map_config = _target_name + "_headers_map"
815 } 875 }
816 876
817 # The expansion of the template is different for fat and thin builds. For 877 _arch_shared_library_source = _target_name + "_arch_shared_library_sources"
818 # thin build (and default toolchain of a fat build), the template expands 878 _arch_shared_library_target = _target_name + "_arch_shared_library"
819 # to a "shared_library" target to create the bundle shared library and a 879 _lipo_shared_library_target = _target_name + "_shared_library"
820 # "create_bundle" target (the main target) to create the bundle structure.
821 #
822 # For a fat build, the template just expands to the "shared_library" target
823 # for the non-default toolchain, while the final library is created using
824 # "lipo" in the expansion of the template for the default toolchain.
825 #
826 # The "$target_name+link" group for the non-default toolchain depends on the
827 # target of the same name from the default toolchain as this is the target
828 # that defines the real framework bundle (it will support the current cpu
829 # as it is a fat framework).
830 880
831 if (_is_secondary_build) { 881 if (_use_intermediate_source_set) {
832 shared_library(_target_name) { 882 source_set(_arch_shared_library_source) {
833 forward_variables_from(invoker, 883 forward_variables_from(invoker,
834 "*", 884 "*",
835 [ 885 [
836 "assert_no_deps",
837 "bundle_deps", 886 "bundle_deps",
887 "bundle_deps_filter",
838 "data_deps", 888 "data_deps",
839 "enable_code_signing", 889 "enable_code_signing",
840 "info_plist", 890 "info_plist",
841 "info_plist_target", 891 "info_plist_target",
842 "output_name", 892 "output_name",
893 "visibility",
843 ]) 894 ])
844 if (defined(visibility)) { 895
845 visibility += [ ":${_target_name}_shared_library($default_toolchain)" ] 896 visibility = [ ":$_arch_shared_library_target" ]
846 }
847 output_name = _output_name
848 output_prefix_override = true
849 output_extension = ""
850 output_dir = "$target_out_dir/$_target_name"
851 897
852 if (_has_public_headers) { 898 if (_has_public_headers) {
853 configs += [ 899 configs += [
854 ":$_framework_headers_config($default_toolchain)", 900 ":$_framework_headers_config($default_toolchain)",
901 ":$_headers_map_config($default_toolchain)",
902 ]
903
904 if (!defined(deps)) {
905 deps = []
906 }
907 deps += [ ":$_framework_headers_target($default_toolchain)" ]
908 }
909 }
910 } else {
911 assert(_arch_shared_library_source != "",
912 "mark _arch_shared_library_source as used")
913 }
914
915 shared_library(_arch_shared_library_target) {
916 forward_variables_from(invoker,
917 "*",
918 [
919 "bundle_deps",
920 "bundle_deps_filter",
921 "data_deps",
922 "enable_code_signing",
923 "info_plist",
924 "info_plist_target",
925 "output_name",
926 "sources",
927 "visibility",
928 ])
929 if (!_use_intermediate_source_set) {
930 forward_variables_from(invoker, [ "sources" ])
931 }
932
933 visibility = [ ":$_lipo_shared_library_target($default_toolchain)" ]
934 if (current_toolchain != default_toolchain) {
935 visibility += [ ":$_target_name" ]
936 }
937
938 if (!defined(deps)) {
939 deps = []
940 }
941 if (_use_intermediate_source_set) {
942 deps += [ ":$_arch_shared_library_source" ]
943 } else {
944 if (_has_public_headers) {
945 configs += [
946 ":$_framework_headers_config($default_toolchain)",
855 ":$_headers_map_config($default_toolchain)", 947 ":$_headers_map_config($default_toolchain)",
856 ] 948 ]
857 949
858 if (!defined(deps)) { 950 if (!defined(deps)) {
859 deps = [] 951 deps = []
860 } 952 }
861 deps += [ ":$_framework_headers_target($default_toolchain)" ] 953 deps += [ ":$_framework_headers_target($default_toolchain)" ]
862 } 954 }
863 } 955 }
864 956
957 output_extension = ""
958 output_name = _output_name
959 output_prefix_override = true
960 output_dir = "$target_out_dir/$current_cpu"
961 }
962
963 if (current_toolchain != default_toolchain) {
964 # For fat builds, only the default toolchain will generate a framework
965 # bundle. For the other toolchains, the template is only used for building
966 # the arch-specific binary, thus the default target is just a group().
967
968 group(_target_name) {
969 forward_variables_from(invoker,
970 [
971 "visibility",
972 "testonly",
973 ])
974 public_deps = [
975 ":$_arch_shared_library_target",
976 ]
977 }
978
865 group(_target_name + "+link") { 979 group(_target_name + "+link") {
866 forward_variables_from(invoker, 980 forward_variables_from(invoker,
867 [ 981 [
868 "visibility", 982 "visibility",
869 "testonly", 983 "testonly",
870 ]) 984 ])
871 public_deps = [ 985 public_deps = [
872 ":$_target_name+link($default_toolchain)", 986 ":$_target_name+link($default_toolchain)",
873 ] 987 ]
874 } 988 }
875 989
876 if (defined(invoker.bundle_deps)) { 990 if (defined(invoker.bundle_deps)) {
877 assert(invoker.bundle_deps != [], "mark bundle_deps as used") 991 assert(invoker.bundle_deps != [], "mark bundle_deps as used")
878 } 992 }
879 } else { 993 } else {
880 if (_has_public_headers) { 994 if (_has_public_headers) {
881 _public_headers = invoker.public_headers 995 _public_headers = invoker.public_headers
882 _framework_name = _output_name + ".framework" 996 _framework_root = "$root_out_dir/$_output_name.framework"
883 _framework_root = "$root_out_dir/$_framework_name"
884 997
885 _header_map_filename = "$target_gen_dir/$_output_name.headers.hmap" 998 _header_map_filename = "$target_gen_dir/$_output_name.headers.hmap"
886 999
887 _compile_headers_map_target = _target_name + "_compile_headers_map" 1000 _compile_headers_map_target = _target_name + "_compile_headers_map"
888 action(_compile_headers_map_target) { 1001 action(_compile_headers_map_target) {
889 visibility = [ ":$_framework_headers_target" ] 1002 visibility = [ ":$_framework_headers_target" ]
890 script = "//build/config/ios/write_framework_hmap.py" 1003 script = "//build/config/ios/write_framework_hmap.py"
891 outputs = [ 1004 outputs = [
892 _header_map_filename, 1005 _header_map_filename,
893 ] 1006 ]
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 outputs = [ 1042 outputs = [
930 "$_framework_root/Headers/{{source_file_part}}", 1043 "$_framework_root/Headers/{{source_file_part}}",
931 ] 1044 ]
932 } 1045 }
933 1046
934 config(_headers_map_config) { 1047 config(_headers_map_config) {
935 visibility = [ ":$_target_name" ] 1048 visibility = [ ":$_target_name" ]
936 include_dirs = [ _header_map_filename ] 1049 include_dirs = [ _header_map_filename ]
937 ldflags = [ 1050 ldflags = [
938 "-install_name", 1051 "-install_name",
939 "@rpath/$_framework_name/$_output_name", 1052 "@rpath/$_output_name.framework/$_output_name",
940 ] 1053 ]
941 } 1054 }
942 1055
943 group(_framework_headers_target) { 1056 group(_framework_headers_target) {
944 deps = [ 1057 deps = [
945 ":$_compile_headers_map_target", 1058 ":$_compile_headers_map_target",
946 ":$_copy_public_headers_target", 1059 ":$_copy_public_headers_target",
947 ":$_create_module_map_target", 1060 ":$_create_module_map_target",
948 ] 1061 ]
949 } 1062 }
950 1063
951 config(_framework_headers_config) { 1064 config(_framework_headers_config) {
952 # The link settings are inherited from the framework_bundle config. 1065 # The link settings are inherited from the framework_bundle config.
953 cflags = [ 1066 cflags = [
954 "-F", 1067 "-F",
955 rebase_path("$root_out_dir/.", root_build_dir), 1068 rebase_path("$root_out_dir/.", root_build_dir),
956 ] 1069 ]
957 } 1070 }
958 } 1071 }
959 1072
960 # If the framework is unversioned, the final _target_name will be the 1073 lipo_binary(_lipo_shared_library_target) {
961 # create_bundle(_framework_target), otherwise an action with the name 1074 forward_variables_from(invoker,
962 # _target_name will depends on the the create_bundle() in order to prepare 1075 [
963 # the versioned directory structure. 1076 "configs",
964 _framework_target = _target_name 1077 "testonly",
965 _framework_name = _output_name + ".framework" 1078 ])
966 _framework_root_dir = "$root_out_dir/$_framework_name"
967 if (defined(invoker.framework_version) && invoker.framework_version != "") {
968 _framework_version = invoker.framework_version
969 _framework_root_dir += "/Versions/$_framework_version"
970 _framework_target = _target_name + "_create_bundle"
971 }
972 1079
973 _link_shared_library_target = target_name + "_arch_shared_library" 1080 visibility = [ ":$_target_name" ]
974 _lipo_shared_library_target = target_name + "_shared_library"
975
976 _lipo_shared_library_visibility = [ ":$_framework_target" ]
977 _link_shared_library_visibility = [ ":$_lipo_shared_library_target" ]
978
979 _arch_shared_library_dir = "$target_out_dir/$_link_shared_library_target"
980 _shared_library_dir = "$target_out_dir/$_lipo_shared_library_target"
981
982 shared_library(_link_shared_library_target) {
983 forward_variables_from(invoker,
984 "*",
985 [
986 "assert_no_deps",
987 "bundle_deps",
988 "data_deps",
989 "enable_code_signing",
990 "info_plist",
991 "info_plist_target",
992 "output_name",
993 "visibility",
994 ])
995 visibility = _link_shared_library_visibility
996 output_name = _output_name 1081 output_name = _output_name
997 output_prefix_override = true 1082 arch_binary_target = ":$_arch_shared_library_target"
998 output_extension = "" 1083 arch_binary_output = _output_name
999 output_dir = _arch_shared_library_dir
1000
1001 if (_has_public_headers) {
1002 configs += [ ":$_headers_map_config($default_toolchain)" ]
1003
1004 if (!defined(deps)) {
1005 deps = []
1006 }
1007 deps += [ ":$_framework_headers_target($default_toolchain)" ]
1008 }
1009 }
1010
1011 action(_lipo_shared_library_target) {
1012 forward_variables_from(invoker, [ "testonly" ])
1013 visibility = _lipo_shared_library_visibility
1014 script = "//build/toolchain/mac/linker_driver.py"
1015 outputs = [
1016 "$_shared_library_dir/$_output_name",
1017 ]
1018 inputs = [
1019 "$_arch_shared_library_dir/$_output_name",
1020 ]
1021 deps = [
1022 ":$_link_shared_library_target",
1023 ]
1024 foreach(_additional_toolchain, additional_toolchains) {
1025 _additional_toolchain_target = "$_target_name($_additional_toolchain)"
1026 deps += [ ":$_additional_toolchain_target" ]
1027 inputs += [ get_label_info(_additional_toolchain_target,
1028 "target_out_dir") + "/$_output_name" ]
1029 }
1030 args = [
1031 "xcrun",
1032 "lipo",
1033 "-create",
1034 "-output",
1035 rebase_path(outputs[0], root_build_dir),
1036 ] + rebase_path(inputs, root_build_dir)
1037
1038 if (enable_dsyms) {
1039 _dsyms_dir = "$root_out_dir/$_output_name.dSYM/"
1040 outputs += [
1041 "$_dsyms_dir/",
1042 "$_dsyms_dir/Contents/Info.plist",
1043 "$_dsyms_dir/Contents/Resources/DWARF/$_output_name",
1044 ]
1045 args +=
1046 [ "-Wcrl,dsym," + rebase_path("$root_out_dir/.", root_build_dir) ]
1047 }
1048
1049 if (enable_stripping) {
1050 # Check whether //build/config/mac:strip_all has been removed from
1051 # the configs variable (as this is how stripping is disabled for a
1052 # single target).
1053 _strip_all_in_config = false
1054 if (defined(invoker.configs)) {
1055 foreach(_config, invoker.configs) {
1056 if (_config == "//build/config/mac:strip_all") {
1057 _strip_all_in_config = true
1058 }
1059 }
1060 }
1061
1062 if (_strip_all_in_config) {
1063 args += [ "-Wcrl,strip,-x,-S" ]
1064
1065 if (save_unstripped_output) {
1066 outputs += [ outputs[0] + ".unstripped" ]
1067 args += [ "-Wcrl,unstripped," +
1068 rebase_path(get_path_info(outputs[0], "dir"),
1069 root_build_dir) ]
1070 }
1071 }
1072 }
1073 } 1084 }
1074 1085
1075 _framework_public_config = _target_name + "_public_config" 1086 _framework_public_config = _target_name + "_public_config"
1076 config(_framework_public_config) { 1087 config(_framework_public_config) {
1077 # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs 1088 # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs
1078 # and include_dirs to avoid duplicate values on the command-line. 1089 # and include_dirs to avoid duplicate values on the command-line.
1079 visibility = [ ":$_framework_target" ] 1090 visibility = [ ":$_target_name" ]
1080 ldflags = [ 1091 ldflags = [
1081 "-F", 1092 "-F",
1082 rebase_path("$root_out_dir/.", root_build_dir), 1093 rebase_path("$root_out_dir/.", root_build_dir),
1083 ] 1094 ]
1084 lib_dirs = [ root_out_dir ] 1095 lib_dirs = [ root_out_dir ]
1085 libs = [ _framework_name ] 1096 libs = [ "$_output_name.framework" ]
1086 } 1097 }
1087 1098
1088 _info_plist_target = _target_name + "_info_plist" 1099 _info_plist_target = _target_name + "_info_plist"
1089 _info_plist_bundle = _target_name + "_info_plist_bundle" 1100 _info_plist_bundle = _target_name + "_info_plist_bundle"
1090 ios_info_plist(_info_plist_target) { 1101 ios_info_plist(_info_plist_target) {
1091 visibility = [ ":$_info_plist_bundle" ] 1102 visibility = [ ":$_info_plist_bundle" ]
1092 executable_name = _output_name 1103 executable_name = _output_name
1093 forward_variables_from(invoker, 1104 forward_variables_from(invoker,
1094 [ 1105 [
1095 "extra_substitutions", 1106 "extra_substitutions",
1096 "info_plist", 1107 "info_plist",
1097 "info_plist_target", 1108 "info_plist_target",
1098 ]) 1109 ])
1099 } 1110 }
1100 1111
1101 bundle_data(_info_plist_bundle) { 1112 bundle_data(_info_plist_bundle) {
1102 visibility = [ ":$_target_name" ] 1113 visibility = [ ":$_target_name" ]
1103 forward_variables_from(invoker, [ "testonly" ]) 1114 forward_variables_from(invoker, [ "testonly" ])
1104 sources = get_target_outputs(":$_info_plist_target") 1115 sources = get_target_outputs(":$_info_plist_target")
1105 outputs = [ 1116 outputs = [
1106 "{{bundle_root_dir}}/Info.plist", 1117 "{{bundle_root_dir}}/Info.plist",
1107 ] 1118 ]
1108 public_deps = [ 1119 public_deps = [
1109 ":$_info_plist_target", 1120 ":$_info_plist_target",
1110 ] 1121 ]
1111 } 1122 }
1112 1123
1113 create_bundle(_framework_target) { 1124 create_signed_bundle(_target_name) {
1114 forward_variables_from(invoker, 1125 forward_variables_from(invoker,
1115 [ 1126 [
1127 "bundle_deps",
1116 "data_deps", 1128 "data_deps",
1117 "deps", 1129 "deps",
1130 "enable_code_signing",
1118 "public_configs", 1131 "public_configs",
1119 "public_deps", 1132 "public_deps",
1120 "testonly", 1133 "testonly",
1134 "visibility",
1121 ]) 1135 ])
1122 1136
1123 if (defined(_framework_version)) { 1137 product_type = "com.apple.product-type.framework"
1124 visibility = [ ":$_target_name" ] 1138 bundle_extension = ".framework"
1125 } else { 1139
1126 if (defined(invoker.visibility)) { 1140 output_name = _output_name
1127 visibility = invoker.visibility 1141 bundle_binary_target = ":$_lipo_shared_library_target"
1128 visibility += [ ":$_target_name+link" ] 1142 bundle_binary_output = _output_name
1129 }
1130 }
1131 1143
1132 if (!defined(deps)) { 1144 if (!defined(deps)) {
1133 deps = [] 1145 deps = []
1134 } 1146 }
1135 deps += [ ":$_info_plist_bundle" ] 1147 deps += [ ":$_info_plist_bundle" ]
1136
1137 if (defined(invoker.bundle_deps)) {
1138 if (!defined(deps)) {
1139 deps = []
1140 }
1141 deps += invoker.bundle_deps
1142 }
1143
1144 bundle_root_dir = _framework_root_dir
1145 bundle_resources_dir = _framework_root_dir
1146 bundle_executable_dir = _framework_root_dir
1147
1148 if (!defined(deps)) {
1149 deps = []
1150 }
1151 deps += [ ":$_lipo_shared_library_target" ]
1152
1153 _entitlements_path = _default_entitlements_path
1154 if (defined(invoker.entitlements_path)) {
1155 _entitlements_path = invoker.entitlements_path
1156 }
1157
1158 _ios_enable_code_signing = ios_enable_code_signing
1159 if (defined(invoker.enable_code_signing)) {
1160 _ios_enable_code_signing = invoker.enable_code_signing
1161 }
1162
1163 code_signing_script = _code_signing_script_path
1164 code_signing_sources = [
1165 _entitlements_path,
1166 "$_shared_library_dir/$_output_name",
1167 ]
1168 code_signing_outputs = [ "$bundle_root_dir/$_output_name" ]
1169 if (_ios_enable_code_signing) {
1170 code_signing_outputs +=
1171 [ "$bundle_root_dir/_CodeSignature/CodeResources" ]
1172 }
1173 if (ios_code_signing_identity != "") {
1174 code_signing_outputs += [ "$bundle_root_dir/embedded.mobileprovision" ]
1175 }
1176 code_signing_args = [
1177 "code-sign-bundle",
1178 "-t=" + ios_sdk_name,
1179 "-i=" + ios_code_signing_identity,
1180 "-e=" + rebase_path(_entitlements_path, root_build_dir),
1181 "-b=" +
1182 rebase_path("$_shared_library_dir/$_output_name", root_build_dir),
1183 rebase_path(bundle_root_dir, root_build_dir),
1184 ]
1185 if (!_ios_enable_code_signing) {
1186 code_signing_args += [ "--disable-code-signature" ]
1187 }
1188 }
1189
1190 if (defined(_framework_version)) {
1191 action(_target_name) {
1192 forward_variables_from(invoker, [ "testonly" ])
1193
1194 if (defined(invoker.visibility)) {
1195 visibility = invoker.visibility
1196 visibility += [ ":$_target_name+link" ]
1197 }
1198
1199 script = "//build/config/mac/package_framework.py"
1200 outputs = [
1201 "$root_out_dir/$_framework_name/Versions/Current",
1202 ]
1203 args = [
1204 "$_framework_name",
1205 "$_framework_version",
1206 ]
1207 public_deps = [
1208 ":$_framework_target",
1209 ]
1210 }
1211 } 1148 }
1212 1149
1213 group(_target_name + "+link") { 1150 group(_target_name + "+link") {
1214 forward_variables_from(invoker, 1151 forward_variables_from(invoker,
1215 [ 1152 [
1216 "public_deps", 1153 "public_deps",
1217 "public_configs", 1154 "public_configs",
1218 "testonly", 1155 "testonly",
1219 "visibility", 1156 "visibility",
1220 ]) 1157 ])
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 if (defined(invoker.output_name)) { 1202 if (defined(invoker.output_name)) {
1266 _output_name = invoker.output_name 1203 _output_name = invoker.output_name
1267 } 1204 }
1268 1205
1269 _xctest_target = _target_name 1206 _xctest_target = _target_name
1270 _xctest_output = _output_name 1207 _xctest_output = _output_name
1271 1208
1272 _host_target = _target_name + "_host" 1209 _host_target = _target_name + "_host"
1273 _host_output = _output_name + "_host" 1210 _host_output = _output_name + "_host"
1274 1211
1275 if (_is_secondary_build) { 1212 _xctest_arch_loadable_module_target = _xctest_target + "_arch_loadable_module"
1276 loadable_module(_xctest_target) { 1213 _xctest_lipo_loadable_module_target = _xctest_target + "_loadable_module"
1277 visibility = [ ":${_xctest_target}_loadable_module($default_toolchain)" ] 1214
1278 sources = [ 1215 loadable_module(_xctest_arch_loadable_module_target) {
1279 "//build/config/ios/xctest_shell.mm", 1216 visibility = [ ":$_xctest_lipo_loadable_module_target($default_toolchain)" ]
1217 if (current_toolchain != default_toolchain) {
1218 visibility += [ ":$_target_name" ]
1219 }
1220
1221 sources = [
1222 "//build/config/ios/xctest_shell.mm",
1223 ]
1224 configs += [ "//build/config/ios:xctest_config" ]
1225
1226 output_dir = "$target_out_dir/$current_cpu"
1227 output_name = _xctest_output
1228 output_prefix_override = true
1229 output_extension = ""
1230 }
1231
1232 if (current_toolchain != default_toolchain) {
1233 # For fat builds, only the default toolchain will generate a test bundle.
1234 # For the other toolchains, the template is only used for building the
1235 # arch-specific binary, thus the default target is just a group().
1236 group(_target_name) {
1237 forward_variables_from(invoker,
1238 [
1239 "visibility",
1240 "testonly",
1241 ])
1242 public_deps = [
1243 ":$_xctest_arch_loadable_module_target",
1280 ] 1244 ]
1281 configs += [ "//build/config/ios:xctest_config" ]
1282
1283 output_name = _xctest_output
1284 output_extension = ""
1285 } 1245 }
1286 } else { 1246 } else {
1287 _xctest_info_plist_target = _xctest_target + "_info_plist" 1247 _xctest_info_plist_target = _xctest_target + "_info_plist"
1288 _xctest_info_plist_bundle = _xctest_target + "_info_plist_bundle" 1248 _xctest_info_plist_bundle = _xctest_target + "_info_plist_bundle"
1289 ios_info_plist(_xctest_info_plist_target) { 1249 ios_info_plist(_xctest_info_plist_target) {
1290 visibility = [ ":$_xctest_info_plist_bundle" ] 1250 visibility = [ ":$_xctest_info_plist_bundle" ]
1291 info_plist = "//build/config/ios/Module-Info.plist" 1251 info_plist = "//build/config/ios/Module-Info.plist"
1292 executable_name = _output_name 1252 executable_name = _output_name
1293 } 1253 }
1294 1254
1295 bundle_data(_xctest_info_plist_bundle) { 1255 bundle_data(_xctest_info_plist_bundle) {
1296 visibility = [ ":$_xctest_target" ] 1256 visibility = [ ":$_xctest_target" ]
1297 public_deps = [ 1257 public_deps = [
1298 ":$_xctest_info_plist_target", 1258 ":$_xctest_info_plist_target",
1299 ] 1259 ]
1300 sources = get_target_outputs(":$_xctest_info_plist_target") 1260 sources = get_target_outputs(":$_xctest_info_plist_target")
1301 outputs = [ 1261 outputs = [
1302 "{{bundle_root_dir}}/Info.plist", 1262 "{{bundle_root_dir}}/Info.plist",
1303 ] 1263 ]
1304 } 1264 }
1305 1265
1306 _xctest_loadable_module_target = _xctest_target + "_arch_loadable_module" 1266 lipo_binary(_xctest_lipo_loadable_module_target) {
1307 _xctest_lipo_loadable_module_target = _xctest_target + "_loadable_module" 1267 forward_variables_from(invoker,
1268 [
1269 "configs",
1270 "testonly",
1271 ])
1308 1272
1309 _xctest_loadable_module_visibility = 1273 visibility = [ ":$_xctest_target" ]
1310 [ ":$_xctest_lipo_loadable_module_target" ]
1311 _xctest_lipo_loadable_module_visibility = [ ":$_xctest_target" ]
1312
1313 loadable_module(_xctest_loadable_module_target) {
1314 visibility = _xctest_loadable_module_visibility
1315 sources = [
1316 "//build/config/ios/xctest_shell.mm",
1317 ]
1318 configs += [ "//build/config/ios:xctest_config" ]
1319
1320 output_dir = "$target_out_dir/$current_cpu"
1321 output_name = _xctest_output 1274 output_name = _xctest_output
1322 output_prefix_override = true 1275 arch_binary_target = ":$_xctest_arch_loadable_module_target"
1323 output_extension = "" 1276 arch_binary_output = _xctest_output
1324 }
1325
1326 action(_xctest_lipo_loadable_module_target) {
1327 visibility = _xctest_lipo_loadable_module_visibility
1328 script = "//build/toolchain/mac/linker_driver.py"
1329 outputs = [
1330 "$target_out_dir/$_xctest_output",
1331 ]
1332 inputs = [
1333 "$target_out_dir/$current_cpu/$_xctest_output",
1334 ]
1335 deps = [
1336 ":$_xctest_loadable_module_target",
1337 ]
1338 foreach(_additional_toolchain, additional_toolchains) {
1339 _additional_toolchain_target = "$_target_name($_additional_toolchain)"
1340 deps += [ ":$_additional_toolchain_target" ]
1341 inputs += [ get_label_info(_additional_toolchain_target,
1342 "root_out_dir") + "/$_xctest_output" ]
1343 }
1344 args = [
1345 "xcrun",
1346 "lipo",
1347 "-create",
1348 "-output",
1349 rebase_path(outputs[0], root_build_dir),
1350 ] + rebase_path(inputs, root_build_dir)
1351
1352 if (enable_dsyms) {
1353 _dsyms_dir = "$root_out_dir/$_output_name.dSYM/"
1354 outputs += [
1355 "$_dsyms_dir/",
1356 "$_dsyms_dir/Contents/Info.plist",
1357 "$_dsyms_dir/Contents/Resources/DWARF/$_output_name",
1358 ]
1359 args +=
1360 [ "-Wcrl,dsym," + rebase_path("$root_out_dir/.", root_build_dir) ]
1361 }
1362
1363 if (enable_stripping) {
1364 # Check whether //build/config/mac:strip_all has been removed from
1365 # the configs variable (as this is how stripping is disabled for a
1366 # single target).
1367 _strip_all_in_config = false
1368 if (defined(invoker.configs)) {
1369 foreach(_config, invoker.configs) {
1370 if (_config == "//build/config/mac:strip_all") {
1371 _strip_all_in_config = true
1372 }
1373 }
1374 }
1375
1376 if (_strip_all_in_config) {
1377 args += [ "-Wcrl,strip,-x,-S" ]
1378
1379 if (save_unstripped_output) {
1380 outputs += [ outputs[0] + ".unstripped" ]
1381 args += [ "-Wcrl,unstripped," +
1382 rebase_path(get_path_info(outputs[0], "dir"),
1383 root_build_dir) ]
1384 }
1385 }
1386 }
1387 } 1277 }
1388 1278
1389 _xctest_bundle = _xctest_target + "_bundle" 1279 _xctest_bundle = _xctest_target + "_bundle"
1280 create_signed_bundle(_xctest_target) {
1281 forward_variables_from(invoker, [ "enable_code_signing" ])
1282 visibility = [ ":$_xctest_bundle" ]
1390 1283
1391 create_bundle(_xctest_target) {
1392 visibility = [ ":$_xctest_bundle" ]
1393 product_type = "com.apple.product-type.bundle.unit-test" 1284 product_type = "com.apple.product-type.bundle.unit-test"
1285 bundle_extension = ".xctest"
1286
1287 output_name = _xctest_output
1288 bundle_binary_target = ":$_xctest_lipo_loadable_module_target"
1289 bundle_binary_output = _xctest_output
1290
1394 deps = [ 1291 deps = [
1395 ":$_xctest_info_plist_bundle", 1292 ":$_xctest_info_plist_bundle",
1396 ":$_xctest_lipo_loadable_module_target",
1397 ] 1293 ]
1398 bundle_root_dir = "$root_out_dir/$_xctest_output.xctest"
1399
1400 _entitlements_path = _default_entitlements_path
1401 if (defined(invoker.entitlements_path)) {
1402 _entitlements_path = invoker.entitlements_path
1403 }
1404
1405 code_signing_script = _code_signing_script_path
1406 code_signing_sources = [
1407 _entitlements_path,
1408 "$target_out_dir/$_xctest_output",
1409 ]
1410 code_signing_outputs = [ "$bundle_root_dir/$_xctest_output" ]
1411 if (ios_enable_code_signing) {
1412 code_signing_outputs +=
1413 [ "$bundle_root_dir/_CodeSignature/CodeResources" ]
1414 }
1415 if (ios_code_signing_identity != "") {
1416 code_signing_outputs += [ "$bundle_root_dir/embedded.mobileprovision" ]
1417 }
1418 code_signing_args = [
1419 "code-sign-bundle",
1420 "-t=" + ios_sdk_name,
1421 "-i=" + ios_code_signing_identity,
1422 "-e=" + rebase_path(_entitlements_path, root_build_dir),
1423 "-b=" + rebase_path("$target_out_dir/$_xctest_output", root_build_dir),
1424 rebase_path(bundle_root_dir, root_build_dir),
1425 ]
1426 if (!ios_enable_code_signing) {
1427 code_signing_args += [ "--disable-code-signature" ]
1428 }
1429 } 1294 }
1430 1295
1431 bundle_data(_xctest_bundle) { 1296 bundle_data(_xctest_bundle) {
1432 visibility = [ ":$_host_target" ] 1297 visibility = [ ":$_host_target" ]
1433 public_deps = [ 1298 public_deps = [
1434 ":$_xctest_target", 1299 ":$_xctest_target",
1435 ] 1300 ]
1436 sources = [ 1301 sources = [
1437 "$root_out_dir/$_xctest_output.xctest", 1302 "$root_out_dir/$_xctest_output.xctest",
1438 ] 1303 ]
(...skipping 15 matching lines...) Expand all
1454 } 1319 }
1455 1320
1456 # Xcode needs those two framework installed in the application (and signed) 1321 # Xcode needs those two framework installed in the application (and signed)
1457 # for the XCTest to run, so install them using extra_system_frameworks. 1322 # for the XCTest to run, so install them using extra_system_frameworks.
1458 _ios_platform_library = "$ios_sdk_platform_path/Developer/Library" 1323 _ios_platform_library = "$ios_sdk_platform_path/Developer/Library"
1459 extra_system_frameworks = [ 1324 extra_system_frameworks = [
1460 "$_ios_platform_library/Frameworks/XCTest.framework", 1325 "$_ios_platform_library/Frameworks/XCTest.framework",
1461 "$_ios_platform_library/PrivateFrameworks/IDEBundleInjection.framework", 1326 "$_ios_platform_library/PrivateFrameworks/IDEBundleInjection.framework",
1462 ] 1327 ]
1463 1328
1464 if (!_is_secondary_build) { 1329 if (current_toolchain == default_toolchain) {
1465 if (!defined(bundle_deps)) { 1330 if (!defined(bundle_deps)) {
1466 bundle_deps = [] 1331 bundle_deps = []
1467 } 1332 }
1468 bundle_deps += [ ":$_xctest_bundle" ] 1333 bundle_deps += [ ":$_xctest_bundle" ]
1469 } 1334 }
1470 1335
1471 if (!defined(ldflags)) { 1336 if (!defined(ldflags)) {
1472 ldflags = [] 1337 ldflags = []
1473 } 1338 }
1474 ldflags += [ 1339 ldflags += [
1475 "-Xlinker", 1340 "-Xlinker",
1476 "-rpath", 1341 "-rpath",
1477 "-Xlinker", 1342 "-Xlinker",
1478 "@executable_path/Frameworks", 1343 "@executable_path/Frameworks",
1479 "-Xlinker", 1344 "-Xlinker",
1480 "-rpath", 1345 "-rpath",
1481 "-Xlinker", 1346 "-Xlinker",
1482 "@loader_path/Frameworks", 1347 "@loader_path/Frameworks",
1483 ] 1348 ]
1484 } 1349 }
1485 } 1350 }
1486 1351
1487 set_defaults("ios_xctest_test") { 1352 set_defaults("ios_xctest_test") {
1488 configs = default_executable_configs 1353 configs = default_executable_configs
1489 } 1354 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698