aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xscripts/bootstrap/compile.sh2
-rw-r--r--src/create_embedded_tools.py4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java125
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java417
-rwxr-xr-xsrc/test/shell/testenv.sh4
6 files changed, 346 insertions, 214 deletions
diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh
index 3fbd6333a8..c7b26ccc72 100755
--- a/scripts/bootstrap/compile.sh
+++ b/scripts/bootstrap/compile.sh
@@ -17,7 +17,7 @@
# Script for building bazel from scratch without bazel
PROTO_FILES=$(ls src/main/protobuf/*.proto src/main/java/com/google/devtools/build/lib/buildeventstream/proto/*.proto)
-LIBRARY_JARS=$(find third_party -name '*.jar' | grep -Fv JavaBuilder | grep -Fv third_party/guava | grep -Fv third_party/guava | grep -ve 'third_party/grpc/grpc.*jar' | tr "\n" " ")
+LIBRARY_JARS=$(find third_party -name '*.jar' | grep -Fv /javac-9-dev-r3297-4.jar | grep -Fv /javac-9-dev-4023-3.jar | grep -Fv /javac7.jar | grep -Fv JavaBuilder | grep -Fv third_party/guava | grep -Fv third_party/guava | grep -ve 'third_party/grpc/grpc.*jar' | tr "\n" " ")
GRPC_JAVA_VERSION=1.7.0
GRPC_LIBRARY_JARS=$(find third_party/grpc -name '*.jar' | grep -e ".*${GRPC_JAVA_VERSION}.*jar" | tr "\n" " ")
GUAVA_VERSION=23.1
diff --git a/src/create_embedded_tools.py b/src/create_embedded_tools.py
index 352069c411..17d747fafc 100644
--- a/src/create_embedded_tools.py
+++ b/src/create_embedded_tools.py
@@ -35,8 +35,8 @@ output_paths = [
('*JacocoCoverage*_deploy.jar',
lambda x: 'tools/jdk/JacocoCoverage_deploy.jar'),
('*turbine_deploy.jar', lambda x: 'tools/jdk/turbine_deploy.jar'),
- ('*javac-9+181-r4173-1.jar',
- lambda x: 'third_party/java/jdk/langtools/javac-9+181-r4173-1.jar'),
+ ('*javac-9-dev-r4023-3.jar',
+ lambda x: 'third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar'),
('*SingleJar_deploy.jar',
lambda x: 'tools/jdk/singlejar/SingleJar_deploy.jar'),
('*GenClass_deploy.jar', lambda x: 'tools/jdk/GenClass_deploy.jar'),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
index d93f4dba1e..34b0ddb17c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
@@ -15,13 +15,14 @@
package com.google.devtools.build.lib.rules.java;
import com.google.auto.value.AutoValue;
+import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import java.util.List;
+import java.util.Collection;
/**
* An interface for objects that provide information on how to include them in
@@ -87,9 +88,10 @@ public abstract class JavaCompilationArgsProvider implements TransitiveInfoProvi
*/
public abstract NestedSet<Artifact> getRunTimeJavaDependencyArtifacts();
- public static JavaCompilationArgsProvider merge(List<JavaCompilationArgsProvider> providers) {
+ public static JavaCompilationArgsProvider merge(
+ Collection<JavaCompilationArgsProvider> providers) {
if (providers.size() == 1) {
- return providers.get(0);
+ return Iterables.get(providers, 0);
}
JavaCompilationArgs.Builder javaCompilationArgs = JavaCompilationArgs.builder();
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 38c25b1c18..3abd390817 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
@@ -13,22 +13,25 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.java;
+import static com.google.common.collect.Iterables.concat;
import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.BOTH;
import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.COMPILE_ONLY;
import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.RUNTIME_ONLY;
+import static java.util.stream.Stream.concat;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.Runfiles;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.analysis.skylark.SkylarkActionFactory;
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
+import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -39,6 +42,9 @@ import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkType;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
import javax.annotation.Nullable;
/** Implements logic for creating JavaInfo from different set of input parameters. */
@@ -71,7 +77,7 @@ final class JavaInfoBuildHelper {
* @return new created JavaInfo instance
* @throws EvalException if some mandatory parameter are missing
*/
- // TODO(b/69780248) only populates JavaInfo with JavaCompilationArgsProvider. See #3769
+ // TODO(b/69780248): only populates JavaInfo with JavaCompilationArgsProvider. See #3769
public JavaInfo createJavaInfo(
Artifact outputJar,
SkylarkList<Artifact> sourceFiles,
@@ -80,7 +86,7 @@ final class JavaInfoBuildHelper {
Boolean neverlink,
SkylarkList<JavaInfo> compileTimeDeps,
SkylarkList<JavaInfo> runtimeDeps,
- SkylarkList<JavaInfo> exports, // TODO(b/69780248) handle exports. See #3769
+ SkylarkList<JavaInfo> exports, // TODO(b/69780248): handle exports. See #3769
Object action,
Object javaToolchain,
Location location)
@@ -108,44 +114,90 @@ final class JavaInfoBuildHelper {
JavaCompilationArgs.Builder recursiveJavaCompilationArgsBuilder =
JavaCompilationArgs.Builder.copyOf(javaCompilationArgsBuilder);
-
ClasspathType type = neverlink ? COMPILE_ONLY : BOTH;
- recursiveJavaCompilationArgsBuilder.addTransitiveArgs(
- fetchAggregatedRecursiveJavaCompilationArgsFromProvider(compileTimeDeps), type);
- recursiveJavaCompilationArgsBuilder.addTransitiveArgs(
- fetchAggregatedRecursiveJavaCompilationArgsFromProvider(runtimeDeps), RUNTIME_ONLY);
+ fetchProviders(exports, JavaCompilationArgsProvider.class)
+ .map(JavaCompilationArgsProvider::getJavaCompilationArgs)
+ .forEach(args->javaCompilationArgsBuilder.addTransitiveArgs(args, type));
+
+ fetchProviders(concat(exports, compileTimeDeps), JavaCompilationArgsProvider.class)
+ .map(JavaCompilationArgsProvider::getRecursiveJavaCompilationArgs)
+ .forEach(args->recursiveJavaCompilationArgsBuilder.addTransitiveArgs(args, type));
- javaInfoBuilder.addProvider(
- JavaCompilationArgsProvider.class,
+ fetchProviders(runtimeDeps, JavaCompilationArgsProvider.class)
+ .map(JavaCompilationArgsProvider::getRecursiveJavaCompilationArgs)
+ .forEach(args->recursiveJavaCompilationArgsBuilder.addTransitiveArgs(args, RUNTIME_ONLY));
+
+ javaInfoBuilder.addProvider(JavaCompilationArgsProvider.class,
JavaCompilationArgsProvider.create(
javaCompilationArgsBuilder.build(), recursiveJavaCompilationArgsBuilder.build()));
+ javaInfoBuilder.addProvider(JavaExportsProvider.class, createJavaExportsProvider(exports));
+
+ javaInfoBuilder.addProvider(JavaSourceJarsProvider.class,
+ createJavaSourceJarsProvider(sourceJars, concat(compileTimeDeps, runtimeDeps, exports)));
+
+ // TODO(b/69780248): add other providers. See #3769
+
+ return javaInfoBuilder.build();
+ }
+
+ private JavaSourceJarsProvider createJavaSourceJarsProvider(
+ Iterable<Artifact> sourceJars, Iterable<JavaInfo> transitiveDeps) {
NestedSetBuilder<Artifact> transitiveSourceJars = NestedSetBuilder.stableOrder();
+
transitiveSourceJars.addAll(sourceJars);
- addSourceJars(transitiveSourceJars, Iterables.concat(compileTimeDeps, runtimeDeps));
- javaInfoBuilder.addProvider(
- JavaSourceJarsProvider.class,
- JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars));
+ fetchSourceJars(transitiveDeps)
+ .forEach(transitiveSourceJars::addTransitive);
- // TODO(b/69780248) add other providers. See #3769
+ return JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars);
+ }
- return javaInfoBuilder.build();
+ private Iterable<NestedSet<Artifact>> fetchSourceJars(Iterable<JavaInfo> javaInfos) {
+ Stream<NestedSet<Artifact>> sourceJars =
+ fetchProviders(javaInfos, JavaSourceJarsProvider.class)
+ .map(JavaSourceJarsProvider::getSourceJars)
+ .map(sourceJarsList -> NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJarsList));
+
+ Stream<NestedSet<Artifact>> transitiveSourceJars =
+ fetchProviders(javaInfos, JavaSourceJarsProvider.class)
+ .map(JavaSourceJarsProvider::getTransitiveSourceJars);
+
+ return concat(sourceJars, transitiveSourceJars)::iterator;
+ }
+
+ /**
+ * Returns Stream of not null Providers.
+ *
+ * Gets Stream from dependencies, transforms to Provider defined by providerClass param
+ * and filters nulls.
+ *
+ * @see JavaInfo#merge(List)
+ */
+ private <P extends TransitiveInfoProvider>Stream<P> fetchProviders(Iterable<JavaInfo> javaInfos,
+ Class<P> providerClass){
+ return StreamSupport.stream(javaInfos.spliterator(), /*parallel=*/ false)
+ .map(javaInfo -> javaInfo.getProvider(providerClass))
+ .filter(Objects::nonNull);
}
+ private JavaExportsProvider createJavaExportsProvider(Iterable<JavaInfo> javaInfos) {
+ NestedSet<Label> exportsNestedSet = fetchExports(javaInfos);
+
+ // TODO(b/69780248): I need to add javaInfos there too. See #3769
+ // The problem is JavaInfo can not be converted to Label.
+ return new JavaExportsProvider(exportsNestedSet);
+ }
- private void addSourceJars(NestedSetBuilder<Artifact> builder, Iterable<JavaInfo> javaInfos){
- List<JavaSourceJarsProvider> javaSourceJarsProviders =
- JavaInfo.getProvidersFromListOfJavaProviders(JavaSourceJarsProvider.class, javaInfos);
+ private NestedSet<Label> fetchExports(Iterable<JavaInfo> javaInfos){
+ NestedSetBuilder<Label> builder = NestedSetBuilder.stableOrder();
- for (JavaSourceJarsProvider sourceJarsProvider : javaSourceJarsProviders) {
- builder.addTransitive(sourceJarsProvider.getTransitiveSourceJars());
+ fetchProviders(javaInfos, JavaExportsProvider.class)
+ .map(JavaExportsProvider::getTransitiveExports)
+ .forEach(builder::addTransitive);
- NestedSet<Artifact> directSrc = NestedSetBuilder.<Artifact>stableOrder()
- .addAll(sourceJarsProvider.getSourceJars()).build();
- builder.addTransitive(directSrc);
- }
+ return builder.build();
}
public JavaInfo create(
@@ -282,7 +334,7 @@ final class JavaInfoBuildHelper {
JavaPluginInfoProvider transitivePluginsProvider =
JavaPluginInfoProvider.merge(
- Iterables.concat(
+ concat(
JavaInfo.getProvidersFromListOfJavaProviders(
JavaPluginInfoProvider.class, exportedPlugins),
JavaInfo.getProvidersFromListOfJavaProviders(
@@ -364,27 +416,6 @@ final class JavaInfoBuildHelper {
return javaToolchainProvider;
}
-
- /**
- * Merge collection of JavaInfos to one. Gets CompilationArgsProvider and call
- * getRecursiveJavaCompilationArgs on it and return.
- *
- * @see JavaInfo#merge(List)
- */
- private JavaCompilationArgs fetchAggregatedRecursiveJavaCompilationArgsFromProvider(
- SkylarkList<JavaInfo> dependencies) {
-
- JavaInfo aggregatedDependencies = JavaInfo.merge(dependencies);
- JavaCompilationArgsProvider compilationArgsProvider =
- aggregatedDependencies.getProvider(JavaCompilationArgsProvider.class);
- if (compilationArgsProvider == null) {
- // this should not happen: JavaInfo.merge() always creates JavaCompilationArgsProvider
- throw new IllegalStateException(
- "compilationArgsProvider is null. check JavaInfo.merge implementation.");
- }
- return compilationArgsProvider.getRecursiveJavaCompilationArgs();
- }
-
private static StrictDepsMode getStrictDepsMode(String strictDepsMode) {
switch (strictDepsMode) {
case "OFF":
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index 68b36082e9..f617ba8c1f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.vfs.PathFragment;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -1489,23 +1490,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void javaInfoBuildHelperCreateJavaInfoWithOutputJarOnly() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar, ",
- " use_ijar = False",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label(), ",
- " 'output_jar' : attr.label(allow_single_file=True)",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1531,9 +1516,6 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
.containsExactly("foo/my_skylark_rule_lib.jar");
-
-
-
assertThat(
prettyJarNames(
javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
@@ -1544,8 +1526,6 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
.getRecursiveJavaCompilationArgs()
.getFullCompileTimeJars()))
.containsExactly("foo/my_skylark_rule_lib.jar");
-
-
assertThat(
prettyJarNames(
javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
@@ -1617,25 +1597,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void javaInfoBuildHelperCreateJavaInfoWithDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1679,32 +1641,14 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void javaInfoBuildHelperCreateJavaInfoWithRunTimeDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " runtime_deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
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',",
- " dep = [':my_java_lib_direct']",
+ " dep_runtime = [':my_java_lib_direct']",
")");
assertNoEvents();
@@ -1804,32 +1748,12 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testJavaInfoJavaSourceJarsProviderWithSourceJars() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " source_jars = ctx.files.source_jars",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " 'source_jars' : attr.label_list(allow_files=['.jar']),",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
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',",
- " dep = [':my_java_lib_direct'],",
" source_jars = ['my_skylark_rule_src.jar']",
")");
assertNoEvents();
@@ -1846,25 +1770,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testJavaInfoJavaSourceJarsProviderWithDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1886,32 +1792,14 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testJavaInfoJavaSourceJarsProviderAndRuntimeDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " runtime_deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
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',",
- " dep = [':my_java_lib_direct']",
+ " dep_runtime = [':my_java_lib_direct']",
")");
assertNoEvents();
@@ -1926,25 +1814,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testCreateJavaInfoWithJavaSourceJarsProviderAndTransitiveDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1971,25 +1841,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testCreateJavaInfoWithJavaSourceJarsProviderAndTransitiveRuntimeDeps()
throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " runtime_deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -2013,6 +1865,253 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
"foo/libmy_java_lib_direct-src.jar", "foo/libmy_java_lib_transitive-src.jar");
}
+ /**
+ * Tests that JavaExportsProvider is empty by default.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportIsEmpty() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ ")");
+ assertNoEvents();
+
+ JavaExportsProvider exportsProvider = fetchJavaInfo().getProvider(JavaExportsProvider.class);
+
+ assertThat(exportsProvider.getTransitiveExports()).isEmpty();
+ }
+
+ /**
+ * Test exports adds dependencies to JavaCompilationArgsProvider.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportProviderExportsDepsAdded() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'my_java_lib_exports', srcs = ['java/A.java'])",
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ " dep_exports = [':my_java_lib_exports']",
+ ")");
+ assertNoEvents();
+
+ JavaInfo javaInfo = fetchJavaInfo();
+
+ JavaExportsProvider exportsProvider = javaInfo.getProvider(JavaExportsProvider.class);
+
+ assertThat(exportsProvider.getTransitiveExports()).isEmpty();
+
+ JavaCompilationArgsProvider javaCompilationArgsProvider =
+ javaInfo.getProvider(JavaCompilationArgsProvider.class);
+
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports-hjar.jar");
+
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider
+ .getRecursiveJavaCompilationArgs()
+ .getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar",
+ "foo/libmy_java_lib_exports-hjar.jar");
+ }
+
+ /**
+ * Test exports adds itself and recursive dependencies to JavaCompilationArgsProvider
+ * and JavaExportsProvider populated.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportProvider() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'my_java_lib_c', srcs = ['java/C.java'])",
+ "java_library(name = 'my_java_lib_b', srcs = ['java/B.java'])",
+ "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'],",
+ " deps = [':my_java_lib_b', ':my_java_lib_c'],",
+ " exports = [':my_java_lib_b']",
+ " )",
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ " dep_exports = [':my_java_lib_a']",
+ ")");
+ assertNoEvents();
+
+ JavaInfo javaInfo = fetchJavaInfo();
+
+ JavaExportsProvider exportsProvider = javaInfo.getProvider(JavaExportsProvider.class);
+
+ assertThat(
+ exportsProvider.getTransitiveExports())
+ .containsExactly(Label.parseAbsolute("//foo:my_java_lib_b"));
+
+ JavaCompilationArgsProvider javaCompilationArgsProvider =
+ javaInfo.getProvider(JavaCompilationArgsProvider.class);
+
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar");
+
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar",
+ "foo/libmy_java_lib_a.jar", "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar");
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider
+ .getRecursiveJavaCompilationArgs()
+ .getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar",
+ "foo/libmy_java_lib_a.jar", "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar", "foo/libmy_java_lib_c-hjar.jar");
+ }
+
+
+ /**
+ * Tests case:
+ * my_lib
+ * // \
+ * a c
+ * // \\
+ * b d
+ *
+ * where single line is normal dependency and double is exports dependency.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportProvider001() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'my_java_lib_b', srcs = ['java/B.java'])",
+ "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'],",
+ " deps = [':my_java_lib_b'],",
+ " exports = [':my_java_lib_b']",
+ " )",
+ "java_library(name = 'my_java_lib_d', srcs = ['java/D.java'])",
+ "java_library(name = 'my_java_lib_c', srcs = ['java/C.java'],",
+ " deps = [':my_java_lib_d'],",
+ " exports = [':my_java_lib_d']",
+ " )",
+
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ " dep = [':my_java_lib_a', ':my_java_lib_c'],",
+ " dep_exports = [':my_java_lib_a']",
+ ")");
+ assertNoEvents();
+
+ JavaInfo javaInfo = fetchJavaInfo();
+
+ JavaExportsProvider exportsProvider = javaInfo.getProvider(JavaExportsProvider.class);
+
+ assertThat(
+ exportsProvider.getTransitiveExports())
+ .containsExactly(Label.parseAbsolute("//foo:my_java_lib_b"));
+
+ JavaCompilationArgsProvider javaCompilationArgsProvider =
+ javaInfo.getProvider(JavaCompilationArgsProvider.class);
+
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar");
+
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar", "foo/libmy_java_lib_d.jar");
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider
+ .getRecursiveJavaCompilationArgs()
+ .getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar", "foo/libmy_java_lib_d.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar", "foo/libmy_java_lib_c-hjar.jar",
+ "foo/libmy_java_lib_d-hjar.jar");
+ }
+
+ private void defineMyRuleWithJavaInfo() throws IOException {
+ scratch.file(
+ "foo/extension.bzl",
+ "result = provider()",
+ "def _impl(ctx):",
+ " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
+ " dp_runtime = [dep[java_common.provider] for dep in ctx.attr.dep_runtime]",
+ " dp_exports = [dep[java_common.provider] for dep in ctx.attr.dep_exports]",
+ " javaInfo = JavaInfo(",
+ " output_jar = ctx.file.output_jar, ",
+ " use_ijar = False,",
+ " source_jars = ctx.files.source_jars,",
+ " deps = dp,",
+ " runtime_deps = dp_runtime,",
+ " exports = dp_exports,",
+ " )",
+ " return [result(property = javaInfo)]",
+ "my_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " 'dep' : attr.label_list(),",
+ " 'dep_runtime' : attr.label_list(),",
+ " 'dep_exports' : attr.label_list(),",
+ " 'output_jar' : attr.label(allow_single_file=True),",
+ " 'source_jars' : attr.label_list(allow_files=['.jar'])",
+ " }",
+ ")");
+ }
+
private JavaInfo fetchJavaInfo() throws LabelSyntaxException {
ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:my_skylark_rule");
Info info =
diff --git a/src/test/shell/testenv.sh b/src/test/shell/testenv.sh
index e0bca651c3..b8bc2e02b7 100755
--- a/src/test/shell/testenv.sh
+++ b/src/test/shell/testenv.sh
@@ -413,8 +413,8 @@ function create_new_workspace() {
copy_tools_directory
- [ -e third_party/java/jdk/langtools/javac-9+181-r4173-1.jar ] \
- || ln -s "${langtools_path}" third_party/java/jdk/langtools/javac-9+181-r4173-1.jar
+ [ -e third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar ] \
+ || ln -s "${langtools_path}" third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar
touch WORKSPACE
}