diff options
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 } |