diff options
author | Carmi Grushko <carmi@google.com> | 2016-11-07 21:29:25 +0000 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2016-11-08 09:15:33 +0000 |
commit | b36aefbfbc6ba87e2cb1469e919d13b68730c17d (patch) | |
tree | 169bc8dbc206e774e705096252ddc318b474d962 /src/main/java | |
parent | 71ef85cff53aaa12ee3feb2b2fbc49c0d87fbab0 (diff) |
Rollback of commit b043fafb957ae8038088e427ff27a5c9f951c979.
*** Reason for rollback ***
Use proto_lang_toolchain() in java_proto_library, after fixing breakage.
Verified on Jenkins, http://ci.bazel.io/job/Gerrit-bazel-tests/169/
*** Original change description ***
Automated [] rollback of commit a396b070ae36032a973672e11145533621c39edc.
*** Reason for rollback ***
Breaks tests on latest, as proto_lang_toolchain didn't make it into the 0.4.0 release
see http://ci.bazel.io/job/bazel-tests/306/BAZEL_VERSION=latest,PLATFORM_NAME=linux-x86_64/console
*** Original change description ***
Use proto_lang_toolchain() in java_proto_library.
--
MOS_MIGRATED_REVID=138432193
Diffstat (limited to 'src/main/java')
5 files changed, 149 insertions, 21 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 62b0cdb913..a7a0fe5850 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -813,6 +813,7 @@ java_library( srcs = ["rules/java/proto/RpcSupport.java"], deps = [ ":build-base", + ":collect", ":java-compilation", ":packages-internal", ":proto-rules", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoAspect.java index ab062dd254..8dd2ae2e07 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoAspect.java @@ -14,15 +14,21 @@ package com.google.devtools.build.lib.bazel.rules.java.proto; +import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER; + +import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.bazel.rules.java.BazelJavaSemantics; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; import com.google.devtools.build.lib.rules.java.JavaLibraryHelper; import com.google.devtools.build.lib.rules.java.proto.JavaProtoAspect; import com.google.devtools.build.lib.rules.java.proto.RpcSupport; import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder; +import java.util.List; /** An Aspect which BazelJavaProtoLibrary injects to build Java SPEED protos. */ public class BazelJavaProtoAspect extends JavaProtoAspect { @@ -37,8 +43,24 @@ public class BazelJavaProtoAspect extends JavaProtoAspect { private static class NoopRpcSupport implements RpcSupport { @Override - public void mutateProtoCompileAction( - RuleContext ruleContext, Artifact sourceJar, ProtoCompileActionBuilder actionBuilder) { + public List<ProtoCompileActionBuilder.ToolchainInvocation> getToolchainInvocation( + RuleContext ruleContext, Artifact sourceJar) { + return ImmutableList.of(); + } + + @Override + public boolean allowServices(RuleContext ruleContext) { + return true; + } + + @Override + public NestedSet<Artifact> getBlacklist(RuleContext ruleContext) { + return NestedSetBuilder.emptySet(STABLE_ORDER); + } + + @Override + public void mutateProtoCompileAction(RuleContext ruleContext, Artifact sourceJar, + ProtoCompileActionBuilder actionBuilder) { // Intentionally left empty. } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java index ba6184eb61..02308f7391 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -54,7 +55,9 @@ import com.google.devtools.build.lib.rules.java.JavaLibraryHelper; import com.google.devtools.build.lib.rules.java.JavaSemantics; import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider; import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder; +import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.ToolchainInvocation; import com.google.devtools.build.lib.rules.proto.ProtoConfiguration; +import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider; import com.google.devtools.build.lib.rules.proto.ProtoSourceFileBlacklist; import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import com.google.devtools.build.lib.rules.proto.ProtoSupportDataProvider; @@ -65,6 +68,8 @@ import javax.annotation.Nullable; /** An Aspect which JavaProtoLibrary injects to build Java SPEED protos. */ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspectFactory { + private static final String SPEED_PROTO_TOOLCHAIN_ATTR = ":aspect_java_proto_toolchain"; + private static final String SPEED_PROTO_RUNTIME_ATTR = "$aspect_java_lib"; private static final String SPEED_PROTO_RUNTIME_LABEL = "//external:protobuf/java_runtime"; @@ -91,6 +96,15 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe } }; + private static final Attribute.LateBoundLabel<BuildConfiguration> SPEED_PROTO_TOOLCHAIN_LABEL = + new Attribute.LateBoundLabel<BuildConfiguration>( + "//tools/proto/toolchains:java", ProtoConfiguration.class) { + @Override + public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) { + return configuration.getFragment(ProtoConfiguration.class).protoToolchainForJava(); + } + }; + private final JavaSemantics javaSemantics; @Nullable private final String jacocoLabel; @@ -128,7 +142,8 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe .getFragment(ProtoConfiguration.class, ConfigurationTransition.HOST) .protoCompilerJavaFlags(), javaSemantics, - rpcSupport) + rpcSupport, + ruleContext.getFragment(ProtoConfiguration.class).useToolchainForJavaProto()) .createProviders()); return aspect.build(); @@ -149,6 +164,12 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe attr(PROTO_SOURCE_FILE_BLACKLIST_ATTR, LABEL_LIST) .cfg(HOST) .value(BLACKLISTED_PROTOS)) + .add( + attr(SPEED_PROTO_TOOLCHAIN_ATTR, LABEL) + // TODO(carmi): reinstate mandatoryNativeProviders(ProtoLangToolchainProvider) + // once it's in a Bazel release. + .legacyAllowAnyFileType() + .value(SPEED_PROTO_TOOLCHAIN_LABEL)) .add(attr(":host_jdk", LABEL).cfg(HOST).value(JavaSemantics.HOST_JDK)) .add( attr(":java_toolchain", LABEL) @@ -179,18 +200,21 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe */ private final JavaCompilationArgsProvider dependencyCompilationArgs; private final String protoCompilerPluginOptions; + private final boolean useToolchainForJavaProto; Impl( final RuleContext ruleContext, final SupportData supportData, String protoCompilerPluginOptions, JavaSemantics javaSemantics, - RpcSupport rpcSupport) { + RpcSupport rpcSupport, + boolean useToolchainForJavaProto) { this.ruleContext = ruleContext; this.supportData = supportData; this.protoCompilerPluginOptions = protoCompilerPluginOptions; this.javaSemantics = javaSemantics; this.rpcSupport = rpcSupport; + this.useToolchainForJavaProto = useToolchainForJavaProto; dependencyCompilationArgs = JavaCompilationArgsProvider.merge( @@ -250,24 +274,49 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe return false; } - ProtoSourceFileBlacklist protoBlackList = - new ProtoSourceFileBlacklist( - ruleContext, - ruleContext - .getPrerequisiteArtifacts(PROTO_SOURCE_FILE_BLACKLIST_ATTR, Mode.HOST) - .list()); + final ProtoSourceFileBlacklist protoBlackList; + if (useToolchainForJavaProto) { + NestedSetBuilder<Artifact> blacklistedProtos = NestedSetBuilder.stableOrder(); + blacklistedProtos.addTransitive(getProtoToolchainProvider().blacklistedProtos()); + blacklistedProtos.addTransitive(rpcSupport.getBlacklist(ruleContext)); + + protoBlackList = new ProtoSourceFileBlacklist(ruleContext, blacklistedProtos.build()); + } else { + protoBlackList = + new ProtoSourceFileBlacklist( + ruleContext, + ruleContext + .getPrerequisiteArtifacts(PROTO_SOURCE_FILE_BLACKLIST_ATTR, Mode.HOST) + .list()); + } + return protoBlackList.checkSrcs(supportData.getDirectProtoSources(), "java_proto_library"); } private void createProtoCompileAction(Artifact sourceJar) { - ProtoCompileActionBuilder actionBuilder = - new ProtoCompileActionBuilder( - ruleContext, supportData, "Java", "java", ImmutableList.of(sourceJar)) - .allowServices(true) - .setLangParameter( - String.format(protoCompilerPluginOptions, sourceJar.getExecPathString())); - rpcSupport.mutateProtoCompileAction(ruleContext, sourceJar, actionBuilder); - ruleContext.registerAction(actionBuilder.build()); + if (useToolchainForJavaProto) { + ImmutableList.Builder<ToolchainInvocation> invocations = ImmutableList.builder(); + invocations.add( + new ToolchainInvocation( + "java", checkNotNull(getProtoToolchainProvider()), sourceJar.getExecPathString())); + invocations.addAll(rpcSupport.getToolchainInvocation(ruleContext, sourceJar)); + ProtoCompileActionBuilder.registerActions( + ruleContext, + invocations.build(), + supportData, + ImmutableList.of(sourceJar), + "Java (Immutable)", + rpcSupport.allowServices(ruleContext)); + } else { + ProtoCompileActionBuilder actionBuilder = + new ProtoCompileActionBuilder( + ruleContext, supportData, "Java", "java", ImmutableList.of(sourceJar)) + .allowServices(true) + .setLangParameter( + String.format(protoCompilerPluginOptions, sourceJar.getExecPathString())); + rpcSupport.mutateProtoCompileAction(ruleContext, sourceJar, actionBuilder); + ruleContext.registerAction(actionBuilder.build()); + } } private JavaCompilationArgsProvider createJavaCompileAction( @@ -279,15 +328,28 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe .setJavacOpts(ProtoJavacOpts.constructJavacOpts(ruleContext)); helper .addDep(dependencyCompilationArgs) - .addDep( - ruleContext.getPrerequisite( - SPEED_PROTO_RUNTIME_ATTR, Mode.TARGET, JavaCompilationArgsProvider.class)) .setCompilationStrictDepsMode(StrictDepsMode.OFF); + if (useToolchainForJavaProto) { + TransitiveInfoCollection runtime = getProtoToolchainProvider().runtime(); + if (runtime != null) { + helper.addDep(runtime.getProvider(JavaCompilationArgsProvider.class)); + } + } else { + helper.addDep( + ruleContext.getPrerequisite( + SPEED_PROTO_RUNTIME_ATTR, Mode.TARGET, JavaCompilationArgsProvider.class)); + } + rpcSupport.mutateJavaCompileAction(ruleContext, helper); return helper.buildCompilationArgsProvider( helper.build(javaSemantics), true /* isReportedAsStrict */); } + private ProtoLangToolchainProvider getProtoToolchainProvider() { + return ruleContext.getPrerequisite( + SPEED_PROTO_TOOLCHAIN_ATTR, TARGET, ProtoLangToolchainProvider.class); + } + private Artifact getSourceJarArtifact() { return ruleContext.getGenfilesArtifact(ruleContext.getLabel().getName() + "-speed-src.jar"); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/RpcSupport.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/RpcSupport.java index 0840311155..44a1c06579 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/RpcSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/RpcSupport.java @@ -16,15 +16,24 @@ package com.google.devtools.build.lib.rules.java.proto; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; import com.google.devtools.build.lib.rules.java.JavaLibraryHelper; import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder; +import java.util.List; /** * Used by java_proto_library to support Google-specific features. */ public interface RpcSupport { + List<ProtoCompileActionBuilder.ToolchainInvocation> getToolchainInvocation( + RuleContext ruleContext, Artifact sourceJar); + + boolean allowServices(RuleContext ruleContext); + + NestedSet<Artifact> getBlacklist(RuleContext ruleContext); + void mutateProtoCompileAction( RuleContext ruleContext, Artifact sourceJar, ProtoCompileActionBuilder actionBuilder); diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java index 8f0cab912d..39be8302b6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java @@ -122,6 +122,26 @@ public class ProtoConfiguration extends Fragment { ) public Label protoToolchainForJavaLite; + @Option( + name = "proto_toolchain_for_java", + defaultValue = "//tools/proto/toolchains:java", + category = "flags", + converter = BuildConfiguration.EmptyToNullLabelConverter.class, + help = "Label of proto_lang_toolchain() which describes how to compile Java protos" + ) + public Label protoToolchainForJava; + + @Option( + name = "use_toolchain_for_java_proto", + defaultValue = "false", + category = "experimental", + help = + "If true, --proto_toolchain_for_java will be used for java_proto_library. " + + "This flag is an escape-hatch and should be removed once toolchain-based builds " + + "are tested." + ) + public boolean useToolchainForJavaProto; + @Override public FragmentOptions getHost(boolean fallback) { Options host = (Options) super.getHost(fallback); @@ -133,7 +153,9 @@ public class ProtoConfiguration extends Fragment { host.protoCompilerJavaBlacklistedProtos = protoCompilerJavaBlacklistedProtos; host.protoCompilerJavaLiteFlags = protoCompilerJavaLiteFlags; host.protoCompilerJavaLitePlugin = protoCompilerJavaLitePlugin; + host.protoToolchainForJava = protoToolchainForJava; host.protoToolchainForJavaLite = protoToolchainForJavaLite; + host.useToolchainForJavaProto = useToolchainForJavaProto; return host; } } @@ -166,7 +188,9 @@ public class ProtoConfiguration extends Fragment { private final List<Label> protoCompilerJavaBlacklistedProtos; private final String protoCompilerJavaLiteFlags; private final Label protoCompilerJavaLitePlugin; + private final Label protoToolchainForJava; private final Label protoToolchainForJavaLite; + private final boolean useToolchainForJavaProto; public ProtoConfiguration(Options options) { this.experimentalProtoExtraActions = options.experimentalProtoExtraActions; @@ -176,7 +200,9 @@ public class ProtoConfiguration extends Fragment { this.protoCompilerJavaLiteFlags = options.protoCompilerJavaLiteFlags; this.protoCompilerJavaLitePlugin = options.protoCompilerJavaLitePlugin; this.protoCompilerJavaBlacklistedProtos = options.protoCompilerJavaBlacklistedProtos; + this.protoToolchainForJava = options.protoToolchainForJava; this.protoToolchainForJavaLite = options.protoToolchainForJavaLite; + this.useToolchainForJavaProto = options.useToolchainForJavaProto; } public ImmutableList<String> protocOpts() { @@ -212,7 +238,15 @@ public class ProtoConfiguration extends Fragment { return protoCompilerJavaBlacklistedProtos; } + public Label protoToolchainForJava() { + return protoToolchainForJava; + } + public Label protoToolchainForJavaLite() { return protoToolchainForJavaLite; } + + public boolean useToolchainForJavaProto() { + return useToolchainForJavaProto; + } } |