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

Side by Side Diff: build/config/android/internal_rules.gni

Issue 2023703002: Beginning work on GN build (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Really add //build. Add dart_bootstrap rule. Created 4 years, 6 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 | « build/config/android/config.gni ('k') | build/config/android/rules.gni » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import("//build/config/android/config.gni")
6 import("//build/config/sanitizers/sanitizers.gni")
7 import("//build/config/zip.gni")
8 import("//third_party/ijar/ijar.gni")
9
10 assert(is_android)
11
12 rebased_android_sdk = rebase_path(android_sdk, root_build_dir)
13 rebased_android_sdk_root = rebase_path(android_sdk_root, root_build_dir)
14 rebased_android_sdk_build_tools =
15 rebase_path(android_sdk_build_tools, root_build_dir)
16
17 android_sdk_jar = "$android_sdk/android.jar"
18 rebased_android_sdk_jar = rebase_path(android_sdk_jar, root_build_dir)
19 android_default_aapt_path = "$rebased_android_sdk_build_tools/aapt"
20
21 android_configuration_name = "Release"
22 if (is_debug) {
23 android_configuration_name = "Debug"
24 }
25
26 template("android_lint") {
27 action(target_name) {
28 forward_variables_from(invoker,
29 [
30 "deps",
31 "data_deps",
32 "public_deps",
33 "testonly",
34 ])
35 if (!defined(deps)) {
36 deps = []
37 }
38 _cache_dir = "$root_build_dir/android_lint_cache"
39 _result_path = "$target_gen_dir/$target_name/result.xml"
40 _config_path = "$target_gen_dir/$target_name/config.xml"
41 _suppressions_file = "//build/android/lint/suppressions.xml"
42 _platform_xml_path =
43 "${android_sdk_root}/platform-tools/api/api-versions.xml"
44
45 script = "//build/android/gyp/lint.py"
46 depfile = "$target_gen_dir/$target_name.d"
47 inputs = [
48 _platform_xml_path,
49 _suppressions_file,
50 invoker.android_manifest,
51 ]
52
53 outputs = [
54 depfile,
55 _config_path,
56 _result_path,
57 ]
58
59 args = [
60 "--lint-path=$rebased_android_sdk_root/tools/lint",
61 "--cache-dir",
62 rebase_path(_cache_dir, root_build_dir),
63 "--platform-xml-path",
64 rebase_path(_platform_xml_path, root_build_dir),
65 "--android-sdk-version=${android_sdk_version}",
66 "--depfile",
67 rebase_path(depfile, root_build_dir),
68 "--config-path",
69 rebase_path(_suppressions_file, root_build_dir),
70 "--manifest-path",
71 rebase_path(invoker.android_manifest, root_build_dir),
72 "--product-dir=.",
73 "--processed-config-path",
74 rebase_path(_config_path, root_build_dir),
75 "--result-path",
76 rebase_path(_result_path, root_build_dir),
77 "--enable",
78 ]
79
80 if (defined(invoker.create_cache) && invoker.create_cache) {
81 args += [
82 "--create-cache",
83 "--silent",
84 ]
85 } else {
86 inputs += invoker.java_files
87 inputs += [
88 invoker.jar_path,
89 invoker.build_config,
90 ]
91 deps += [ "//build/android:prepare_android_lint_cache" ]
92 _rebased_java_files = rebase_path(invoker.java_files, root_build_dir)
93 _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
94 args += [
95 "--jar-path",
96 rebase_path(invoker.jar_path, root_build_dir),
97 "--java-files=$_rebased_java_files",
98 "--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)" ,
99 ]
100 }
101 }
102 }
103
104 template("proguard") {
105 action(target_name) {
106 set_sources_assignment_filter([])
107 forward_variables_from(invoker,
108 [
109 "deps",
110 "data_deps",
111 "public_deps",
112 "testonly",
113 ])
114 script = "//build/android/gyp/proguard.py"
115 _proguard_jar_path = "//third_party/proguard/lib/proguard.jar"
116 _output_jar_path = invoker.output_jar_path
117 inputs = [
118 _proguard_jar_path,
119 ]
120 if (defined(invoker.alternative_android_sdk_jar)) {
121 inputs += [ invoker.alternative_android_sdk_jar ]
122 _rebased_android_sdk_jar =
123 rebase_path(invoker.alternative_android_sdk_jar)
124 } else {
125 inputs += [ android_sdk_jar ]
126 _rebased_android_sdk_jar = rebased_android_sdk_jar
127 }
128 if (defined(invoker.inputs)) {
129 inputs += invoker.inputs
130 }
131 depfile = "${target_gen_dir}/${target_name}.d"
132 outputs = [
133 depfile,
134 _output_jar_path,
135 "$_output_jar_path.dump",
136 "$_output_jar_path.seeds",
137 "$_output_jar_path.mapping",
138 "$_output_jar_path.usage",
139 ]
140 args = [
141 "--depfile",
142 rebase_path(depfile, root_build_dir),
143 "--proguard-path",
144 rebase_path(_proguard_jar_path, root_build_dir),
145 "--output-path",
146 rebase_path(_output_jar_path, root_build_dir),
147 "--classpath",
148 _rebased_android_sdk_jar,
149 ]
150 if (proguard_verbose) {
151 args += [ "--verbose" ]
152 }
153 if (defined(invoker.args)) {
154 args += invoker.args
155 }
156 }
157 }
158
159 template("findbugs") {
160 action(target_name) {
161 forward_variables_from(invoker,
162 [
163 "deps",
164 "testonly",
165 ])
166 script = "//build/android/findbugs_diff.py"
167 depfile = "$target_gen_dir/$target_name.d"
168 _result_path = "$target_gen_dir/$target_name/result.xml"
169 _exclusions_file = "//build/android/findbugs_filter/findbugs_exclude.xml"
170
171 _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
172
173 inputs = [
174 "//build/android/pylib/utils/findbugs.py",
175 _exclusions_file,
176 invoker.jar_path,
177 invoker.build_config,
178 ]
179
180 outputs = [
181 depfile,
182 _result_path,
183 ]
184
185 args = [
186 "--depfile",
187 rebase_path(depfile, root_build_dir),
188 "--exclude",
189 rebase_path(_exclusions_file, root_build_dir),
190 "--auxclasspath-gyp",
191 "@FileArg($_rebased_build_config:javac:classpath)",
192 "--output-file",
193 rebase_path(_result_path, root_build_dir),
194 rebase_path(invoker.jar_path, root_build_dir),
195 ]
196
197 if (findbugs_verbose) {
198 args += [ "-vv" ]
199 }
200 }
201 }
202
203 # Generates a script in the output bin.java directory to run a java binary.
204 #
205 # Variables
206 # main_class: The class containing the progam entry point.
207 # jar_path: The path to the jar to run.
208 # script_name: Name of the script to generate.
209 # build_config: Path to .build_config for the jar (contains classpath).
210 # wrapper_script_args: List of extra arguments to pass to the executable.
211 #
212 template("java_binary_script") {
213 set_sources_assignment_filter([])
214 forward_variables_from(invoker, [ "testonly" ])
215
216 _main_class = invoker.main_class
217 _build_config = invoker.build_config
218 _jar_path = invoker.jar_path
219 _script_name = invoker.script_name
220
221 action(target_name) {
222 script = "//build/android/gyp/create_java_binary_script.py"
223 depfile = "$target_gen_dir/$_script_name.d"
224 java_script = "$root_build_dir/bin/$_script_name"
225 inputs = [
226 _build_config,
227 ]
228 outputs = [
229 depfile,
230 java_script,
231 ]
232 forward_variables_from(invoker, [ "deps" ])
233 _rebased_build_config = rebase_path(_build_config, root_build_dir)
234 args = [
235 "--depfile",
236 rebase_path(depfile, root_build_dir),
237 "--output",
238 rebase_path(java_script, root_build_dir),
239 "--classpath=@FileArg($_rebased_build_config:java:full_classpath)",
240 "--jar-path",
241 rebase_path(_jar_path, root_build_dir),
242 "--main-class",
243 _main_class,
244 ]
245 if (emma_coverage) {
246 args += [
247 "--classpath",
248 rebase_path("//third_party/android_tools/sdk/tools/lib/emma.jar",
249 root_build_dir),
250 ]
251 args += [ "--noverify" ]
252 }
253 if (defined(invoker.wrapper_script_args)) {
254 args += [ "--" ] + invoker.wrapper_script_args
255 }
256 if (defined(invoker.bootclasspath)) {
257 inputs += [ invoker.bootclasspath ]
258 args += [
259 "--bootclasspath",
260 rebase_path(invoker.bootclasspath, root_build_dir),
261 ]
262 }
263 }
264 }
265
266 template("dex") {
267 set_sources_assignment_filter([])
268
269 _enable_multidex = defined(invoker.enable_multidex) && invoker.enable_multidex
270
271 if (_enable_multidex) {
272 _main_dex_list_path = invoker.output + ".main_dex_list"
273 _main_dex_list_target_name = "${target_name}__main_dex_list"
274 action(_main_dex_list_target_name) {
275 forward_variables_from(invoker,
276 [
277 "deps",
278 "inputs",
279 "sources",
280 "testonly",
281 ])
282
283 script = "//build/android/gyp/main_dex_list.py"
284 depfile = "$target_gen_dir/$target_name.d"
285
286 main_dex_rules = "//build/android/main_dex_classes.flags"
287
288 outputs = [
289 depfile,
290 _main_dex_list_path,
291 ]
292
293 args = [
294 "--depfile",
295 rebase_path(depfile, root_build_dir),
296 "--android-sdk-tools",
297 rebased_android_sdk_build_tools,
298 "--main-dex-list-path",
299 rebase_path(_main_dex_list_path, root_build_dir),
300 "--main-dex-rules-path",
301 rebase_path(main_dex_rules, root_build_dir),
302 ]
303
304 if (defined(invoker.args)) {
305 args += invoker.args
306 }
307
308 if (defined(invoker.sources)) {
309 args += rebase_path(invoker.sources, root_build_dir)
310 }
311 }
312 }
313
314 assert(defined(invoker.output))
315 action(target_name) {
316 forward_variables_from(invoker,
317 [
318 "deps",
319 "inputs",
320 "sources",
321 "testonly",
322 ])
323 script = "//build/android/gyp/dex.py"
324 depfile = "$target_gen_dir/$target_name.d"
325 outputs = [
326 depfile,
327 invoker.output,
328 ]
329
330 rebased_output = rebase_path(invoker.output, root_build_dir)
331
332 args = [
333 "--depfile",
334 rebase_path(depfile, root_build_dir),
335 "--android-sdk-tools",
336 rebased_android_sdk_build_tools,
337 "--dex-path",
338 rebased_output,
339 ]
340
341 if (enable_incremental_dx) {
342 args += [ "--incremental" ]
343 }
344
345 # EMMA requires --no-locals.
346 if (emma_coverage) {
347 args += [ "--no-locals=1" ]
348 }
349
350 if (_enable_multidex) {
351 args += [
352 "--multi-dex",
353 "--main-dex-list-path",
354 rebase_path(_main_dex_list_path, root_build_dir),
355 ]
356 deps += [ ":${_main_dex_list_target_name}" ]
357 inputs += [ _main_dex_list_path ]
358 }
359
360 if (defined(invoker.args)) {
361 args += invoker.args
362 }
363
364 if (defined(invoker.sources)) {
365 args += rebase_path(invoker.sources, root_build_dir)
366 }
367 }
368 }
369
370 # Write the target's .build_config file. This is a json file that contains a
371 # dictionary of information about how to build this target (things that
372 # require knowledge about this target's dependencies and cannot be calculated
373 # at gn-time). There is a special syntax to add a value in that dictionary to
374 # an action/action_foreachs args:
375 # --python-arg=@FileArg($rebased_build_config_path:key0:key1)
376 # At runtime, such an arg will be replaced by the value in the build_config.
377 # See build/android/gyp/write_build_config.py and
378 # build/android/gyp/util/build_utils.py:ExpandFileArgs
379 template("write_build_config") {
380 action(target_name) {
381 set_sources_assignment_filter([])
382 type = invoker.type
383 build_config = invoker.build_config
384
385 assert(type == "android_apk" || type == "java_library" ||
386 type == "android_resources" || type == "deps_dex" ||
387 type == "android_assets" || type == "resource_rewriter" ||
388 type == "java_binary" || type == "group")
389
390 forward_variables_from(invoker,
391 [
392 "deps",
393 "testonly",
394 "visibility",
395 ])
396 if (!defined(deps)) {
397 deps = []
398 }
399
400 script = "//build/android/gyp/write_build_config.py"
401 depfile = "$target_gen_dir/$target_name.d"
402 inputs = []
403
404 possible_deps_configs = []
405 foreach(d, deps) {
406 dep_gen_dir = get_label_info(d, "target_gen_dir")
407 dep_name = get_label_info(d, "name")
408 possible_deps_configs += [ "$dep_gen_dir/$dep_name.build_config" ]
409 }
410 rebase_possible_deps_configs =
411 rebase_path(possible_deps_configs, root_build_dir)
412
413 outputs = [
414 depfile,
415 build_config,
416 ]
417
418 args = [
419 "--type",
420 type,
421 "--depfile",
422 rebase_path(depfile, root_build_dir),
423 "--possible-deps-configs=$rebase_possible_deps_configs",
424 "--build-config",
425 rebase_path(build_config, root_build_dir),
426 ]
427
428 is_java = type == "java_library" || type == "java_binary"
429 is_apk = type == "android_apk"
430 is_android_assets = type == "android_assets"
431 is_android_resources = type == "android_resources"
432 is_deps_dex = type == "deps_dex"
433 is_group = type == "group"
434
435 supports_android = is_apk || is_android_assets || is_android_resources ||
436 is_deps_dex || is_group ||
437 (is_java && defined(invoker.supports_android) &&
438 invoker.supports_android)
439 requires_android =
440 is_apk || is_android_assets || is_android_resources || is_deps_dex ||
441 (is_java && defined(invoker.requires_android) &&
442 invoker.requires_android)
443
444 assert(!requires_android || supports_android,
445 "requires_android requires" + " supports_android")
446
447 # Mark these variables as used.
448 assert(is_java || true)
449 assert(is_apk || true)
450 assert(is_android_resources || true)
451 assert(is_deps_dex || true)
452 assert(is_group || true)
453
454 if (is_java || is_apk) {
455 args += [
456 "--jar-path",
457 rebase_path(invoker.jar_path, root_build_dir),
458 ]
459 }
460
461 if (is_apk || is_deps_dex || (is_java && supports_android)) {
462 args += [
463 "--dex-path",
464 rebase_path(invoker.dex_path, root_build_dir),
465 ]
466 }
467 if (supports_android) {
468 args += [ "--supports-android" ]
469 }
470 if (requires_android) {
471 args += [ "--requires-android" ]
472 }
473 if (defined(invoker.bypass_platform_checks) &&
474 invoker.bypass_platform_checks) {
475 args += [ "--bypass-platform-checks" ]
476 }
477
478 if (defined(invoker.apk_under_test)) {
479 deps += [ "${invoker.apk_under_test}__build_config" ]
480 apk_under_test_gen_dir =
481 get_label_info(invoker.apk_under_test, "target_gen_dir")
482 apk_under_test_name = get_label_info(invoker.apk_under_test, "name")
483 apk_under_test_config =
484 "$apk_under_test_gen_dir/$apk_under_test_name.build_config"
485 args += [
486 "--tested-apk-config",
487 rebase_path(apk_under_test_config, root_build_dir),
488 ]
489 }
490
491 if (is_android_assets) {
492 if (defined(invoker.asset_sources)) {
493 inputs += invoker.asset_sources
494 _rebased_asset_sources =
495 rebase_path(invoker.asset_sources, root_build_dir)
496 args += [ "--asset-sources=$_rebased_asset_sources" ]
497 }
498 if (defined(invoker.asset_renaming_sources)) {
499 inputs += invoker.asset_renaming_sources
500 _rebased_asset_renaming_sources =
501 rebase_path(invoker.asset_renaming_sources, root_build_dir)
502 args += [ "--asset-renaming-sources=$_rebased_asset_renaming_sources" ]
503
504 # These are zip paths, so no need to rebase.
505 args += [ "--asset-renaming-destinations=${invoker.asset_renaming_destin ations}" ]
506 }
507 if (defined(invoker.disable_compression) && invoker.disable_compression) {
508 args += [ "--disable-asset-compression" ]
509 }
510 }
511
512 if (is_android_resources || is_apk) {
513 assert(defined(invoker.resources_zip))
514 args += [
515 "--resources-zip",
516 rebase_path(invoker.resources_zip, root_build_dir),
517 ]
518 if (defined(invoker.android_manifest)) {
519 inputs += [ invoker.android_manifest ]
520 args += [
521 "--android-manifest",
522 rebase_path(invoker.android_manifest, root_build_dir),
523 ]
524 } else {
525 assert(!is_apk, "apk build configs require an android_manifest")
526 }
527 if (defined(invoker.custom_package)) {
528 args += [
529 "--package-name",
530 invoker.custom_package,
531 ]
532 }
533 if (defined(invoker.r_text)) {
534 args += [
535 "--r-text",
536 rebase_path(invoker.r_text, root_build_dir),
537 ]
538 }
539 if (defined(invoker.is_locale_resource) && invoker.is_locale_resource) {
540 args += [ "--is-locale-resource" ]
541 }
542 if (defined(invoker.has_alternative_locale_resource) &&
543 invoker.has_alternative_locale_resource) {
544 args += [ "--has-alternative-locale-resource" ]
545 }
546 }
547
548 if (is_apk) {
549 if (defined(invoker.native_libs)) {
550 inputs += invoker.native_libs
551 rebased_native_libs = rebase_path(invoker.native_libs, root_build_dir)
552 rebased_android_readelf = rebase_path(android_readelf, root_build_dir)
553 args += [
554 "--native-libs=$rebased_native_libs",
555 "--readelf-path=$rebased_android_readelf",
556 ]
557 }
558
559 if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) {
560 args += [
561 "--proguard-enabled",
562 "--proguard-info",
563 rebase_path(invoker.proguard_info, root_build_dir),
564 ]
565 }
566
567 if (defined(invoker.apk_path)) {
568 _rebased_apk_path = rebase_path(invoker.apk_path, root_build_dir)
569 _rebased_incremental_apk_path =
570 rebase_path(invoker.incremental_apk_path, root_build_dir)
571 _rebased_incremental_install_script_path =
572 rebase_path(invoker.incremental_install_script_path, root_build_dir)
573 args += [ "--apk-path=$_rebased_apk_path" ]
574 args += [ "--incremental-apk-path=$_rebased_incremental_apk_path" ]
575 args += [ "--incremental-install-script-path=$_rebased_incremental_insta ll_script_path" ]
576 }
577 }
578
579 if (defined(invoker.srcjar)) {
580 args += [
581 "--srcjar",
582 rebase_path(invoker.srcjar, root_build_dir),
583 ]
584 }
585 }
586 }
587
588 template("process_java_prebuilt") {
589 set_sources_assignment_filter([])
590 forward_variables_from(invoker, [ "testonly" ])
591
592 assert(invoker.build_config != "")
593 _build_config = invoker.build_config
594 _rebased_build_config = rebase_path(_build_config, root_build_dir)
595 assert(_rebased_build_config != "" || true) # Mark used.
596
597 _proguard_preprocess =
598 defined(invoker.proguard_preprocess) && invoker.proguard_preprocess
599 _input_jar_path = invoker.input_jar_path
600 _output_jar_path = invoker.output_jar_path
601
602 _jar_excluded_patterns = []
603 if (defined(invoker.jar_excluded_patterns)) {
604 _jar_excluded_patterns = invoker.jar_excluded_patterns
605 }
606 _strip_resource_classes =
607 defined(invoker.strip_resource_classes) && invoker.strip_resource_classes
608 _filter_jar = _jar_excluded_patterns != [] || _strip_resource_classes
609
610 if (_filter_jar) {
611 _filter_target = "${target_name}__filter"
612 _output_jar_target = _filter_target
613 }
614 if (_proguard_preprocess) {
615 _proguard_target = "${target_name}__proguard_process"
616 _output_jar_target = _proguard_target
617 }
618 if (!_filter_jar && !_proguard_preprocess) {
619 _copy_target = "${target_name}__copy"
620 _output_jar_target = _copy_target
621 }
622
623 if (_filter_jar) {
624 _filtered_jar_path = _output_jar_path
625 if (_proguard_preprocess) {
626 _filtered_jar_path = "$target_out_dir/$target_name-filtered.jar"
627 }
628 action(_filter_target) {
629 script = "//build/android/gyp/jar.py"
630 forward_variables_from(invoker,
631 [
632 "deps",
633 "public_deps",
634 ])
635 inputs = [
636 _build_config,
637 _input_jar_path,
638 ]
639 outputs = [
640 _filtered_jar_path,
641 ]
642 args = [
643 "--input-jar",
644 rebase_path(_input_jar_path, root_build_dir),
645 "--jar-path",
646 rebase_path(_filtered_jar_path, root_build_dir),
647 "--excluded-classes=$_jar_excluded_patterns",
648 ]
649 if (_strip_resource_classes) {
650 args += [ "--strip-resource-classes-for=@FileArg($_rebased_build_config: javac:resource_packages)" ]
651 }
652 }
653 }
654
655 if (_proguard_preprocess) {
656 _proguard_config_path = invoker.proguard_config
657 proguard(_proguard_target) {
658 if (_filter_jar) {
659 _proguard_input_jar = _filtered_jar_path
660 public_deps = [
661 ":$_filter_target",
662 ]
663 } else {
664 _proguard_input_jar = _input_jar_path
665 public_deps = []
666 }
667 if (defined(invoker.deps)) {
668 deps = invoker.deps
669 }
670 if (defined(invoker.public_deps)) {
671 public_deps += invoker.public_deps
672 }
673 inputs = [
674 _build_config,
675 _proguard_config_path,
676 _proguard_input_jar,
677 ]
678 output_jar_path = _output_jar_path
679
680 _rebased_input_paths = [ rebase_path(_input_jar_path, root_build_dir) ]
681 _rebased_proguard_configs =
682 [ rebase_path(_proguard_config_path, root_build_dir) ]
683 args = [
684 "--input-paths=$_rebased_input_paths",
685 "--proguard-configs=$_rebased_proguard_configs",
686 "--classpath=@FileArg($_rebased_build_config:javac:classpath)",
687 ]
688 }
689 } else if (!_filter_jar) {
690 copy(_copy_target) {
691 forward_variables_from(invoker,
692 [
693 "deps",
694 "public_deps",
695 ])
696 sources = [
697 _input_jar_path,
698 ]
699 outputs = [
700 _output_jar_path,
701 ]
702 }
703 }
704
705 group(target_name) {
706 forward_variables_from(invoker,
707 [
708 "data_deps",
709 "visibility",
710 ])
711 public_deps = [
712 ":$_output_jar_target",
713 ]
714 }
715 }
716
717 template("emma_instr") {
718 set_sources_assignment_filter([])
719 forward_variables_from(invoker, [ "testonly" ])
720
721 assert(invoker.source_files != [] || true) # Mark as used
722
723 if (invoker.emma_instrument) {
724 _output_jar_target = "${target_name}__process"
725 _coverage_file = "$target_out_dir/${target_name}.em"
726 _source_dirs_listing_file = "$target_out_dir/${target_name}_sources.txt"
727 _emma_jar = "${android_sdk_root}/tools/lib/emma.jar"
728 _rebased_source_files = rebase_path(invoker.source_files, root_build_dir)
729 action(_output_jar_target) {
730 forward_variables_from(invoker, [ "deps" ])
731
732 script = "//build/android/gyp/emma_instr.py"
733 depfile = "${target_gen_dir}/${target_name}.d"
734 inputs = [
735 _emma_jar,
736 invoker.input_jar_path,
737 ]
738 outputs = [
739 depfile,
740 _coverage_file,
741 _source_dirs_listing_file,
742 invoker.output_jar_path,
743 ]
744 args = [
745 "instrument_jar",
746 "--input-path",
747 rebase_path(invoker.input_jar_path, root_build_dir),
748 "--output-path",
749 rebase_path(invoker.output_jar_path, root_build_dir),
750 "--depfile",
751 rebase_path(depfile, root_build_dir),
752 "--coverage-file",
753 rebase_path(_coverage_file, root_build_dir),
754 "--sources-list-file",
755 rebase_path(_source_dirs_listing_file, root_build_dir),
756 "--source-files=$_rebased_source_files",
757 "--src-root",
758 rebase_path("//", root_build_dir),
759 "--emma-jar",
760 rebase_path(_emma_jar, root_build_dir),
761 ]
762
763 if (emma_filter != "") {
764 args += [
765 "--filter-string",
766 emma_filter,
767 ]
768 }
769 }
770 } else {
771 _output_jar_target = "${target_name}__copy_jar"
772 copy(_output_jar_target) {
773 forward_variables_from(invoker, [ "deps" ])
774
775 sources = [
776 invoker.input_jar_path,
777 ]
778 outputs = [
779 invoker.output_jar_path,
780 ]
781 }
782 }
783
784 group(target_name) {
785 forward_variables_from(invoker, [ "visibility" ])
786 public_deps = [
787 ":$_output_jar_target",
788 ]
789 }
790 }
791
792 # Creates an unsigned .apk.
793 #
794 # Variables
795 # assets_build_config: Path to android_apk .build_config containing merged
796 # asset information.
797 # deps: Specifies the dependencies of this target.
798 # dex_path: Path to classes.dex file to include (optional).
799 # resource_packaged_apk_path: Path to .ap_ to use.
800 # output_apk_path: Output path for the generated .apk.
801 # native_lib_placeholders: List of placeholder filenames to add to the apk
802 # (optional).
803 # native_libs: List of native libraries.
804 # native_libs_filearg: @FileArg() of additionaly native libraries.
805 # write_asset_list: Adds an extra file to the assets, which contains a list of
806 # all other asset files.
807 template("package_apk") {
808 action(target_name) {
809 forward_variables_from(invoker,
810 [
811 "deps",
812 "public_deps",
813 "testonly",
814 ])
815 _native_lib_placeholders = []
816 if (defined(invoker.native_lib_placeholders)) {
817 _native_lib_placeholders = invoker.native_lib_placeholders
818 }
819
820 script = "//build/android/gyp/apkbuilder.py"
821 depfile = "$target_gen_dir/$target_name.d"
822 data_deps = [
823 "//tools/android/md5sum",
824 ] # Used when deploying APKs
825
826 inputs = invoker.native_libs + [ invoker.resource_packaged_apk_path ]
827 if (defined(invoker.dex_path)) {
828 inputs += [ invoker.dex_path ]
829 }
830
831 outputs = [
832 depfile,
833 invoker.output_apk_path,
834 ]
835
836 _rebased_resource_packaged_apk_path =
837 rebase_path(invoker.resource_packaged_apk_path, root_build_dir)
838 _rebased_packaged_apk_path =
839 rebase_path(invoker.output_apk_path, root_build_dir)
840 args = [
841 "--depfile",
842 rebase_path(depfile, root_build_dir),
843 "--resource-apk=$_rebased_resource_packaged_apk_path",
844 "--output-apk=$_rebased_packaged_apk_path",
845 ]
846 if (defined(invoker.assets_build_config)) {
847 inputs += [ invoker.assets_build_config ]
848 _rebased_build_config =
849 rebase_path(invoker.assets_build_config, root_build_dir)
850 args += [
851 "--assets=@FileArg($_rebased_build_config:assets)",
852 "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_asse ts)",
853 ]
854 }
855 if (defined(invoker.write_asset_list) && invoker.write_asset_list) {
856 args += [ "--write-asset-list" ]
857 }
858 if (defined(invoker.dex_path)) {
859 _rebased_dex_path = rebase_path(invoker.dex_path, root_build_dir)
860 args += [ "--dex-file=$_rebased_dex_path" ]
861 }
862 if (invoker.native_libs != [] || defined(invoker.native_libs_filearg) ||
863 _native_lib_placeholders != []) {
864 args += [ "--android-abi=$android_app_abi" ]
865 }
866 if (invoker.native_libs != []) {
867 _rebased_native_libs = rebase_path(invoker.native_libs, root_build_dir)
868 args += [ "--native-libs=$_rebased_native_libs" ]
869 }
870 if (defined(invoker.native_libs_filearg)) {
871 args += [ "--native-libs=${invoker.native_libs_filearg}" ]
872 }
873 if (_native_lib_placeholders != []) {
874 args += [ "--native-lib-placeholders=$_native_lib_placeholders" ]
875 }
876 if (defined(invoker.secondary_native_libs) &&
877 invoker.secondary_native_libs != []) {
878 assert(defined(android_app_secondary_abi))
879 inputs += invoker.secondary_native_libs
880 _secondary_native_libs = rebase_path(invoker.secondary_native_libs)
881 args += [
882 "--secondary-native-libs=$_secondary_native_libs",
883 "--secondary-android-abi=$android_app_secondary_abi",
884 ]
885 }
886
887 if (defined(invoker.emma_instrument) && invoker.emma_instrument) {
888 _emma_device_jar = "$android_sdk_root/tools/lib/emma_device.jar"
889 _rebased_emma_device_jar = rebase_path(_emma_device_jar, root_build_dir)
890 args += [ "--emma-device-jar=$_rebased_emma_device_jar" ]
891 }
892
893 if (defined(invoker.uncompress_shared_libraries) &&
894 invoker.uncompress_shared_libraries) {
895 args += [ "--uncompress-shared-libraries" ]
896 }
897 }
898 }
899
900 # Signs & zipaligns an apk.
901 #
902 # Variables
903 # input_apk_path: Path of the .apk to be finalized.
904 # output_apk_path: Output path for the generated .apk.
905 # keystore_path: Path to keystore to use for signing.
906 # keystore_name: Key alias to use.
907 # keystore_password: Keystore password.
908 # rezip_apk: Whether to add crazy-linker alignment.
909 template("finalize_apk") {
910 action(target_name) {
911 deps = []
912 script = "//build/android/gyp/finalize_apk.py"
913 depfile = "$target_gen_dir/$target_name.d"
914 forward_variables_from(invoker,
915 [
916 "deps",
917 "data_deps",
918 "public_deps",
919 "testonly",
920 ])
921
922 sources = [
923 invoker.input_apk_path,
924 ]
925 inputs = [
926 invoker.keystore_path,
927 ]
928 outputs = [
929 depfile,
930 invoker.output_apk_path,
931 ]
932 data = [
933 invoker.output_apk_path,
934 ]
935
936 args = [
937 "--depfile",
938 rebase_path(depfile, root_build_dir),
939 "--zipalign-path",
940 rebase_path(zipalign_path, root_build_dir),
941 "--unsigned-apk-path",
942 rebase_path(invoker.input_apk_path, root_build_dir),
943 "--final-apk-path",
944 rebase_path(invoker.output_apk_path, root_build_dir),
945 "--key-path",
946 rebase_path(invoker.keystore_path, root_build_dir),
947 "--key-name",
948 invoker.keystore_name,
949 "--key-passwd",
950 invoker.keystore_password,
951 ]
952 if (defined(invoker.rezip_apk) && invoker.rezip_apk) {
953 deps += [ "//build/android/rezip" ]
954 _rezip_jar_path = "$root_build_dir/lib.java/rezip_apk.jar"
955 args += [
956 "--load-library-from-zip=1",
957 "--rezip-apk-jar-path",
958 rebase_path(_rezip_jar_path, root_build_dir),
959 ]
960 }
961
962 if (defined(invoker.page_align_shared_libraries) &&
963 invoker.page_align_shared_libraries) {
964 args += [ "--page-align-shared-libraries" ]
965 }
966 }
967 }
968
969 # Packages resources, assets, dex, and native libraries into an apk. Signs and
970 # zipaligns the apk.
971 template("create_apk") {
972 set_sources_assignment_filter([])
973 forward_variables_from(invoker, [ "testonly" ])
974
975 _android_manifest = invoker.android_manifest
976 _base_path = invoker.base_path
977 _final_apk_path = invoker.apk_path
978 _incremental_final_apk_path_helper =
979 process_file_template(
980 [ _final_apk_path ],
981 "{{source_dir}}/{{source_name_part}}_incremental.apk")
982 _incremental_final_apk_path = _incremental_final_apk_path_helper[0]
983
984 if (defined(invoker.resources_zip)) {
985 _resources_zip = invoker.resources_zip
986 assert(_resources_zip != "") # Mark as used.
987 }
988 if (defined(invoker.dex_path)) {
989 _dex_path = invoker.dex_path
990 }
991 _load_library_from_apk = invoker.load_library_from_apk
992
993 _deps = []
994 if (defined(invoker.deps)) {
995 _deps = invoker.deps
996 }
997 _incremental_deps = []
998 if (defined(invoker.incremental_deps)) {
999 _incremental_deps = invoker.incremental_deps
1000 }
1001 _native_libs = []
1002 if (defined(invoker.native_libs)) {
1003 _native_libs = invoker.native_libs
1004 }
1005 _native_libs_even_when_incremental = []
1006 if (defined(invoker.native_libs_even_when_incremental)) {
1007 _native_libs_even_when_incremental =
1008 invoker.native_libs_even_when_incremental
1009 }
1010
1011 _version_code = invoker.version_code
1012 _version_name = invoker.version_name
1013 assert(_version_code != -1) # Mark as used.
1014 assert(_version_name != "") # Mark as used.
1015
1016 _base_apk_path = _base_path + ".apk_intermediates"
1017
1018 _resource_packaged_apk_path = _base_apk_path + ".ap_"
1019 _incremental_resource_packaged_apk_path = _base_apk_path + "_incremental.ap_"
1020 _packaged_apk_path = _base_apk_path + ".unfinished.apk"
1021 _incremental_packaged_apk_path =
1022 _base_apk_path + "_incremental.unfinished.apk"
1023 _shared_resources =
1024 defined(invoker.shared_resources) && invoker.shared_resources
1025 assert(_shared_resources || true) # Mark as used.
1026 _app_as_shared_lib =
1027 defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib
1028 assert(_app_as_shared_lib || true) # Mark as used.
1029 assert(!(_shared_resources && _app_as_shared_lib))
1030
1031 _keystore_path = invoker.keystore_path
1032 _keystore_name = invoker.keystore_name
1033 _keystore_password = invoker.keystore_password
1034
1035 _split_densities = []
1036 if (defined(invoker.create_density_splits) && invoker.create_density_splits) {
1037 _split_densities = [
1038 "hdpi",
1039 "xhdpi",
1040 "xxhdpi",
1041 "xxxhdpi",
1042 "tvdpi",
1043 ]
1044 }
1045
1046 _split_languages = []
1047 if (defined(invoker.language_splits)) {
1048 _split_languages = invoker.language_splits
1049 }
1050
1051 template("package_resources_helper") {
1052 action(target_name) {
1053 deps = invoker.deps
1054
1055 script = "//build/android/gyp/package_resources.py"
1056 depfile = "${target_gen_dir}/${target_name}.d"
1057 inputs = [
1058 invoker.android_manifest,
1059 ]
1060 if (defined(_resources_zip)) {
1061 inputs += [ _resources_zip ]
1062 }
1063 outputs = [
1064 depfile,
1065 invoker.resource_packaged_apk_path,
1066 ]
1067
1068 if (defined(invoker.android_aapt_path)) {
1069 _android_aapt_path = invoker.android_aapt_path
1070 } else {
1071 _android_aapt_path = android_default_aapt_path
1072 }
1073
1074 if (defined(invoker.alternative_android_sdk_jar)) {
1075 _rebased_android_sdk_jar =
1076 rebase_path(invoker.alternative_android_sdk_jar)
1077 } else {
1078 _rebased_android_sdk_jar = rebased_android_sdk_jar
1079 }
1080
1081 args = [
1082 "--depfile",
1083 rebase_path(depfile, root_build_dir),
1084 "--android-sdk-jar",
1085 _rebased_android_sdk_jar,
1086 "--aapt-path",
1087 _android_aapt_path,
1088 "--configuration-name=$android_configuration_name",
1089 "--android-manifest",
1090 rebase_path(invoker.android_manifest, root_build_dir),
1091 "--version-code",
1092 _version_code,
1093 "--version-name",
1094 _version_name,
1095 "--apk-path",
1096 rebase_path(invoker.resource_packaged_apk_path, root_build_dir),
1097 ]
1098
1099 if (defined(_resources_zip)) {
1100 args += [
1101 "--resource-zips",
1102 rebase_path(_resources_zip, root_build_dir),
1103 ]
1104 }
1105 if (_shared_resources) {
1106 args += [ "--shared-resources" ]
1107 }
1108 if (_app_as_shared_lib) {
1109 args += [ "--app-as-shared-lib" ]
1110 }
1111 if (_split_densities != []) {
1112 args += [ "--create-density-splits" ]
1113 foreach(_density, _split_densities) {
1114 outputs += [ "${invoker.resource_packaged_apk_path}_${_density}" ]
1115 }
1116 }
1117 if (_split_languages != []) {
1118 args += [ "--language-splits=$_split_languages" ]
1119 foreach(_language, _split_languages) {
1120 outputs += [ "${invoker.resource_packaged_apk_path}_${_language}" ]
1121 }
1122 }
1123 if (defined(invoker.extensions_to_not_compress)) {
1124 args += [
1125 "--no-compress",
1126 invoker.extensions_to_not_compress,
1127 ]
1128 }
1129 }
1130 }
1131
1132 _package_resources_target_name = "${target_name}__package_resources"
1133 package_resources_helper(_package_resources_target_name) {
1134 forward_variables_from(invoker,
1135 [
1136 "alternative_android_sdk_jar",
1137 "android_aapt_path",
1138 "extensions_to_not_compress",
1139 ])
1140 deps = _deps
1141 android_manifest = _android_manifest
1142 resource_packaged_apk_path = _resource_packaged_apk_path
1143 }
1144
1145 _generate_incremental_manifest_target_name =
1146 "${target_name}_incremental_generate_manifest"
1147 _incremental_android_manifest =
1148 get_label_info(_generate_incremental_manifest_target_name,
1149 "target_gen_dir") + "/AndroidManifest.xml"
1150 action(_generate_incremental_manifest_target_name) {
1151 deps = _incremental_deps
1152 script = "//build/android/incremental_install/generate_android_manifest.py"
1153 depfile = "${target_gen_dir}/${target_name}.d"
1154 inputs = [
1155 _android_manifest,
1156 ]
1157 outputs = [
1158 depfile,
1159 _incremental_android_manifest,
1160 ]
1161
1162 _rebased_src_manifest = rebase_path(_android_manifest, root_build_dir)
1163 _rebased_incremental_manifest =
1164 rebase_path(_incremental_android_manifest, root_build_dir)
1165 _rebased_depfile = rebase_path(depfile, root_build_dir)
1166 args = [
1167 "--src-manifest=$_rebased_src_manifest",
1168 "--out-manifest=$_rebased_incremental_manifest",
1169 "--depfile=$_rebased_depfile",
1170 ]
1171 if (disable_incremental_isolated_processes) {
1172 args += [ "--disable-isolated-processes" ]
1173 }
1174 }
1175
1176 _incremental_package_resources_target_name =
1177 "${target_name}_incremental__package_resources"
1178
1179 # TODO(agrieve): See if we can speed up this step by swapping the manifest
1180 # from the result of the main package_resources step.
1181 package_resources_helper(_incremental_package_resources_target_name) {
1182 forward_variables_from(invoker,
1183 [
1184 "alternative_android_sdk_jar",
1185 "android_aapt_path",
1186 "extensions_to_not_compress",
1187 ])
1188 deps =
1189 _incremental_deps + [ ":$_generate_incremental_manifest_target_name" ]
1190 android_manifest = _incremental_android_manifest
1191 resource_packaged_apk_path = _incremental_resource_packaged_apk_path
1192 }
1193
1194 package_target = "${target_name}__package"
1195 package_apk(package_target) {
1196 forward_variables_from(invoker,
1197 [
1198 "assets_build_config",
1199 "emma_instrument",
1200 "native_lib_placeholders",
1201 "native_libs_filearg",
1202 "secondary_native_libs",
1203 "uncompress_shared_libraries",
1204 "write_asset_list",
1205 ])
1206 deps = _deps + [ ":${_package_resources_target_name}" ]
1207 native_libs = _native_libs + _native_libs_even_when_incremental
1208
1209 if (defined(_dex_path)) {
1210 dex_path = _dex_path
1211 }
1212
1213 output_apk_path = _packaged_apk_path
1214 resource_packaged_apk_path = _resource_packaged_apk_path
1215 }
1216
1217 _incremental_package_target = "${target_name}_incremental__package"
1218 package_apk(_incremental_package_target) {
1219 forward_variables_from(invoker,
1220 [
1221 "assets_build_config",
1222 "emma_instrument",
1223 "secondary_native_libs",
1224 "uncompress_shared_libraries",
1225 ])
1226 _dex_target = "//build/android/incremental_install:bootstrap_java__dex"
1227 deps = _incremental_deps + [
1228 ":${_incremental_package_resources_target_name}",
1229 _dex_target,
1230 ]
1231
1232 if (defined(_dex_path)) {
1233 dex_path =
1234 get_label_info(_dex_target, "target_gen_dir") + "/bootstrap.dex"
1235 }
1236
1237 native_libs = _native_libs_even_when_incremental
1238
1239 # http://crbug.com/384638
1240 _has_native_libs =
1241 defined(invoker.native_libs_filearg) || _native_libs != []
1242 if (_has_native_libs && _native_libs_even_when_incremental == []) {
1243 native_lib_placeholders = [ "libfix.crbug.384638.so" ]
1244 }
1245
1246 output_apk_path = _incremental_packaged_apk_path
1247 resource_packaged_apk_path = _incremental_resource_packaged_apk_path
1248 }
1249
1250 _finalize_apk_rule_name = "${target_name}__finalize"
1251 finalize_apk(_finalize_apk_rule_name) {
1252 forward_variables_from(invoker, [ "page_align_shared_libraries" ])
1253
1254 input_apk_path = _packaged_apk_path
1255 output_apk_path = _final_apk_path
1256 keystore_path = _keystore_path
1257 keystore_name = _keystore_name
1258 keystore_password = _keystore_password
1259 rezip_apk = _load_library_from_apk
1260
1261 public_deps = [
1262 # Generator of the _packaged_apk_path this target takes as input.
1263 ":$package_target",
1264 ]
1265 }
1266
1267 _incremental_finalize_apk_rule_name = "${target_name}_incremental__finalize"
1268 finalize_apk(_incremental_finalize_apk_rule_name) {
1269 input_apk_path = _incremental_packaged_apk_path
1270 output_apk_path = _incremental_final_apk_path
1271 keystore_path = _keystore_path
1272 keystore_name = _keystore_name
1273 keystore_password = _keystore_password
1274
1275 public_deps = [
1276 ":$_incremental_package_target",
1277 ]
1278 }
1279
1280 _split_deps = []
1281
1282 template("finalize_split") {
1283 finalize_apk(target_name) {
1284 _config = invoker.split_config
1285 _type = invoker.split_type
1286 input_apk_path = "${_resource_packaged_apk_path}_${_config}"
1287 _output_paths = process_file_template(
1288 [ _final_apk_path ],
1289 "{{source_dir}}/{{source_name_part}}-${_type}-${_config}.apk")
1290 output_apk_path = _output_paths[0]
1291 keystore_path = _keystore_path
1292 keystore_name = _keystore_name
1293 keystore_password = _keystore_password
1294 deps = [
1295 ":${_package_resources_target_name}",
1296 ]
1297 }
1298 }
1299
1300 foreach(_split, _split_densities) {
1301 _split_rule = "${target_name}__finalize_${_split}_split"
1302 finalize_split(_split_rule) {
1303 split_type = "density"
1304 split_config = _split
1305 }
1306 _split_deps += [ ":$_split_rule" ]
1307 }
1308 foreach(_split, _split_languages) {
1309 _split_rule = "${target_name}__finalize_${_split}_split"
1310 finalize_split(_split_rule) {
1311 split_type = "lang"
1312 split_config = _split
1313 }
1314 _split_deps += [ ":$_split_rule" ]
1315 }
1316
1317 group(target_name) {
1318 public_deps = [ ":${_finalize_apk_rule_name}" ] + _split_deps
1319 }
1320 group("${target_name}_incremental") {
1321 public_deps = [ ":${_incremental_finalize_apk_rule_name}" ] + _split_deps
1322 }
1323 }
1324
1325 template("java_prebuilt_impl") {
1326 set_sources_assignment_filter([])
1327 forward_variables_from(invoker, [ "testonly" ])
1328 _supports_android =
1329 defined(invoker.supports_android) && invoker.supports_android
1330
1331 assert(defined(invoker.jar_path))
1332 _base_path = "${target_gen_dir}/$target_name"
1333
1334 # Jar files can be needed at runtime (by Robolectric tests or java binaries),
1335 # so do not put them under gen/.
1336 _target_dir_name = get_label_info(":$target_name", "dir")
1337 _jar_path = "$root_out_dir/lib.java$_target_dir_name/$target_name.jar"
1338 _ijar_path =
1339 "$root_out_dir/lib.java$_target_dir_name/$target_name.interface.jar"
1340 _build_config = _base_path + ".build_config"
1341
1342 if (_supports_android) {
1343 _dex_path = _base_path + ".dex.jar"
1344 }
1345 _deps = []
1346 if (defined(invoker.deps)) {
1347 _deps = invoker.deps
1348 }
1349 _jar_deps = []
1350 if (defined(invoker.jar_dep)) {
1351 _jar_deps = [ invoker.jar_dep ]
1352 }
1353
1354 _template_name = target_name
1355
1356 _build_config_target_name = "${_template_name}__build_config"
1357 _process_jar_target_name = "${_template_name}__process_jar"
1358 _ijar_target_name = "${_template_name}__ijar"
1359 if (_supports_android) {
1360 _dex_target_name = "${_template_name}__dex"
1361 }
1362
1363 write_build_config(_build_config_target_name) {
1364 type = "java_library"
1365 supports_android = _supports_android
1366 requires_android =
1367 defined(invoker.requires_android) && invoker.requires_android
1368
1369 deps = _deps
1370 build_config = _build_config
1371 jar_path = _jar_path
1372 if (_supports_android) {
1373 dex_path = _dex_path
1374 }
1375 }
1376
1377 process_java_prebuilt(_process_jar_target_name) {
1378 forward_variables_from(invoker,
1379 [
1380 "jar_excluded_patterns",
1381 "strip_resource_classes",
1382 ])
1383 visibility = [
1384 ":$_ijar_target_name",
1385 ":$_template_name",
1386 ]
1387 if (_supports_android) {
1388 visibility += [ ":$_dex_target_name" ]
1389 }
1390
1391 if (defined(invoker.proguard_preprocess) && invoker.proguard_preprocess) {
1392 proguard_preprocess = true
1393 proguard_config = invoker.proguard_config
1394 }
1395
1396 build_config = _build_config
1397 input_jar_path = invoker.jar_path
1398 output_jar_path = _jar_path
1399
1400 deps = [ ":$_build_config_target_name" ] + _deps + _jar_deps
1401 }
1402
1403 generate_interface_jar(_ijar_target_name) {
1404 input_jar = _jar_path
1405 output_jar = _ijar_path
1406 deps = [
1407 ":$_process_jar_target_name",
1408 ]
1409 }
1410
1411 if (_supports_android) {
1412 dex(_dex_target_name) {
1413 sources = [
1414 _jar_path,
1415 ]
1416 output = _dex_path
1417 deps = [ ":$_process_jar_target_name" ] + _deps + _jar_deps
1418 }
1419 }
1420
1421 if (defined(invoker.main_class)) {
1422 _binary_script_target_name = "${_template_name}__java_binary_script"
1423 java_binary_script(_binary_script_target_name) {
1424 forward_variables_from(invoker,
1425 [
1426 "bootclasspath",
1427 "deps",
1428 "main_class",
1429 "wrapper_script_args",
1430 ])
1431 if (!defined(deps)) {
1432 deps = []
1433 }
1434 build_config = _build_config
1435 jar_path = _jar_path
1436 script_name = _template_name
1437 if (defined(invoker.wrapper_script_name)) {
1438 script_name = invoker.wrapper_script_name
1439 }
1440 deps += [ ":$_build_config_target_name" ]
1441 }
1442 }
1443
1444 group(target_name) {
1445 forward_variables_from(invoker, [ "data_deps" ])
1446 public_deps = [
1447 ":$_ijar_target_name",
1448 ":$_process_jar_target_name",
1449 ]
1450 if (_supports_android) {
1451 public_deps += [ ":$_dex_target_name" ]
1452 }
1453 if (defined(invoker.main_class)) {
1454 # Some targets use the generated script while building, so make it a dep
1455 # rather than a data_dep.
1456 public_deps += [ ":$_binary_script_target_name" ]
1457 }
1458 }
1459 }
1460
1461 # Compiles and jars a set of java files.
1462 #
1463 # Outputs:
1464 # $jar_path.jar
1465 # $jar_path.interface.jar
1466 #
1467 # Variables
1468 # java_files: List of .java files to compile.
1469 # chromium_code: If true, enable extra warnings.
1470 # srcjar_deps: List of srcjar dependencies. The .java files contained in the
1471 # dependencies srcjar outputs will be compiled and added to the output jar.
1472 # jar_path: Use this to explicitly set the output jar path. Defaults to
1473 # "${target_gen_dir}/${target_name}.jar.
1474 template("compile_java") {
1475 set_sources_assignment_filter([])
1476 forward_variables_from(invoker, [ "testonly" ])
1477
1478 assert(defined(invoker.java_files))
1479 assert(defined(invoker.build_config))
1480 assert(defined(invoker.jar_path))
1481
1482 _java_files = invoker.java_files
1483 _final_jar_path = invoker.jar_path
1484 _javac_jar_path = "$target_gen_dir/$target_name.javac.jar"
1485 _process_prebuilt_jar_path =
1486 "$target_gen_dir/$target_name.process_prebuilt.jar"
1487 _final_ijar_path = get_path_info(_final_jar_path, "dir") + "/" +
1488 get_path_info(_final_jar_path, "name") + ".interface.jar"
1489
1490 _build_config = invoker.build_config
1491
1492 _input_jars_paths = []
1493 if (defined(invoker.input_jars_paths)) {
1494 _input_jars_paths += invoker.input_jars_paths
1495 }
1496
1497 _chromium_code = false
1498 if (defined(invoker.chromium_code)) {
1499 _chromium_code = invoker.chromium_code
1500 }
1501
1502 _supports_android = true
1503 if (defined(invoker.supports_android)) {
1504 _supports_android = invoker.supports_android
1505 }
1506
1507 _enable_errorprone = use_errorprone_java_compiler
1508 if (!_chromium_code) {
1509 _enable_errorprone = false
1510 } else if (defined(invoker.enable_errorprone)) {
1511 _enable_errorprone = invoker.enable_errorprone
1512 }
1513
1514 if (defined(invoker.enable_incremental_javac_override)) {
1515 # Use invoker-specified override.
1516 _enable_incremental_javac = invoker.enable_incremental_javac_override
1517 } else {
1518 # Default to build arg if not overridden.
1519 _enable_incremental_javac = enable_incremental_javac
1520 }
1521
1522 _manifest_entries = []
1523 if (defined(invoker.manifest_entries)) {
1524 _manifest_entries = invoker.manifest_entries
1525 }
1526
1527 _srcjar_deps = []
1528 if (defined(invoker.srcjar_deps)) {
1529 _srcjar_deps += invoker.srcjar_deps
1530 }
1531
1532 _java_srcjars = []
1533 if (defined(invoker.srcjars)) {
1534 _java_srcjars = invoker.srcjars
1535 }
1536 foreach(dep, _srcjar_deps) {
1537 _dep_gen_dir = get_label_info(dep, "target_gen_dir")
1538 _dep_name = get_label_info(dep, "name")
1539 _java_srcjars += [ "$_dep_gen_dir/$_dep_name.srcjar" ]
1540 }
1541
1542 # Mark srcjar_deps as used.
1543 assert(_srcjar_deps == [] || true)
1544
1545 _rebased_build_config = rebase_path(_build_config, root_build_dir)
1546 _rebased_jar_path = rebase_path(_javac_jar_path, root_build_dir)
1547
1548 _javac_target_name = "${target_name}__javac"
1549 _process_prebuilt_target_name = "${target_name}__process_prebuilt"
1550 _emma_instr_target_name = "${target_name}__emma_instr"
1551 _ijar_target_name = "${target_name}__ijar"
1552 _final_target_name = target_name
1553
1554 action(_javac_target_name) {
1555 script = "//build/android/gyp/javac.py"
1556 depfile = "$target_gen_dir/$target_name.d"
1557 deps = _srcjar_deps
1558 if (defined(invoker.deps)) {
1559 deps += invoker.deps
1560 }
1561
1562 outputs = [
1563 depfile,
1564 _javac_jar_path,
1565 _javac_jar_path + ".md5.stamp",
1566 ]
1567 sources = _java_files + _java_srcjars
1568 inputs = [
1569 _build_config,
1570 ]
1571
1572 _rebased_java_srcjars = rebase_path(_java_srcjars, root_build_dir)
1573 _rebased_depfile = rebase_path(depfile, root_build_dir)
1574 args = [
1575 "--depfile=$_rebased_depfile",
1576 "--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)",
1577 "--jar-path=$_rebased_jar_path",
1578 "--java-srcjars=$_rebased_java_srcjars",
1579 "--java-srcjars=@FileArg($_rebased_build_config:javac:srcjars)",
1580 ]
1581 if (_enable_incremental_javac) {
1582 args += [ "--incremental" ]
1583 deps += [ "//third_party/jmake" ]
1584 inputs += [ "$root_out_dir/bin/jmake" ]
1585 outputs += [ "${_javac_jar_path}.pdb" ]
1586 }
1587 if (_supports_android) {
1588 if (defined(invoker.alternative_android_sdk_ijar)) {
1589 deps += [ invoker.alternative_android_sdk_ijar_dep ]
1590 _android_sdk_ijar = invoker.alternative_android_sdk_ijar
1591 } else {
1592 deps += [ "//build/android:android_ijar" ]
1593 _android_sdk_ijar = "$root_out_dir/lib.java/android.interface.jar"
1594 }
1595 inputs += [ _android_sdk_ijar ]
1596 _rebased_android_sdk_ijar = rebase_path(_android_sdk_ijar, root_build_dir)
1597 args += [ "--bootclasspath=$_rebased_android_sdk_ijar" ]
1598 }
1599 foreach(c, _input_jars_paths) {
1600 args += [ "--classpath=" + c ]
1601 }
1602 foreach(e, _manifest_entries) {
1603 args += [ "--manifest-entry=" + e ]
1604 }
1605 if (_chromium_code) {
1606 args += [ "--chromium-code=1" ]
1607 }
1608 if (_enable_errorprone) {
1609 deps += [ "//third_party/errorprone:chromium_errorprone" ]
1610 args += [
1611 "--use-errorprone-path",
1612 "bin/chromium_errorprone",
1613 ]
1614 }
1615 args += rebase_path(_java_files, root_build_dir)
1616 }
1617
1618 process_java_prebuilt(_process_prebuilt_target_name) {
1619 forward_variables_from(invoker, [ "jar_excluded_patterns" ])
1620 build_config = _build_config
1621 input_jar_path = _javac_jar_path
1622 output_jar_path = _process_prebuilt_jar_path
1623 if (defined(invoker.proguard_preprocess) && invoker.proguard_preprocess) {
1624 proguard_preprocess = invoker.proguard_preprocess
1625 proguard_config = invoker.proguard_config
1626 }
1627 deps = [
1628 ":$_javac_target_name",
1629 ]
1630 if (defined(invoker.deps)) {
1631 deps += invoker.deps
1632 }
1633 }
1634
1635 emma_instr(_emma_instr_target_name) {
1636 visibility = [
1637 ":$_ijar_target_name",
1638 ":$_final_target_name",
1639 ]
1640
1641 forward_variables_from(invoker, [ "emma_instrument" ])
1642
1643 input_jar_path = _process_prebuilt_jar_path
1644 output_jar_path = _final_jar_path
1645 source_files = _java_files
1646
1647 deps = [
1648 ":$_process_prebuilt_target_name",
1649 ]
1650 }
1651
1652 generate_interface_jar(_ijar_target_name) {
1653 input_jar = _final_jar_path
1654 output_jar = _final_ijar_path
1655 deps = [
1656 ":$_emma_instr_target_name",
1657 ]
1658 }
1659
1660 group(_final_target_name) {
1661 forward_variables_from(invoker, [ "visibility" ])
1662 public_deps = [
1663 ":$_emma_instr_target_name",
1664 ":$_ijar_target_name",
1665 ]
1666 }
1667 }
1668
1669 template("java_library_impl") {
1670 set_sources_assignment_filter([])
1671 forward_variables_from(invoker, [ "testonly" ])
1672 _accumulated_deps = []
1673 if (defined(invoker.deps)) {
1674 _accumulated_deps = invoker.deps
1675 }
1676
1677 assert(defined(invoker.java_files) || defined(invoker.srcjars) ||
1678 defined(invoker.srcjar_deps))
1679 _base_path = "$target_gen_dir/$target_name"
1680
1681 # Jar files can be needed at runtime (by Robolectric tests or java binaries),
1682 # so do not put them under gen/.
1683 _jar_name = target_name
1684 if (defined(invoker.jar_name)) {
1685 _jar_name = invoker.jar_name
1686 }
1687 target_dir_name = get_label_info(":$target_name", "dir")
1688 _jar_path = "$root_out_dir/lib.java$target_dir_name/$_jar_name.jar"
1689 if (defined(invoker.jar_path)) {
1690 _jar_path = invoker.jar_path
1691 }
1692 _template_name = target_name
1693
1694 _final_deps = []
1695
1696 _supports_android =
1697 defined(invoker.supports_android) && invoker.supports_android
1698 _requires_android =
1699 defined(invoker.requires_android) && invoker.requires_android
1700 assert(_requires_android || true) # Mark as used.
1701 _android_manifest = "//build/android/AndroidManifest.xml"
1702 if (defined(invoker.android_manifest)) {
1703 _android_manifest = invoker.android_manifest
1704 }
1705 assert(_android_manifest != "") # Mark as used.
1706
1707 if (defined(invoker.run_findbugs_override)) {
1708 _run_findbugs = invoker.run_findbugs_override
1709 } else {
1710 _run_findbugs = run_findbugs # Default to build arg if not overridden.
1711 }
1712 assert(_run_findbugs || true) # Mark as used.
1713
1714 # Don't enable coverage, lint, findbugs unless the target has some
1715 # non-generated files.
1716 _chromium_code = defined(invoker.java_files) && invoker.java_files != []
1717 if (defined(invoker.chromium_code)) {
1718 _chromium_code = invoker.chromium_code
1719 }
1720
1721 _emma_never_instrument = !_chromium_code
1722 if (defined(invoker.emma_never_instrument)) {
1723 _emma_never_instrument = invoker.emma_never_instrument
1724 }
1725 assert(_emma_never_instrument || true) # Mark as used
1726 _emma_instrument = emma_coverage && !_emma_never_instrument
1727
1728 if (_supports_android) {
1729 _dex_path = _base_path + ".dex.jar"
1730 if (defined(invoker.dex_path)) {
1731 _dex_path = invoker.dex_path
1732 }
1733 }
1734
1735 # Define build_config_deps which will be a list of targets required to
1736 # build the _build_config.
1737 if (defined(invoker.override_build_config)) {
1738 _build_config = invoker.override_build_config
1739 } else {
1740 _build_config = _base_path + ".build_config"
1741 build_config_target_name = "${_template_name}__build_config"
1742
1743 write_build_config(build_config_target_name) {
1744 deps = _accumulated_deps
1745 if (defined(invoker.is_java_binary) && invoker.is_java_binary) {
1746 type = "java_binary"
1747 } else {
1748 type = "java_library"
1749 }
1750 supports_android = _supports_android
1751 requires_android = _requires_android
1752 bypass_platform_checks = defined(invoker.bypass_platform_checks) &&
1753 invoker.bypass_platform_checks
1754
1755 build_config = _build_config
1756 jar_path = _jar_path
1757 if (_supports_android) {
1758 dex_path = _dex_path
1759 }
1760 }
1761 _accumulated_deps += [ ":$build_config_target_name" ]
1762 }
1763
1764 _srcjar_deps = []
1765 if (defined(invoker.srcjar_deps)) {
1766 _srcjar_deps = invoker.srcjar_deps
1767 }
1768
1769 _srcjars = []
1770 if (defined(invoker.srcjars)) {
1771 _srcjars = invoker.srcjars
1772 }
1773
1774 _java_files = []
1775 if (defined(invoker.java_files)) {
1776 _java_files += invoker.java_files
1777 }
1778 assert(_java_files != [] || _srcjar_deps != [] || _srcjars != [])
1779
1780 _compile_java_target = "${_template_name}__compile_java"
1781 _final_deps += [ ":$_compile_java_target" ]
1782 compile_java(_compile_java_target) {
1783 forward_variables_from(invoker,
1784 [
1785 "alternative_android_sdk_ijar",
1786 "alternative_android_sdk_ijar_dep",
1787 "dist_jar_path",
1788 "enable_errorprone",
1789 "enable_incremental_javac_override",
1790 "input_jars_paths",
1791 "jar_excluded_patterns",
1792 "manifest_entries",
1793 "proguard_config",
1794 "proguard_preprocess",
1795 ])
1796 jar_path = _jar_path
1797 build_config = _build_config
1798 java_files = _java_files
1799 srcjar_deps = _srcjar_deps
1800 srcjars = _srcjars
1801 chromium_code = _chromium_code
1802 supports_android = _supports_android
1803 emma_instrument = _emma_instrument
1804 deps = _accumulated_deps
1805 }
1806 _accumulated_deps += [ ":$_compile_java_target" ]
1807 assert(_accumulated_deps != []) # Mark used.
1808
1809 if (defined(invoker.main_class)) {
1810 # Targets might use the generated script while building, so make it a dep
1811 # rather than a data_dep.
1812 _final_deps += [ ":${_template_name}__java_binary_script" ]
1813 java_binary_script("${_template_name}__java_binary_script") {
1814 forward_variables_from(invoker,
1815 [
1816 "bootclasspath",
1817 "main_class",
1818 "wrapper_script_args",
1819 ])
1820 build_config = _build_config
1821 jar_path = _jar_path
1822 script_name = _template_name
1823 if (defined(invoker.wrapper_script_name)) {
1824 script_name = invoker.wrapper_script_name
1825 }
1826 deps = _accumulated_deps
1827 }
1828 }
1829
1830 _has_lint_target = false
1831 if (_supports_android) {
1832 if (_chromium_code) {
1833 _has_lint_target = true
1834 android_lint("${_template_name}__lint") {
1835 android_manifest = _android_manifest
1836 build_config = _build_config
1837 jar_path = _jar_path
1838 java_files = _java_files
1839 deps = _accumulated_deps
1840 }
1841
1842 if (_run_findbugs) {
1843 findbugs("${_template_name}__findbugs") {
1844 build_config = _build_config
1845 jar_path = _jar_path
1846 deps = _accumulated_deps
1847 }
1848 }
1849
1850 # Use an intermediate group() rather as the data_deps target in order to
1851 # avoid lint artifacts showing up as runtime_deps (while still having lint
1852 # run in parallel to other targets).
1853 group("${_template_name}__analysis") {
1854 public_deps = [
1855 ":${_template_name}__lint",
1856 ]
1857 if (_run_findbugs) {
1858 public_deps += [ ":${_template_name}__findbugs" ]
1859 }
1860 }
1861 }
1862
1863 _final_deps += [ ":${_template_name}__dex" ]
1864 dex("${_template_name}__dex") {
1865 sources = [
1866 _jar_path,
1867 ]
1868 output = _dex_path
1869 deps = [
1870 ":$_compile_java_target",
1871 ]
1872 }
1873 }
1874
1875 group(target_name) {
1876 forward_variables_from(invoker,
1877 [
1878 "data_deps",
1879 "visibility",
1880 ])
1881 if (!defined(data_deps)) {
1882 data_deps = []
1883 }
1884 public_deps = _final_deps
1885 if (_has_lint_target) {
1886 data_deps += [ ":${_template_name}__analysis" ]
1887 }
1888 }
1889 }
1890
1891 # Runs process_resources.py
1892 template("process_resources") {
1893 set_sources_assignment_filter([])
1894 forward_variables_from(invoker, [ "testonly" ])
1895
1896 zip_path = invoker.zip_path
1897 srcjar_path = invoker.srcjar_path
1898 r_text_path = invoker.r_text_path
1899 build_config = invoker.build_config
1900 android_manifest = invoker.android_manifest
1901
1902 non_constant_id = true
1903 if (defined(invoker.generate_constant_ids) && invoker.generate_constant_ids) {
1904 non_constant_id = false
1905 }
1906
1907 action(target_name) {
1908 forward_variables_from(invoker,
1909 [
1910 "deps",
1911 "visibility",
1912 ])
1913 script = "//build/android/gyp/process_resources.py"
1914
1915 depfile = "$target_gen_dir/$target_name.d"
1916 outputs = [
1917 depfile,
1918 zip_path,
1919 srcjar_path,
1920 r_text_path,
1921 ]
1922
1923 _all_resource_dirs = []
1924 sources = []
1925
1926 if (defined(invoker.resource_dirs)) {
1927 _all_resource_dirs += invoker.resource_dirs
1928
1929 # Speed up "gn gen" by short-circuiting the empty directory.
1930 if (invoker.resource_dirs != [ "//build/android/ant/empty/res" ] &&
1931 invoker.resource_dirs != []) {
1932 _sources_build_rel =
1933 exec_script("//build/android/gyp/find.py",
1934 rebase_path(invoker.resource_dirs, root_build_dir),
1935 "list lines")
1936 sources += rebase_path(_sources_build_rel, ".", root_build_dir)
1937 }
1938 }
1939
1940 if (defined(invoker.generated_resource_dirs)) {
1941 assert(defined(invoker.generated_resource_files))
1942 _all_resource_dirs += invoker.generated_resource_dirs
1943 sources += invoker.generated_resource_files
1944 }
1945
1946 inputs = [
1947 build_config,
1948 android_manifest,
1949 ]
1950
1951 _rebased_all_resource_dirs = rebase_path(_all_resource_dirs, root_build_dir)
1952 rebase_build_config = rebase_path(build_config, root_build_dir)
1953
1954 if (defined(invoker.android_aapt_path)) {
1955 _android_aapt_path = invoker.android_aapt_path
1956 } else {
1957 _android_aapt_path = android_default_aapt_path
1958 }
1959
1960 if (defined(invoker.alternative_android_sdk_jar)) {
1961 _rebased_android_sdk_jar =
1962 rebase_path(invoker.alternative_android_sdk_jar)
1963 } else {
1964 _rebased_android_sdk_jar = rebased_android_sdk_jar
1965 }
1966
1967 args = [
1968 "--depfile",
1969 rebase_path(depfile, root_build_dir),
1970 "--android-sdk-jar",
1971 _rebased_android_sdk_jar,
1972 "--aapt-path",
1973 _android_aapt_path,
1974 "--android-manifest",
1975 rebase_path(android_manifest, root_build_dir),
1976 "--resource-dirs=$_rebased_all_resource_dirs",
1977 "--srcjar-out",
1978 rebase_path(srcjar_path, root_build_dir),
1979 "--resource-zip-out",
1980 rebase_path(zip_path, root_build_dir),
1981 "--r-text-out",
1982 rebase_path(r_text_path, root_build_dir),
1983 "--dependencies-res-zips=@FileArg($rebase_build_config:resources:dependenc y_zips)",
1984 "--extra-res-packages=@FileArg($rebase_build_config:resources:extra_packag e_names)",
1985 "--extra-r-text-files=@FileArg($rebase_build_config:resources:extra_r_text _files)",
1986 ]
1987
1988 if (non_constant_id) {
1989 args += [ "--non-constant-id" ]
1990 }
1991
1992 if (defined(invoker.custom_package)) {
1993 args += [
1994 "--custom-package",
1995 invoker.custom_package,
1996 ]
1997 }
1998
1999 if (defined(invoker.v14_skip) && invoker.v14_skip) {
2000 args += [ "--v14-skip" ]
2001 }
2002
2003 if (defined(invoker.shared_resources) && invoker.shared_resources) {
2004 args += [ "--shared-resources" ]
2005 }
2006
2007 if (defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib) {
2008 args += [ "--app-as-shared-lib" ]
2009 }
2010
2011 if (defined(invoker.include_all_resources) &&
2012 invoker.include_all_resources) {
2013 args += [ "--include-all-resources" ]
2014 }
2015
2016 if (defined(invoker.all_resources_zip_path)) {
2017 all_resources_zip = invoker.all_resources_zip_path
2018 outputs += [ all_resources_zip ]
2019 args += [
2020 "--all-resources-zip-out",
2021 rebase_path(all_resources_zip, root_build_dir),
2022 ]
2023 }
2024
2025 if (defined(invoker.proguard_file)) {
2026 outputs += [ invoker.proguard_file ]
2027 args += [
2028 "--proguard-file",
2029 rebase_path(invoker.proguard_file, root_build_dir),
2030 ]
2031 }
2032
2033 if (defined(invoker.args)) {
2034 args += invoker.args
2035 }
2036 }
2037 }
2038
2039 template("copy_ex") {
2040 set_sources_assignment_filter([])
2041 action(target_name) {
2042 forward_variables_from(invoker,
2043 [
2044 "data",
2045 "deps",
2046 "inputs",
2047 "sources",
2048 "testonly",
2049 "visibility",
2050 ])
2051 if (!defined(sources)) {
2052 sources = []
2053 }
2054 script = "//build/android/gyp/copy_ex.py"
2055
2056 depfile = "$target_gen_dir/$target_name.d"
2057 outputs = [
2058 depfile,
2059 ]
2060
2061 args = [
2062 "--depfile",
2063 rebase_path(depfile, root_build_dir),
2064 "--dest",
2065 rebase_path(invoker.dest, root_build_dir),
2066 ]
2067 rebased_sources = rebase_path(sources, root_build_dir)
2068 args += [ "--files=$rebased_sources" ]
2069
2070 if (defined(invoker.clear_dir) && invoker.clear_dir) {
2071 args += [ "--clear" ]
2072 }
2073
2074 if (defined(invoker.args)) {
2075 args += invoker.args
2076 }
2077
2078 if (defined(invoker.renaming_sources) &&
2079 defined(invoker.renaming_destinations)) {
2080 sources += invoker.renaming_sources
2081 rebased_renaming_sources =
2082 rebase_path(invoker.renaming_sources, root_build_dir)
2083 args += [ "--renaming-sources=$rebased_renaming_sources" ]
2084
2085 renaming_destinations = invoker.renaming_destinations
2086 args += [ "--renaming-destinations=$renaming_destinations" ]
2087 }
2088 }
2089 }
2090
2091 # Produces a single .dex.jar out of a set of Java dependencies.
2092 template("deps_dex") {
2093 set_sources_assignment_filter([])
2094 build_config = "$target_gen_dir/${target_name}.build_config"
2095 build_config_target_name = "${target_name}__build_config"
2096
2097 write_build_config(build_config_target_name) {
2098 forward_variables_from(invoker,
2099 [
2100 "deps",
2101 "dex_path",
2102 ])
2103 type = "deps_dex"
2104 build_config = build_config
2105 }
2106
2107 rebased_build_config = rebase_path(build_config, root_build_dir)
2108 dex(target_name) {
2109 inputs = [
2110 build_config,
2111 ]
2112 output = invoker.dex_path
2113 dex_arg_key = "${rebased_build_config}:final_dex:dependency_dex_files"
2114 args = [ "--inputs=@FileArg($dex_arg_key)" ]
2115 if (defined(invoker.excluded_jars)) {
2116 excluded_jars = rebase_path(invoker.excluded_jars, root_build_dir)
2117 args += [ "--excluded-paths=${excluded_jars}" ]
2118 }
2119 deps = [
2120 ":$build_config_target_name",
2121 ]
2122 }
2123 }
2124
2125 # Creates an AndroidManifest.xml for an APK split.
2126 template("generate_split_manifest") {
2127 assert(defined(invoker.main_manifest))
2128 assert(defined(invoker.out_manifest))
2129 assert(defined(invoker.split_name))
2130
2131 action(target_name) {
2132 forward_variables_from(invoker,
2133 [
2134 "deps",
2135 "testonly",
2136 ])
2137 depfile = "$target_gen_dir/$target_name.d"
2138 args = [
2139 "--main-manifest",
2140 rebase_path(invoker.main_manifest, root_build_dir),
2141 "--out-manifest",
2142 rebase_path(invoker.out_manifest, root_build_dir),
2143 "--split",
2144 invoker.split_name,
2145 ]
2146 if (defined(invoker.version_code)) {
2147 args += [
2148 "--version-code",
2149 invoker.version_code,
2150 ]
2151 }
2152 if (defined(invoker.version_name)) {
2153 args += [
2154 "--version-name",
2155 invoker.version_name,
2156 ]
2157 }
2158 if (defined(invoker.has_code)) {
2159 args += [
2160 "--has-code",
2161 invoker.has_code,
2162 ]
2163 }
2164 args += [
2165 "--depfile",
2166 rebase_path(depfile, root_build_dir),
2167 ]
2168
2169 script = "//build/android/gyp/generate_split_manifest.py"
2170 outputs = [
2171 depfile,
2172 invoker.out_manifest,
2173 ]
2174 inputs = [
2175 invoker.main_manifest,
2176 ]
2177 }
2178 }
2179
2180 # Generates a script in the output bin directory which runs the test
2181 # target using the test runner script in build/android/test_runner.py.
2182 template("test_runner_script") {
2183 testonly = true
2184 _test_name = invoker.test_name
2185 _test_type = invoker.test_type
2186 _incremental_install =
2187 defined(invoker.incremental_install) && invoker.incremental_install
2188
2189 action(target_name) {
2190 forward_variables_from(invoker,
2191 [
2192 "data_deps",
2193 "deps",
2194 ])
2195 if (!defined(deps)) {
2196 deps = []
2197 }
2198 if (!defined(data_deps)) {
2199 data_deps = []
2200 }
2201
2202 script = "//build/android/gyp/create_test_runner_script.py"
2203 depfile = "$target_gen_dir/$target_name.d"
2204
2205 data_deps += [ "//build/android:test_runner_py" ]
2206 data = []
2207
2208 test_runner_args = [
2209 _test_type,
2210 "--output-directory",
2211 rebase_path(root_build_dir, root_build_dir),
2212 ]
2213
2214 # apk_target is not used for native executable tests
2215 # (e.g. breakpad_unittests).
2216 if (defined(invoker.apk_target)) {
2217 assert(!defined(invoker.executable_dist_dir))
2218 deps += [ "${invoker.apk_target}__build_config" ]
2219 _apk_build_config =
2220 get_label_info(invoker.apk_target, "target_gen_dir") + "/" +
2221 get_label_info(invoker.apk_target, "name") + ".build_config"
2222 _rebased_apk_build_config = rebase_path(_apk_build_config, root_build_dir)
2223 assert(_rebased_apk_build_config != "") # Mark as used.
2224 } else if (_test_type == "gtest") {
2225 assert(
2226 defined(invoker.executable_dist_dir),
2227 "Must define either apk_target or executable_dist_dir for test_runner_ script()")
2228 test_runner_args += [
2229 "--executable-dist-dir",
2230 rebase_path(invoker.executable_dist_dir, root_build_dir),
2231 ]
2232 }
2233
2234 if (_test_type == "gtest") {
2235 assert(defined(invoker.test_suite))
2236 test_runner_args += [
2237 "--suite",
2238 invoker.test_suite,
2239 ]
2240 } else if (_test_type == "instrumentation") {
2241 _test_apk = "@FileArg($_rebased_apk_build_config:deps_info:apk_path)"
2242 if (_incremental_install) {
2243 _test_apk = "@FileArg($_rebased_apk_build_config:deps_info:incremental_a pk_path)"
2244 }
2245 test_runner_args += [ "--test-apk=$_test_apk" ]
2246 if (defined(invoker.apk_under_test)) {
2247 deps += [ "${invoker.apk_under_test}__build_config" ]
2248 _apk_under_test_build_config =
2249 get_label_info(invoker.apk_under_test, "target_gen_dir") + "/" +
2250 get_label_info(invoker.apk_under_test, "name") + ".build_config"
2251 _rebased_apk_under_test_build_config =
2252 rebase_path(_apk_under_test_build_config, root_build_dir)
2253 _apk_under_test =
2254 "@FileArg($_rebased_apk_under_test_build_config:deps_info:apk_path)"
2255 if (_incremental_install) {
2256 _apk_under_test = "@FileArg($_rebased_apk_under_test_build_config:deps _info:incremental_apk_path)"
2257 }
2258 test_runner_args += [ "--apk-under-test=$_apk_under_test" ]
2259 }
2260 if (emma_coverage) {
2261 # Set a default coverage output directory (can be overridden by user
2262 # passing the same flag).
2263 test_runner_args += [
2264 "--coverage-dir",
2265 rebase_path("$root_out_dir/coverage", root_build_dir),
2266 ]
2267 }
2268 } else if (_test_type == "junit") {
2269 assert(defined(invoker.test_suite))
2270 test_runner_args += [
2271 "--test-suite",
2272 invoker.test_suite,
2273 ]
2274 } else {
2275 assert(false, "Invalid test type: $_test_type.")
2276 }
2277
2278 if (defined(invoker.additional_apks)) {
2279 foreach(additional_apk, invoker.additional_apks) {
2280 deps += [ "${additional_apk}__build_config" ]
2281 _build_config = get_label_info(additional_apk, "target_gen_dir") + "/" +
2282 get_label_info(additional_apk, "name") + ".build_config"
2283 _rebased_build_config = rebase_path(_build_config, root_build_dir)
2284 test_runner_args += [
2285 "--additional-apk",
2286 "@FileArg($_rebased_build_config:deps_info:apk_path)",
2287 ]
2288 }
2289 }
2290 if (defined(invoker.isolate_file)) {
2291 data += [ invoker.isolate_file ]
2292 test_runner_args += [
2293 "--isolate-file-path",
2294 rebase_path(invoker.isolate_file, root_build_dir),
2295 ]
2296 }
2297 if (defined(invoker.shard_timeout)) {
2298 test_runner_args += [ "--shard-timeout=${invoker.shard_timeout}" ]
2299 }
2300 if (_incremental_install) {
2301 test_runner_args += [
2302 "--test-apk-incremental-install-script",
2303 "@FileArg($_rebased_apk_build_config:deps_info:incremental_install_scrip t_path)",
2304 ]
2305 if (defined(invoker.apk_under_test)) {
2306 test_runner_args += [
2307 "--apk-under-test-incremental-install-script",
2308 "@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_ install_script_path)",
2309 ]
2310 }
2311 test_runner_args += [ "--fast-local-dev" ]
2312 }
2313 if (is_asan) {
2314 test_runner_args += [ "--tool=asan" ]
2315 }
2316
2317 generated_script = "$root_build_dir/bin/run_${_test_name}"
2318 outputs = [
2319 depfile,
2320 generated_script,
2321 ]
2322 data += [ generated_script ]
2323
2324 args = [
2325 "--depfile",
2326 rebase_path(depfile, root_build_dir),
2327 "--script-output-path",
2328 rebase_path(generated_script, root_build_dir),
2329 ]
2330 args += test_runner_args
2331 }
2332 }
OLDNEW
« no previous file with comments | « build/config/android/config.gni ('k') | build/config/android/rules.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698