From bfd89d6393fd56c92c0b31b19d7ec78d8da9141f Mon Sep 17 00:00:00 2001 From: kmb Date: Wed, 11 Apr 2018 14:26:56 -0700 Subject: hook up Bazel's implicit dependencies for legacy java 8 support in //tools/android PiperOrigin-RevId: 192509068 --- WORKSPACE | 8 +++ tools/android/BUILD | 13 ++++- tools/android/BUILD.tools | 98 +++++++++++++++++++++++++++++++-- tools/android/build_java8_legacy_dex.sh | 34 ++++++++++++ 4 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 tools/android/build_java8_legacy_dex.sh diff --git a/WORKSPACE b/WORKSPACE index 644cb899ee..5831252d20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -91,6 +91,14 @@ new_local_repository( build_file = "./third_party/googleapis/BUILD", ) +http_archive( + name = "desugar_jdk_libs", + url = "https://github.com/google/desugar_jdk_libs/archive/91c7bd26d3ae32be7cc548d83ce173e8f88a7b94.zip", + # Computed using "shasum -a 256 " + sha256 = "3aa43733e16e94c24c98edcf6732df43f8a6ef2bed589b412b00e3003d0c3179", + strip_prefix = "desugar_jdk_libs-91c7bd26d3ae32be7cc548d83ce173e8f88a7b94", +) + # OpenJDK distributions used to create a version of Bazel bundled with the OpenJDK. http_file( name = "openjdk_linux", diff --git a/tools/android/BUILD b/tools/android/BUILD index 4f1eb3c08c..e22f55d794 100644 --- a/tools/android/BUILD +++ b/tools/android/BUILD @@ -179,6 +179,14 @@ py_test( ], ) +genrule( + name = "desugar_jdk_libs", + srcs = ["@desugar_jdk_libs"], + outs = ["desugar_jdk_libs.jar"], + cmd = "cp $< $@", + visibility = ["//visibility:private"], +) + filegroup( name = "srcs", srcs = glob(["**"]) + ["//tools/android/emulator:srcs"], @@ -192,7 +200,10 @@ filegroup( "*_test.py", "*_test.sh", ], - ) + ["//tools/android/emulator:embedded_tools"], + ) + [ + ":desugar_jdk_libs.jar", + "//tools/android/emulator:embedded_tools", + ], ) # Exported for AndroidSdkRepositoryTest to use it instead of mocking it out. diff --git a/tools/android/BUILD.tools b/tools/android/BUILD.tools index 4a12571b60..92ffa8701b 100644 --- a/tools/android/BUILD.tools +++ b/tools/android/BUILD.tools @@ -129,26 +129,114 @@ genrule( visibility = ["//visibility:private"], ) -filegroup( +java_import( name = "desugared_java8_legacy_apis", - srcs = [], # TODO(b/70681189): Populate with ijars + jars = [":ijar_desugared_java8_legacy_libs"], + neverlink = 1, visibility = ["//visibility:public"], ) +genrule( + name = "ijar_desugared_java8_legacy_libs", + srcs = ["desugared_java8_legacy_libs"], + outs = ["desugared_java8_legacy_libs-ijar.jar"], + cmd = "$(location //third_party/ijar) $< $@", + tools = ["//third_party/ijar"], + visibility = ["//visibility:private"], +) + sh_binary( name = "build_java8_legacy_dex", - srcs = ["fail.sh"], + srcs = ["build_java8_legacy_dex.sh"], + data = [":java8_legacy_dex"], visibility = ["//visibility:public"], ) genrule( name = "java8_legacy_dex", + srcs = ["desugared_java8_legacy_libs"], outs = ["java8_legacy.dex.zip"], - cmd = "$(location :build_java8_legacy_dex) --output $@", - tools = [":build_java8_legacy_dex"], + cmd = """$(location :dexer) --dex "--output=$@" $<""", + tools = [":dexer"], visibility = ["//visibility:public"], ) +filegroup( + name = "desugared_java8_legacy_libs", + srcs = ["desugared_java8_legacy_libs.jar"], + visibility = ["//visibility:private"], +) + +genrule( + name = "desugar_java8_legacy_libs", + srcs = ["desugar_jdk_libs.jar"], + outs = ["desugared_java8_legacy_libs.jar"], + cmd = """ + classpath=() + for j in $(locations //tools/jdk:bootclasspath); do + classpath+=("--classpath_entry") + classpath+=("$${j}") + done + $(location :desugar_java8) \ + --input $< \ + --output $@ \ + "$${classpath[@]}" \ + --core_library --allow_empty_bootclasspath \ + --nobest_effort_tolerate_missing_deps \ + --noemit_dependency_metadata_as_needed \ + --nodesugar_try_with_resources_if_needed \ + --desugar_supported_core_libs \ + --rewrite_core_library_prefix java/lang/Double8 \ + --rewrite_core_library_prefix java/lang/Integer8 \ + --rewrite_core_library_prefix java/lang/Long8 \ + --rewrite_core_library_prefix java/lang/Math8 \ + --rewrite_core_library_prefix java/time/ \ + --rewrite_core_library_prefix java/util/stream/ \ + --rewrite_core_library_prefix java/util/function/ \ + --rewrite_core_library_prefix java/util/Arrays8 \ + --rewrite_core_library_prefix java/util/Comparators \ + --rewrite_core_library_prefix java/util/DoubleSummaryStatistics \ + --rewrite_core_library_prefix java/util/IntSummaryStatistics \ + --rewrite_core_library_prefix java/util/LinkedHashSet8 \ + --rewrite_core_library_prefix java/util/LongSummaryStatistics \ + --rewrite_core_library_prefix java/util/Objects \ + --rewrite_core_library_prefix java/util/Optional \ + --rewrite_core_library_prefix java/util/PrimitiveIterator \ + --rewrite_core_library_prefix java/util/SortedSet\$$1 \ + --rewrite_core_library_prefix java/util/Spliterator \ + --rewrite_core_library_prefix java/util/StringJoiner \ + --rewrite_core_library_prefix java/util/TimeZone8 \ + --rewrite_core_library_prefix java/util/Tripwire \ + --retarget_core_library_member "java/util/Arrays#stream->java/util/Arrays8" \ + --retarget_core_library_member "java/util/Arrays#spliterator->java/util/Arrays8" \ + --retarget_core_library_member "java/util/LinkedHashSet#spliterator->java/util/LinkedHashSet8" \ + --emulate_core_library_interface java/util/Collection \ + --emulate_core_library_interface java/util/Map \ + --emulate_core_library_interface java/util/Map\$$Entry \ + --emulate_core_library_interface java/util/Iterator \ + --emulate_core_library_interface java/util/Comparator \ + --dont_rewrite_core_library_invocation "java/util/Iterator#remove" """, + tools = [ + ":desugar_java8", + "//tools/jdk:bootclasspath", + ], + visibility = ["//visibility:private"], +) + +# No-one should depend on this but :desugared_java8_legacy_libs above +exports_files(["desugar_jdk_libs.jar"], + visibility = ["//visibility:private"], +) + +# Mirrors @//:dx_binary generated by android_sdk_repository rule without +# needing the SDK repo's name (typically @androidsdk but not required). +java_binary( + name = "dexer", + main_class = "com.android.dx.command.Main", + runtime_deps = ["//external:android/dx_jar_import"], + visibility = ["//visibility:private"], +) + alias( name = "IdlClass", actual = "//src/tools/android/java/com/google/devtools/build/android/idlclass:IdlClass", diff --git a/tools/android/build_java8_legacy_dex.sh b/tools/android/build_java8_legacy_dex.sh new file mode 100644 index 0000000000..7ceaea8a4c --- /dev/null +++ b/tools/android/build_java8_legacy_dex.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2018 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http:#www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and + +set -eu + +android_jar= +binary_jar= +dest= +while [[ "$#" -gt 0 ]]; do + arg="$1"; shift; + case "${arg}" in + --binary) binary_jar="$1"; shift ;; + --binary=*) binary_jar="${arg:9}" ;; + --output) dest="$1"; shift ;; + --output=*) dest="${arg:9}" ;; + --android_jar) android_jar="$1"; shift ;; + --android_jar=*) android_jar="${arg:14}" ;; + *) echo "Unknown flag: ${arg}"; exit 1 ;; + esac +done + +# TODO(b/77339644): Support minification +cp "$(dirname "$0")/java8_legacy.dex.zip" "${dest}" -- cgit v1.2.3