# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/android/build_vars.gni")
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("//build/config/python.gni")
import("//build_overrides/build.gni")

if (enable_java_templates) {
  # Create or update the API versions cache if necessary by running a
  # functionally empty lint task. This prevents racy creation of the
  # cache while linting java targets in android_lint.
  android_lint("prepare_android_lint_cache") {
    create_cache = true
  }

  generate_build_config_srcjar("build_config_gen") {
    use_final_fields = false
  }

  generate_build_config_srcjar("build_config_for_testing_gen") {
    use_final_fields = false
    testonly = true
  }

  write_native_libraries_java("native_libraries_gen") {
    use_final_fields = false
  }

  java_library("build_java") {
    supports_android = true
    srcjar_deps = [
      ":build_config_gen",
      ":native_libraries_gen",
    ]
    sources = [
      "java/src/org/chromium/build/annotations/AlwaysInline.java",
      "java/src/org/chromium/build/annotations/CheckDiscard.java",
      "java/src/org/chromium/build/annotations/DoNotClassMerge.java",
      "java/src/org/chromium/build/annotations/DoNotInline.java",
      "java/src/org/chromium/build/annotations/DoNotStripLogs.java",
      "java/src/org/chromium/build/annotations/IdentifierNameString.java",
      "java/src/org/chromium/build/annotations/MainDex.java",
      "java/src/org/chromium/build/annotations/MockedInTests.java",
      "java/src/org/chromium/build/annotations/UsedByReflection.java",
    ]

    jar_excluded_patterns = [ "*/build/BuildConfig.class" ]

    # New version of NativeLibraries.java (with the actual correct values) will
    # be created when creating an apk.
    jar_excluded_patterns += [ "*/NativeLibraries.class" ]

    proguard_configs = [ "chromium_annotations.flags" ]
  }

  # Not all //build embedders pull in junit_binary deps that live in //third_party.
  if (build_with_chromium) {
    android_assets("junit_test_assets") {
      testonly = true

      # We just need any file here, so use the test itself.
      sources = [ "junit/src/org/chromium/build/AndroidAssetsTest.java" ]
    }
    android_resources("junit_test_resources") {
      testonly = true
      sources = [ "junit/res/values/strings.xml" ]
      mergeable_android_manifests = [ "junit/AndroidManifest_mergetest.xml" ]
    }
    robolectric_binary("build_junit_tests") {
      # Test has no JNI, so skip JNI Generator step.
      generate_final_jni = false
      resources_package = "org.chromium.build"
      sources = [
        "junit/src/org/chromium/build/AndroidAssetsTest.java",
        "junit/src/org/chromium/build/IncrementalJavacTest.java",
      ]
      deps = [
        ":junit_test_assets",
        ":junit_test_resources",
        "//build/android/test/incremental_javac_gn:no_signature_change_prebuilt_java",
        "//third_party/junit",
      ]
    }
  }
}

# TODO(go/turn-down-test-results): Remove once we turn down
# test-results.appspot.com
python_library("test_result_presentations_py") {
  pydeps_file = "pylib/results/presentation/test_results_presentation.pydeps"
  data = [
    "//build/android/pylib/results/presentation/template",
    "//build/android/pylib/results/presentation/javascript/main_html.js",
    "//third_party/catapult/third_party/gsutil/",
    "//third_party/jinja2/debug.py",
    "//third_party/six",
  ]
}

python_library("devil_chromium_py") {
  pydeps_file = "devil_chromium.pydeps"
  data = [
    "devil_chromium.py",
    "devil_chromium.json",
    "//third_party/catapult/third_party/gsutil/",
    "//third_party/catapult/devil/devil/devil_dependencies.json",

    # Read by gn_helpers.BuildWithChromium()
    "//build/config/gclient_args.gni",
  ]
}

