Skip to content

Commit

Permalink
Add codepaths for D8 core library desugaring
Browse files Browse the repository at this point in the history
Also deletes the classic core library desugarer.

bazelbuild/rules_android#122

PiperOrigin-RevId: 565104061
Change-Id: I8d78871a4b9e539388f4b328441e135c6365afc2
  • Loading branch information
ted-xie authored and copybara-github committed Sep 13, 2023
1 parent 85b1f10 commit 7c1b139
Show file tree
Hide file tree
Showing 6 changed files with 777 additions and 46 deletions.
15 changes: 15 additions & 0 deletions src/test/shell/bazel/android/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,21 @@ android_sh_test(
],
)

android_sh_test(
name = "library_desugarer_integration_test",
size = "small",
srcs = ["library_desugarer_integration_test.sh"],
data = [
":android_helper",
"//external:android_sdk_for_testing",
"//src/test/shell/bazel:test-deps",
],
tags = [
"manual", # TODO(b/299338002): D8 library desugaring is broken.
"no_windows",
],
)

android_sh_test(
name = "android_instrumentation_test_integration_test",
size = "medium",
Expand Down
62 changes: 62 additions & 0 deletions src/test/shell/bazel/android/library_desugarer_integration_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/bin/bash
#
# Copyright 2023 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
# limitations under the License.

# To run this test, ensure that //external:android_sdk_for_testing is set to
# the @androidsdk//:files filegroup created by the AndroidSdkRepositoryFunction.
# If this is not set, this test will silently pass so as to prevent compile.sh
# from failing for developers without an Android SDK. See the BUILD file for
# more details.

# --- begin runfiles.bash initialization v2 ---
# Copy-pasted from the Bazel Bash runfiles library v2.
set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
source "$0.runfiles/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
{ echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
# --- end runfiles.bash initialization v2 ---

source "$(rlocation io_bazel/src/test/shell/bazel/android/android_helper.sh)" \
|| { echo "android_helper.sh not found!" >&2; exit 1; }
fail_if_no_android_sdk

source "$(rlocation io_bazel/src/test/shell/integration_test_setup.sh)" \
|| { echo "integration_test_setup.sh not found!" >&2; exit 1; }

resolve_android_toolchains "$1"

function test_library_desugar_lib_builds() {
# TODO(b/299338002): Move this to the main desugarer test suite.
create_new_workspace
setup_android_sdk_support
create_android_binary

assert_build @bazel_tools//tools/android:desugar_java8_legacy_libs
}

function test_library_desugaring() {
# TODO(b/299338002): Move this to the main desugarer test suite.
create_new_workspace
setup_android_sdk_support
create_android_binary

assert_build //java/bazel:bin --desugar_java8_libs --experimental_check_desugar_deps
}

run_suite "Android library desugaring integration tests"

19 changes: 19 additions & 0 deletions src/tools/android/java/com/google/devtools/build/android/r8/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,22 @@ java_binary(
":r8",
],
)

java_binary(
name = "core_library_desugar",
jvm_flags = [
# b/71513487
"-XX:+TieredCompilation",
"-XX:TieredStopAtLevel=1",
# b/172508621
"-Dcom.android.tools.r8.sortMethodsOnCfWriting",
"-Dcom.android.tools.r8.disableL8AnnotationRemoval",
],
main_class = "com.google.devtools.build.android.r8.CoreLibraryDesugar",
visibility = [
"//visibility:public",
],
runtime_deps = [
":r8",
],
)
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,21 @@ java_binary(
":r8",
],
)

java_binary(
name = "core_library_desugar",
jvm_flags = [
# b/71513487
"-XX:+TieredCompilation",
"-XX:TieredStopAtLevel=1",
# b/172508621
"-Dcom.android.tools.r8.sortMethodsOnCfWriting",
"-Dcom.android.tools.r8.disableL8AnnotationRemoval",
],
main_class = "com.google.devtools.build.android.r8.CoreLibraryDesugar",
visibility = ["//visibility:public"],
runtime_deps = [
":r8",
],
)

57 changes: 11 additions & 46 deletions tools/android/BUILD.tools
Original file line number Diff line number Diff line change
Expand Up @@ -233,53 +233,18 @@ filegroup(

genrule(
name = "desugar_java8_legacy_libs",
srcs = ["@android_tools//:desugar_jdk_libs.jar"],
srcs = ["@android_tools//:desugar_jdk_libs.jar", "full_desugar_jdk_libs.json", ":android_jar"],
outs = ["desugared_java8_legacy_libs.jar"],
message = "Desugaring java8 legacy libs",
cmd = """
$(location :desugar_java8) \
--input $< \
--output $@ \
--classpath_entry "$(location @bazel_tools//tools/jdk:platformclasspath)" \
--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/time/ \
--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/io/Desugar \
--rewrite_core_library_prefix java/io/UncheckedIOException \
--rewrite_core_library_prefix java/util/stream/ \
--rewrite_core_library_prefix java/util/function/ \
--rewrite_core_library_prefix java/util/Desugar \
--rewrite_core_library_prefix java/util/DoubleSummaryStatistics \
--rewrite_core_library_prefix java/util/IntSummaryStatistics \
--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/Spliterator \
--rewrite_core_library_prefix java/util/StringJoiner \
--rewrite_core_library_prefix javadesugar/testing/ \
--rewrite_core_library_prefix java/util/concurrent/ConcurrentHashMap \
--rewrite_core_library_prefix java/util/concurrent/ThreadLocalRandom \
--rewrite_core_library_prefix java/util/concurrent/atomic/DesugarAtomic \
--auto_desugar_shadowed_api_use \
--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",
"@bazel_tools//tools/jdk:platformclasspath",
],
visibility = ["//visibility:private"],
message = "Desugaring java8 legacy libs with the D8 desugarer",
cmd = (
"$(location //src/tools/android/java/com/google/devtools/build/android/r8:core_library_desugar)" +
" --input $(location @android_tools//:desugar_jdk_libs.jar)" +
" --output $@" +
" --bootclasspath_entry $(location :android_jar)" +
" --desugar_supported_core_libs" +
" --desugared_lib_config $(location full_desugar_jdk_libs.json)"
),
tools = ["//src/tools/android/java/com/google/devtools/build/android/r8:core_library_desugar"],
)

# No-one should depend on this but :desugared_java8_legacy_libs above
Expand Down
Loading

0 comments on commit 7c1b139

Please sign in to comment.