diff options
Diffstat (limited to 'src')
3 files changed, 74 insertions, 5 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 ee42606122..04ad9d27c7 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 @@ -611,6 +611,17 @@ public final class JavaInfo extends NativeInfo { + "<code>source_jar</code> are used. " + "<p>The host_javabase to be used for packing source files to Jar.</p>" ), + @Param( + name = "jdeps", + type = FileApi.class, + named = true, + defaultValue = "None", + noneable = true, + doc = "jdeps information for the rule output (if available). This should be a " + + "binary proto encoded using the deps.proto protobuf included with Bazel. " + + "If available this file is typically produced by a compiler. IDEs and other " + + "tools can use this information for more efficient processing." + ), }, selfCall = true, useLocation = true, @@ -635,6 +646,7 @@ public final class JavaInfo extends NativeInfo { Object useIjarApi, Object javaToolchainApi, Object hostJavabaseApi, + Object jdepsApi, Location loc, Environment env) throws EvalException { Artifact outputJar = (Artifact) outputJarApi; @@ -651,6 +663,7 @@ public final class JavaInfo extends NativeInfo { @Nullable Boolean useIjar = nullIfNone(useIjarApi, Boolean.class); @Nullable Object javaToolchain = nullIfNone(javaToolchainApi); @Nullable Object hostJavabase = nullIfNone(hostJavabaseApi); + @Nullable Artifact jdeps = nullIfNone(jdepsApi, Artifact.class); boolean hasLegacyArg = actions != null @@ -690,6 +703,7 @@ public final class JavaInfo extends NativeInfo { actions, javaToolchain, hostJavabase, + jdeps, loc); } if (compileJar == null) { @@ -700,7 +714,7 @@ public final class JavaInfo extends NativeInfo { outputJar, compileJar, sourceJar, neverlink, (SkylarkList<JavaInfo>) deps, (SkylarkList<JavaInfo>) runtimeDeps, - (SkylarkList<JavaInfo>) exports, loc); + (SkylarkList<JavaInfo>) exports, jdeps, loc); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java index a564df494c..e5c2cde4a3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java @@ -75,6 +75,7 @@ final class JavaInfoBuildHelper { * target="_top">java_library.exports</a> * @param actions used to create the ijar and single jar actions * @param javaToolchain the toolchain to be used for retrieving the ijar tool + * @param jdeps optional jdeps information for outputJar * @return new created JavaInfo instance * @throws EvalException if some mandatory parameter are missing */ @@ -91,6 +92,7 @@ final class JavaInfoBuildHelper { Object actions, Object javaToolchain, Object hostJavabase, + @Nullable Artifact jdeps, Location location) throws EvalException { final Artifact sourceJar; @@ -137,7 +139,15 @@ final class JavaInfoBuildHelper { } return createJavaInfo( - outputJar, iJar, sourceJar, neverlink, compileTimeDeps, runtimeDeps, exports, location); + outputJar, + iJar, + sourceJar, + neverlink, + compileTimeDeps, + runtimeDeps, + exports, + jdeps, + location); } /** @@ -154,6 +164,7 @@ final class JavaInfoBuildHelper { * @param exports libraries to make available for users of this library. <a * href="https://docs.bazel.build/versions/master/be/java.html#java_library" * target="_top">java_library.exports</a> + * @param jdeps optional jdeps information for outputJar * @return new created JavaInfo instance */ JavaInfo createJavaInfo( @@ -164,6 +175,7 @@ final class JavaInfoBuildHelper { SkylarkList<JavaInfo> compileTimeDeps, SkylarkList<JavaInfo> runtimeDeps, SkylarkList<JavaInfo> exports, + @Nullable Artifact jdeps, Location location) { compileJar = compileJar != null ? compileJar : outputJar; ImmutableList<Artifact> sourceJars = @@ -183,6 +195,7 @@ final class JavaInfoBuildHelper { JavaRuleOutputJarsProvider javaRuleOutputJarsProvider = JavaRuleOutputJarsProvider.builder() .addOutputJar(outputJar, compileJar, sourceJars) + .setJdeps(jdeps) .build(); javaInfoBuilder.addProvider(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProvider); diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java index 5c156c4797..944c7e9a4b 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java @@ -17,6 +17,7 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Streams; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.cmdline.Label; @@ -83,7 +84,7 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { @Test public void buildHelperCreateJavaInfoWithOutputJarAndUseIJar() throws Exception { - + ruleBuilder() .withIJar() .build(); @@ -205,7 +206,7 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { ruleBuilder() .withNeverLink() .build(); - + scratch.file( "foo/BUILD", "load(':extension.bzl', 'my_rule')", @@ -660,6 +661,44 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { } @Test + public void buildHelperCreateJavaInfoWithJdeps_javaRuleOutputJarsProvider() throws Exception { + ruleBuilder().build(); + scratch.file( + "foo/BUILD", + "load(':extension.bzl', 'my_rule')", + "java_library(name = 'my_java_lib_direct', srcs = ['java/A.java'])", + "my_rule(", + " name = 'my_skylark_rule',", + " output_jar = 'my_skylark_rule_lib.jar',", + " source_jars = ['my_skylark_rule_src.jar'],", + " dep = [':my_java_lib_direct'],", + " jdeps = 'my_jdeps.pb',", + ")"); + assertNoEvents(); + + JavaRuleOutputJarsProvider ruleOutputs = + fetchJavaInfo().getProvider(JavaRuleOutputJarsProvider.class); + + assertThat( + prettyArtifactNames( + ruleOutputs + .getOutputJars() + .stream() + .map(o -> o.getClassJar()) + .collect(ImmutableList.toImmutableList()))) + .containsExactly("foo/my_skylark_rule_lib.jar"); + assertThat( + prettyArtifactNames( + ruleOutputs + .getOutputJars() + .stream() + .flatMap(o -> Streams.stream(o.getSrcJars())) + .collect(ImmutableList.toImmutableList()))) + .containsExactly("foo/my_skylark_rule_src.jar"); + assertThat(ruleOutputs.getJdeps().prettyPrint()).isEqualTo("foo/my_jdeps.pb"); + } + + @Test public void testMixMatchNewAndLegacyArgsIsError() throws Exception { ImmutableList.Builder<String> lines = ImmutableList.builder(); lines.add( @@ -753,6 +792,7 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { " deps = dp,", " runtime_deps = dp_runtime,", " exports = dp_exports,", + " jdeps = ctx.file.jdeps,", useIJar || sourceFiles ? " actions = ctx.actions," : "", useIJar || sourceFiles ? " java_toolchain = ctx.attr._toolchain," : "", sourceFiles ? " host_javabase = ctx.attr._host_javabase," : "", @@ -801,13 +841,14 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { } lines.add( " javaInfo = JavaInfo(", - " output_jar = ctx.outputs.output_jar, ", + " output_jar = ctx.outputs.output_jar,", " compile_jar = compile_jar,", " source_jar = source_jar,", neverLink ? " neverlink = True," : "", " deps = dp,", " runtime_deps = dp_runtime,", " exports = dp_exports,", + " jdeps = ctx.file.jdeps,", " )", " return [result(property = javaInfo)]"); return lines.build().toArray(new String[] {}); @@ -837,6 +878,7 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { " 'output_jar' : attr.output(default=None, mandatory=True),", " 'source_jars' : attr.label_list(allow_files=['.jar']),", " 'sources' : attr.label_list(allow_files=['.java']),", + " 'jdeps' : attr.label(allow_single_file=True),", useIJar || stampJar || sourceFiles ? " '_toolchain': attr.label(default = Label('//java/com/google/test:toolchain'))," : "", |