diff options
author | 2018-07-06 07:25:02 -0700 | |
---|---|---|
committer | 2018-07-06 07:26:15 -0700 | |
commit | 4ff32da2f79f36fbb1e608830835a31f39772b8a (patch) | |
tree | ccb5266d9b00bd50021485278c1adfda9ffb828f | |
parent | 5947f474e152f7b1f447ef9c9392cd632c1fdd81 (diff) |
Merge outputs in java_common.merge.
RELNOTES: [JavaInfo] Outputs are merged in java_common.merge().
PiperOrigin-RevId: 203474741
3 files changed, 92 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java index e6aa29093e..ab6d409b1f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java @@ -128,6 +128,8 @@ public final class JavaInfo extends NativeInfo implements JavaInfoApi<Artifact> JavaInfo.fetchProvidersFromList(providers, JavaPluginInfoProvider.class); List<JavaExportsProvider> javaExportsProviders = JavaInfo.fetchProvidersFromList(providers, JavaExportsProvider.class); + List<JavaRuleOutputJarsProvider> javaRuleOutputJarsProviders = + JavaInfo.fetchProvidersFromList(providers, JavaRuleOutputJarsProvider.class); Runfiles mergedRunfiles = Runfiles.EMPTY; @@ -145,9 +147,8 @@ public final class JavaInfo extends NativeInfo implements JavaInfoApi<Artifact> JavaStrictCompilationArgsProvider.merge(javaStrictCompilationArgsProviders)) .addProvider( JavaSourceJarsProvider.class, JavaSourceJarsProvider.merge(javaSourceJarsProviders)) - // When a rule merges multiple JavaProviders, its purpose is to pass on information, so - // it doesn't have any output jars. - .addProvider(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder().build()) + .addProvider(JavaRuleOutputJarsProvider.class, + JavaRuleOutputJarsProvider.merge(javaRuleOutputJarsProviders)) .addProvider(JavaRunfilesProvider.class, new JavaRunfilesProvider(mergedRunfiles)) .addProvider( JavaPluginInfoProvider.class, JavaPluginInfoProvider.merge(javaPluginInfoProviders)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java index 5595651c83..d7aa8ea514 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skylarkbuildapi.java.JavaRuleOutputJarsProviderApi; import com.google.devtools.build.lib.skylarkbuildapi.java.OutputJarApi; import com.google.devtools.build.lib.syntax.SkylarkList; +import java.util.Collection; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -150,6 +151,15 @@ public final class JavaRuleOutputJarsProvider return new Builder(); } + public static JavaRuleOutputJarsProvider merge( + Collection<JavaRuleOutputJarsProvider> providers) { + Builder builder = new Builder(); + for (JavaRuleOutputJarsProvider provider : providers) { + builder.addOutputJars(provider.getOutputJars()); + } + return builder.build(); + } + /** * Builder for {@link JavaRuleOutputJarsProvider}. */ diff --git a/src/test/shell/bazel/bazel_java_test.sh b/src/test/shell/bazel/bazel_java_test.sh index 5daa75c7b8..7d0ad8c81d 100755 --- a/src/test/shell/bazel/bazel_java_test.sh +++ b/src/test/shell/bazel/bazel_java_test.sh @@ -1248,6 +1248,84 @@ EOF expect_log "Using type com.google.sandwich.C from an indirect dependency" } +function test_java_merge_outputs() { + mkdir -p java/com/google/sandwich + + cat > java/com/google/sandwich/BUILD << EOF +load(':java_custom_library.bzl', 'java_custom_library') + +java_custom_library( + name = "custom", + srcs = ["A.java"], + jar = "libb.jar" +) + +java_library( + name = "b", + srcs = ["B.java"] +) +EOF + + cat > java/com/google/sandwich/B.java << EOF +package com.google.sandwich; +class B { + public void printB() { + System.out.println("Message from B"); + } +} +EOF + + cat > java/com/google/sandwich/A.java << EOF +package com.google.sandwich; +class A { + public void printA() { + System.out.println("Message from A"); + } +} +EOF + + cat > java/com/google/sandwich/java_custom_library.bzl << EOF +def _impl(ctx): + compiled_jar = ctx.actions.declare_file("lib" + ctx.label.name + ".jar") + imported_jar = ctx.files.jar[0]; + + compilation_provider = java_common.compile( + ctx, + source_files = ctx.files.srcs, + output = compiled_jar, + java_toolchain = ctx.attr._java_toolchain, + host_javabase = ctx.attr._host_javabase + ) + + imported_provider = JavaInfo(output_jar = imported_jar, use_ijar=False); + + final_provider = java_common.merge([compilation_provider, imported_provider]) + + print(final_provider.outputs.jars[0].class_jar) + print(final_provider.outputs.jars[1].class_jar) + + return struct( + files = depset([compiled_jar, imported_jar]), + providers = [final_provider] + ) + +java_custom_library = rule( + implementation = _impl, + attrs = { + "srcs": attr.label_list(allow_files=True), + "jar": attr.label(allow_files=True), + "_java_toolchain": attr.label(default = Label("@bazel_tools//tools/jdk:toolchain")), + "_host_javabase": attr.label(default = Label("@bazel_tools//tools/jdk:current_host_java_runtime")) + }, + fragments = ["java"] +) +EOF + + bazel build java/com/google/sandwich:custom &> "$TEST_log" || fail "Java sandwich build failed" + expect_log "<generated file java/com/google/sandwich/libcustom.jar>" + expect_log "<generated file java/com/google/sandwich/libb.jar>" +} + function test_java_common_create_provider_with_ijar() { mkdir -p java/com/google/foo touch java/com/google/foo/{BUILD,A.java,my_rule.bzl} |