• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2014 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import("//build/config/android/build_vars.gni")
6import("//build/config/android/config.gni")
7import("//build/config/android/rules.gni")
8import("//build/config/clang/clang.gni")
9import("//build/config/coverage/coverage.gni")
10import("//build/config/gclient_args.gni")
11import("//build/config/python.gni")
12import("//build_overrides/build.gni")
13
14if (build_with_chromium) {
15  import("//base/allocator/partition_allocator/partition_alloc.gni")
16}
17
18if (enable_java_templates) {
19  # Create or update the API versions cache if necessary by running a
20  # functionally empty lint task. This prevents racy creation of the
21  # cache while linting java targets in android_lint.
22  android_lint("prepare_android_lint_cache") {
23    create_cache = true
24  }
25
26  generate_build_config_srcjar("placeholder_build_config_srcjar") {
27  }
28
29  generate_build_config_srcjar("build_config_for_robolectric_srcjar") {
30    testonly = true
31  }
32
33  write_native_libraries_java("native_libraries_gen") {
34    use_final_fields = false
35  }
36
37  java_library("build_java") {
38    supports_android = true
39
40    # Caused odd errors: https://crbug.com/404877460
41    jacoco_never_instrument = true
42
43    # Required to prevent circular dependency from //tools/android/errorprone_plugin.
44    enable_errorprone = false
45    srcjar_deps = [
46      ":native_libraries_gen",
47      ":placeholder_build_config_srcjar",
48    ]
49    sources = [
50      "java/src/org/chromium/build/NullUtil.java",
51      "java/src/org/chromium/build/annotations/AlwaysInline.java",
52      "java/src/org/chromium/build/annotations/CheckDiscard.java",
53      "java/src/org/chromium/build/annotations/Contract.java",
54      "java/src/org/chromium/build/annotations/DoNotClassMerge.java",
55      "java/src/org/chromium/build/annotations/DoNotInline.java",
56      "java/src/org/chromium/build/annotations/DoNotStripLogs.java",
57      "java/src/org/chromium/build/annotations/EnsuresNonNull.java",
58      "java/src/org/chromium/build/annotations/EnsuresNonNullIf.java",
59      "java/src/org/chromium/build/annotations/IdentifierNameString.java",
60      "java/src/org/chromium/build/annotations/Initializer.java",
61      "java/src/org/chromium/build/annotations/MockedInTests.java",
62      "java/src/org/chromium/build/annotations/MonotonicNonNull.java",
63      "java/src/org/chromium/build/annotations/NullMarked.java",
64      "java/src/org/chromium/build/annotations/NullUnmarked.java",
65      "java/src/org/chromium/build/annotations/Nullable.java",
66      "java/src/org/chromium/build/annotations/OptimizeAsNonNull.java",
67      "java/src/org/chromium/build/annotations/RequiresNonNull.java",
68      "java/src/org/chromium/build/annotations/ServiceImpl.java",
69      "java/src/org/chromium/build/annotations/UsedByReflection.java",
70      "java/src/org/chromium/build/annotations/UsedReflectively.java",
71    ]
72
73    jar_excluded_patterns = [ "*/build/BuildConfig.class" ]
74
75    # New version of NativeLibraries.java (with the actual correct values) will
76    # be created when creating an apk.
77    jar_excluded_patterns += [ "*/NativeLibraries.class" ]
78
79    proguard_configs = [ "chromium_annotations.flags" ]
80  }
81
82  # Not all //build embedders pull in junit_binary deps that live in //third_party.
83  if (build_with_chromium) {
84    android_assets("junit_test_assets") {
85      testonly = true
86
87      # We just need any file here, so use the test itself.
88      sources = [ "junit/src/org/chromium/build/AndroidAssetsTest.java" ]
89    }
90    android_resources("junit_test_resources") {
91      testonly = true
92      sources = [ "junit/res/values/strings.xml" ]
93      mergeable_android_manifests = [ "junit/AndroidManifest_mergetest.xml" ]
94    }
95    robolectric_binary("build_junit_tests") {
96      # Test has no JNI, so skip JNI Generator step.
97      resources_package = "org.chromium.build"
98      sources = [
99        "junit/src/org/chromium/build/AndroidAssetsTest.java",
100        "junit/src/org/chromium/build/IncrementalJavacTest.java",
101      ]
102      deps = [
103        ":junit_test_assets",
104        ":junit_test_resources",
105        "//build/android/test/incremental_javac_gn:no_signature_change_prebuilt_java",
106        "//third_party/junit",
107      ]
108    }
109  }
110}
111
112if (defined(sanitizer_arch)) {
113  action("generate_wrap_sh") {
114    script = "generate_wrap_sh.py"
115    outputs = [ "$target_gen_dir/$target_name/wrap.sh" ]
116    args = [
117      "--arch=$sanitizer_arch",
118      "--output",
119      rebase_path(outputs[0], root_build_dir),
120    ]
121    if (is_hwasan) {
122      args += [ "--is_hwasan" ]
123    }
124  }
125}
126
127# TODO(go/turn-down-test-results): Remove once we turn down
128# test-results.appspot.com
129python_library("test_result_presentations_py") {
130  pydeps_file = "pylib/results/presentation/test_results_presentation.pydeps"
131  data = [
132    "//build/android/pylib/results/presentation/template",
133    "//build/android/pylib/results/presentation/javascript/main_html.js",
134    "//third_party/catapult/third_party/gsutil/",
135    "//third_party/jinja2/debug.py",
136    "//third_party/six",
137  ]
138}
139
140python_library("devil_chromium_py") {
141  pydeps_file = "devil_chromium.pydeps"
142  data = [
143    "devil_chromium.py",
144    "devil_chromium.json",
145    "//third_party/catapult/third_party/gsutil/",
146    "//third_party/catapult/devil/devil/devil_dependencies.json",
147
148    # Read by gn_helpers.BuildWithChromium()
149    "//build/config/gclient_args.gni",
150  ]
151}
152
153# Contains runtime deps for installing apks.
154# E.g. from test_runner.py or from apk_operations.py.
155group("apk_installer_data") {
156  # Other //build users let devil library fetch these from Google Storage.
157  if (build_with_chromium) {
158    if (!is_component_build) {
159      data_deps = [
160        "//build/android/pylib/device/commands",
161        "//tools/android/devil_util",
162      ]
163    }
164    data =
165        [ "//third_party/android_build_tools/bundletool/cipd/bundletool.jar" ]
166  }
167}
168
169python_library("apk_operations_py") {
170  pydeps_file = "apk_operations.pydeps"
171  deps = [ ":apk_installer_data" ]
172}
173
174group("test_runner_py") {
175  testonly = true
176  deps = [
177    ":test_runner_core_py",
178    ":test_runner_device_support",
179  ]
180}
181
182python_library("test_runner_core_py") {
183  testonly = true
184  pydeps_file = "test_runner.pydeps"
185  data = [
186    "pylib/gtest/filter/",
187    "pylib/instrumentation/render_test.html.jinja",
188    "pylib/local/machine/local_machine_hostside_tradefed_config.xml",
189    "test_wrapper/logdog_wrapper.py",
190    "//third_party/requests/",
191  ]
192  data_deps = [ ":logdog_wrapper_py" ]
193  if (use_clang_coverage && checkout_clang_coverage_tools) {
194    # Test runner script may use `llvm-profdata` (if exists) to merge
195    # clang code coverage data after each instrumentation test to
196    # save space. The tool only exists when `checkout_clang_coverage_tools`
197    # gclient custom_var is true.
198    data += [ "${clang_base_path}/bin/llvm-profdata" ]
199  }
200}
201
202group("test_runner_device_support") {
203  testonly = true
204
205  # We hardcode using these tools from the public sdk in devil_chromium.json and
206  # in pylib's constants.
207  data = [
208    "${public_android_sdk_build_tools}/aapt",
209    "${public_android_sdk_build_tools}/aapt2",
210    "${public_android_sdk_build_tools}/dexdump",
211    "${public_android_sdk_build_tools}/lib64/libc++.so",
212    "${public_android_sdk_build_tools}/split-select",
213    "${public_android_sdk_root}/platform-tools/adb",
214  ]
215  data_deps = [
216    ":apk_installer_data",
217    ":devil_chromium_py",
218    ":stack_tools",
219  ]
220
221  # Other //build users let devil library fetch these from Google Storage.
222  if (build_with_chromium) {
223    if (!is_component_build) {
224      data_deps += [ "//tools/android/forwarder2" ]
225    }
226    data += [ "//tools/android/avd/proto/" ]
227    if (enable_chrome_android_internal) {
228      data += [ "//clank/tools/android/avd/proto/" ]
229    }
230    if (use_full_mte) {
231      data_deps += [ "//tools/android/mte:mte_device_setup" ]
232    }
233  }
234
235  # Proguard is needed only when using apks (rather than native executables).
236  if (enable_java_templates) {
237    data_deps += [ "//build/android/stacktrace:java_deobfuscate" ]
238  }
239}
240
241python_library("logdog_wrapper_py") {
242  pydeps_file = "test_wrapper/logdog_wrapper.pydeps"
243}
244
245python_library("resource_sizes_py") {
246  pydeps_file = "resource_sizes.pydeps"
247  data_deps = [
248    ":devil_chromium_py",
249    "//third_party/catapult/tracing:convert_chart_json",
250  ]
251
252  data = [
253    build_vars_file,
254    "//third_party/llvm-build/Release+Asserts/bin/llvm-readobj",
255  ]
256}
257
258# Tools necessary for symbolizing tombstones or stack traces that are output to
259# logcat.
260# Hidden behind build_with_chromium because some third party repos that use
261# //build don't pull in //third_party/android_platform.
262# TODO(crbug.com/40145789): Move stack script into //build/third_party
263#     and enable unconditionally.
264group("stack_tools") {
265  if (build_with_chromium) {
266    data = [
267      "tombstones.py",
268      "pylib/symbols/",
269      "stacktrace/",
270    ]
271
272    data_deps =
273        [ "//third_party/android_platform/development/scripts:stack_py" ]
274  }
275}
276
277# GN evaluates each .gn file once per toolchain, so restricting to default
278# toolchain will ensure write_file() is called only once.
279assert(current_toolchain == default_toolchain)
280
281# NOTE: If other platforms would benefit from exporting variables, we should
282# move this to a more top-level place.
283# It is currently here (instead of //BUILD.gn) to ensure that the file is
284# written even for non-chromium embedders of //build.
285_build_vars_json = {
286  # Underscore prefix so that it appears at the top.
287  _HEADER = "Generated during 'gn gen' by //build/android/BUILD.gn."
288  forward_variables_from(android_build_vars_json, "*")
289}
290
291write_file(build_vars_file, _build_vars_json, "json")
292