aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar elenairina <elenairina@google.com>2018-07-06 07:25:02 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-06 07:26:15 -0700
commit4ff32da2f79f36fbb1e608830835a31f39772b8a (patch)
treeccb5266d9b00bd50021485278c1adfda9ffb828f
parent5947f474e152f7b1f447ef9c9392cd632c1fdd81 (diff)
Merge outputs in java_common.merge.
RELNOTES: [JavaInfo] Outputs are merged in java_common.merge(). PiperOrigin-RevId: 203474741
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java10
-rwxr-xr-xsrc/test/shell/bazel/bazel_java_test.sh78
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}