# Contains runtime deps for installing apks.
# E.g. from test_runner.py or from apk_operations.py.
group("apk_installer_data") {
  # Other //build users let devil library fetch these from Google Storage.
  if (build_with_chromium) {
    data_deps = [
      "//build/android/pylib/device/commands",
      "//tools/android/md5sum",
    ]
    data = [ "//third_party/android_build_tools/bundletool/bundletool.jar" ]
  }
}

python_library("apk_operations_py") {
  pydeps_file = "apk_operations.pydeps"
  deps = [ ":apk_installer_data" ]
}

group("test_runner_py") {
  testonly = true
  deps = [
    ":test_runner_core_py",
    ":test_runner_device_support",
  ]
}

python_library("test_runner_core_py") {
  testonly = true
  pydeps_file = "test_runner.pydeps"
  data = [
    "pylib/gtest/filter/",
    "pylib/instrumentation/render_test.html.jinja",
    "test_wrapper/logdog_wrapper.py",
    "//third_party/requests/",
  ]
  data_deps = [ ":logdog_wrapper_py" ]
}

group("test_runner_device_support") {
  testonly = true

  # We hardcode using these tools from the public sdk in devil_chromium.json and
  # in pylib's constants.
  data = [
    "${public_android_sdk_build_tools}/aapt",
    "${public_android_sdk_build_tools}/dexdump",
    "${public_android_sdk_build_tools}/lib64/libc++.so",
    "${public_android_sdk_build_tools}/split-select",
    "${public_android_sdk_root}/platform-tools/adb",
  ]
  data_deps = [
    ":apk_installer_data",
    ":devil_chromium_py",
    ":stack_tools",
  ]

  # Other //build users let devil library fetch these from Google Storage.
  if (build_with_chromium) {
    data_deps += [ "//tools/android/forwarder2" ]
    data += [ "//tools/android/avd/proto/" ]
    if (enable_chrome_android_internal) {
       data += [ "//clank/tools/android/avd/proto/" ]
     }
    if (is_asan) {
      data_deps += [ "//tools/android/asan/third_party:asan_device_setup" ]
    }
  }

  # Proguard is needed only when using apks (rather than native executables).
  if (enable_java_templates) {
    data_deps += [ "//build/android/stacktrace:java_deobfuscate" ]
  }
}

python_library("logdog_wrapper_py") {
  pydeps_file = "test_wrapper/logdog_wrapper.pydeps"
}

python_library("resource_sizes_py") {
  pydeps_file = "resource_sizes.pydeps"
  data_deps = [
    ":devil_chromium_py",
    "//third_party/catapult/tracing:convert_chart_json",
  ]

  data = [
    build_vars_file,
    android_readelf,
    rebase_path("$android_ndk_library_path/libc++.so.1", root_build_dir),
  ]
}

# Tools necessary for symbolizing tombstones or stack traces that are output to
# logcat.
# Hidden behind build_with_chromium because some third party repos that use
# //build don't pull in //third_party/android_platform.
# TODO(crbug.com/1120190): Move stack script into //build/third_party
#     and enable unconditionally.
group("stack_tools") {
  if (build_with_chromium) {
    data = [
      "tombstones.py",
      "pylib/symbols/",
      "stacktrace/",
    ]

    data_deps =
        [ "//third_party/android_platform/development/scripts:stack_py" ]
  }
}

# GN evaluates each .gn file once per toolchain, so restricting to default
# toolchain will ensure write_file() is called only once.
assert(current_toolchain == default_toolchain)

# NOTE: If other platforms would benefit from exporting variables, we should
# move this to a more top-level place.
# It is currently here (instead of //BUILD.gn) to ensure that the file is
# written even for non-chromium embedders of //build.
_build_vars_json = {
  # Underscore prefix so that it appears at the top.
  _HEADER = "Generated during 'gn gen' by //build/android/BUILD.gn."
  forward_variables_from(android_build_vars_json, "*")
}

write_file(build_vars_file, _build_vars_json, "json")
