aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Carmi Grushko <carmi@google.com>2016-11-02 22:54:51 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-11-03 07:17:25 +0000
commita87b60da13ecbb427aeed85b3e59873a6ac8f70e (patch)
treeca61953f06215e7386bd8e2404b0164ade77e390 /src
parent9ea049313ace3affea177732b0b193ce17c83412 (diff)
Use proto_lang_toolchain in java_lite_proto_library.
-- MOS_MIGRATED_REVID=138005602
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java81
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java39
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java16
5 files changed, 107 insertions, 72 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
index ed3356469b..739de4b730 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
@@ -18,20 +18,22 @@ import static com.google.devtools.build.lib.packages.Aspect.INJECTING_RULE_KIND_
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
-import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.LITE_PROTO_RUNTIME_ATTR;
-import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.LITE_PROTO_RUNTIME_LABEL;
+import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_ATTR;
+import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_LABEL;
import static com.google.devtools.build.lib.syntax.Type.BOOLEAN;
import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
-import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoLibrary;
+import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
import javax.annotation.Nullable;
/** Declaration of the {@code java_lite_proto_library} rule. */
@@ -75,9 +77,11 @@ public class BazelJavaLiteProtoLibraryRule implements RuleDefinition {
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("strict_deps", BOOLEAN).value(true))
.add(
- attr(LITE_PROTO_RUNTIME_ATTR, LABEL)
- .legacyAllowAnyFileType()
- .value(Label.parseAbsoluteUnchecked(LITE_PROTO_RUNTIME_LABEL)))
+ attr(PROTO_TOOLCHAIN_ATTR, LABEL)
+ .mandatoryNativeProviders(
+ ImmutableList.<Class<? extends TransitiveInfoProvider>>of(
+ ProtoLangToolchainProvider.class))
+ .value(PROTO_TOOLCHAIN_LABEL))
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index 9d65decc29..d3bc185cfb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -25,14 +25,14 @@ import static com.google.devtools.build.lib.rules.java.proto.JavaCompilationArgs
import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTransitiveFilesToBuildProvider.GET_JARS;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.FilesToRunProvider;
-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;
@@ -56,6 +56,7 @@ import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaToolchainProvider;
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
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.ProtoSourcesProvider;
import com.google.devtools.build.lib.rules.proto.ProtoSupportDataProvider;
import com.google.devtools.build.lib.rules.proto.SupportData;
@@ -64,23 +65,16 @@ import javax.annotation.Nullable;
/** An Aspect which JavaLiteProtoLibrary injects to build Java Lite protos. */
public class JavaLiteProtoAspect extends NativeAspectClass implements ConfiguredAspectFactory {
- public static final String LITE_PROTO_RUNTIME_ATTR = "$aspect_java_lib";
- public static final String LITE_PROTO_RUNTIME_LABEL = "//external:protobuf/javalite_runtime";
+ public static final String PROTO_TOOLCHAIN_ATTR = ":aspect_proto_toolchain_for_javalite";
- private static final Attribute.LateBoundLabel<BuildConfiguration> JAVA_LITE_PLUGIN =
- new Attribute.LateBoundLabel<BuildConfiguration>((Label) null, ProtoConfiguration.class) {
+ public static final Attribute.LateBoundLabel<BuildConfiguration> PROTO_TOOLCHAIN_LABEL =
+ new Attribute.LateBoundLabel<BuildConfiguration>(
+ "//tools/proto/toolchains:javalite", ProtoConfiguration.class) {
@Override
public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(ProtoConfiguration.class).protoCompilerJavaLitePlugin();
- }
-
- @Override
- public boolean useHostConfiguration() {
- return true;
+ return configuration.getFragment(ProtoConfiguration.class).protoToolchainForJavaLite();
}
};
- private static final String PROTO_COMPILER_JAVA_LITE_PLUGIN_ATTR =
- ":proto_compiler_java_lite_plugin";
private final JavaSemantics javaSemantics;
@@ -115,19 +109,16 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
.requiresConfigurationFragments(JavaConfiguration.class, ProtoConfiguration.class)
.requireProvider(ProtoSourcesProvider.class)
.add(
- attr(LITE_PROTO_RUNTIME_ATTR, LABEL)
- .legacyAllowAnyFileType()
- .value(parseAbsoluteUnchecked(LITE_PROTO_RUNTIME_LABEL)))
+ attr(PROTO_TOOLCHAIN_ATTR, LABEL)
+ .mandatoryNativeProviders(
+ ImmutableList.<Class<? extends TransitiveInfoProvider>>of(
+ ProtoLangToolchainProvider.class))
+ .value(PROTO_TOOLCHAIN_LABEL))
.add(attr(":host_jdk", LABEL).cfg(HOST).value(JavaSemantics.HOST_JDK))
.add(
attr(":java_toolchain", LABEL)
.allowedRuleClasses("java_toolchain")
- .value(JavaSemantics.JAVA_TOOLCHAIN))
- .add(
- attr(PROTO_COMPILER_JAVA_LITE_PLUGIN_ATTR, LABEL)
- .cfg(HOST)
- .exec()
- .value(JAVA_LITE_PLUGIN));
+ .value(JavaSemantics.JAVA_TOOLCHAIN));
Attribute.Builder<Label> jacocoAttr = attr("$jacoco_instrumentation", LABEL).cfg(HOST);
@@ -207,24 +198,16 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
}
private void createProtoCompileAction(Artifact sourceJar) {
- ProtoCompileActionBuilder actionBuilder =
- new ProtoCompileActionBuilder(
- ruleContext, supportData, "Java", "java", ImmutableList.of(sourceJar))
- .allowServices(true)
- .setLangParameter(
- String.format(
- ruleContext
- .getFragment(ProtoConfiguration.class, HOST)
- .protoCompilerJavaLiteFlags(),
- sourceJar.getExecPathString()));
-
- FilesToRunProvider plugin =
- ruleContext.getExecutablePrerequisite(PROTO_COMPILER_JAVA_LITE_PLUGIN_ATTR, Mode.HOST);
- if (plugin != null) {
- actionBuilder.setAdditionalTools(ImmutableList.of(plugin));
- }
-
- ruleContext.registerAction(actionBuilder.build());
+ ProtoCompileActionBuilder.registerActions(
+ ruleContext,
+ ImmutableMap.of(
+ "javalite",
+ new ProtoCompileActionBuilder.ToolchainInvocation(
+ getProtoToolchainProvider(), sourceJar.getExecPathString())),
+ supportData,
+ ImmutableList.of(sourceJar),
+ "JavaLite",
+ true /* allowServices */);
}
private JavaCompilationArgsProvider createJavaCompileAction(
@@ -235,15 +218,21 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
.addSourceJars(sourceJar)
.setJavacOpts(getAndroidCompatibleJavacOpts());
helper.addDep(dependencyCompilationArgs);
- helper
- .addDep(
- ruleContext.getPrerequisite(
- LITE_PROTO_RUNTIME_ATTR, Mode.TARGET, JavaCompilationArgsProvider.class))
- .setCompilationStrictDepsMode(StrictDepsMode.OFF);
+ TransitiveInfoCollection runtime = getProtoToolchainProvider().runtime();
+ if (runtime != null) {
+ helper.addDep(runtime.getProvider(JavaCompilationArgsProvider.class));
+ }
+ helper.setCompilationStrictDepsMode(StrictDepsMode.OFF);
JavaCompilationArgs artifacts = helper.build(javaSemantics);
return helper.buildCompilationArgsProvider(artifacts, true /* isReportedAsStrict */);
}
+ private ProtoLangToolchainProvider getProtoToolchainProvider() {
+ return checkNotNull(
+ ruleContext.getPrerequisite(
+ PROTO_TOOLCHAIN_ATTR, TARGET, ProtoLangToolchainProvider.class));
+ }
+
private Artifact getSourceJarArtifact() {
return ruleContext.getGenfilesArtifact(ruleContext.getLabel().getName() + "-lite-src.jar");
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
index 21d3e6f110..5e32d8cc2b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
@@ -14,9 +14,10 @@
package com.google.devtools.build.lib.rules.java.proto;
+import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER;
-import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.LITE_PROTO_RUNTIME_ATTR;
+import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_ATTR;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Iterables;
@@ -28,7 +29,9 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
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.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
@@ -38,6 +41,7 @@ import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.ProguardLibrary;
import com.google.devtools.build.lib.rules.java.ProguardSpecProvider;
+import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
/** Implementation of the java_lite_proto_library rule. */
public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
@@ -82,12 +86,7 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
.add(JavaCompilationArgsProvider.class, dependencyArgsProviders)
.add(JavaSourceJarsProvider.class, sourceJarsProvider)
.add(JavaRunfilesProvider.class, new JavaRunfilesProvider(runfiles))
- .add(
- ProguardSpecProvider.class,
- new ProguardSpecProvider(
- new ProguardLibrary(ruleContext)
- .collectProguardSpecs(
- ImmutableMultimap.of(Mode.TARGET, LITE_PROTO_RUNTIME_ATTR))))
+ .add(ProguardSpecProvider.class, getJavaLiteRuntimeSpec(ruleContext))
.add(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder().build())
.addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, new JavaSkylarkApiProvider())
.build();
@@ -97,4 +96,30 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
RuleContext ruleContext, Class<C> clazz) {
return ruleContext.getPrerequisites("deps", TARGET, clazz);
}
+
+ private ProguardSpecProvider getJavaLiteRuntimeSpec(RuleContext ruleContext) {
+ NestedSet<Artifact> specs =
+ new ProguardLibrary(ruleContext).collectProguardSpecs(ImmutableMultimap.<Mode, String>of());
+
+ TransitiveInfoCollection runtime = getProtoToolchainProvider(ruleContext).runtime();
+ if (runtime == null) {
+ return new ProguardSpecProvider(specs);
+ }
+
+ ProguardSpecProvider specProvider = runtime.getProvider(ProguardSpecProvider.class);
+ if (specProvider == null) {
+ return new ProguardSpecProvider(specs);
+ }
+
+ return new ProguardSpecProvider(
+ NestedSetBuilder.fromNestedSet(specs)
+ .addTransitive(specProvider.getTransitiveProguardSpecs())
+ .build());
+ }
+
+ private ProtoLangToolchainProvider getProtoToolchainProvider(RuleContext ruleContext) {
+ return checkNotNull(
+ ruleContext.getPrerequisite(
+ PROTO_TOOLCHAIN_ATTR, TARGET, ProtoLangToolchainProvider.class));
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
index 293c828ebc..29b2c4fc37 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
@@ -415,19 +415,6 @@ public class ProtoCompileActionBuilder {
ImmutableList<String> protocOpts) {
CustomCommandLine.Builder cmdLine = CustomCommandLine.builder();
- cmdLine.add(protocOpts);
-
- // Add include maps
- cmdLine.add(new ProtoCommandLineArgv(supportData.getTransitiveImports()));
-
- for (Artifact src : supportData.getDirectProtoSources()) {
- cmdLine.addPath(src.getRootRelativePath());
- }
-
- if (!allowServices) {
- cmdLine.add("--disallow_services");
- }
-
for (Map.Entry<String, ToolchainInvocation> entry : toolchainInvocations.entrySet()) {
String pluginSuffix = entry.getKey();
ToolchainInvocation invocation = entry.getValue();
@@ -450,6 +437,20 @@ public class ProtoCompileActionBuilder {
toolchain.pluginExecutable().getExecutable().getExecPathString()));
}
}
+
+ cmdLine.add(protocOpts);
+
+ // Add include maps
+ cmdLine.add(new ProtoCommandLineArgv(supportData.getTransitiveImports()));
+
+ for (Artifact src : supportData.getDirectProtoSources()) {
+ cmdLine.addPath(src.getRootRelativePath());
+ }
+
+ if (!allowServices) {
+ cmdLine.add("--disallow_services");
+ }
+
return cmdLine.build();
}
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 75ed40d883..48be2587bc 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
@@ -104,6 +104,15 @@ public class ProtoConfiguration extends Fragment {
)
public Label protoCompilerJavaLitePlugin;
+ @Option(
+ name = "proto_toolchain_for_javalite",
+ defaultValue = "//tools/proto/toolchains:javalite",
+ category = "flags",
+ converter = BuildConfiguration.EmptyToNullLabelConverter.class,
+ help = "Label of proto_lang_toolchain() which describes how to compile JavaLite protos"
+ )
+ public Label protoToolchainForJavaLite;
+
@Override
public FragmentOptions getHost(boolean fallback) {
Options host = (Options) super.getHost(fallback);
@@ -115,6 +124,7 @@ public class ProtoConfiguration extends Fragment {
host.protoCompilerJavaBlacklistedProtos = protoCompilerJavaBlacklistedProtos;
host.protoCompilerJavaLiteFlags = protoCompilerJavaLiteFlags;
host.protoCompilerJavaLitePlugin = protoCompilerJavaLitePlugin;
+ host.protoToolchainForJavaLite = protoToolchainForJavaLite;
return host;
}
}
@@ -147,6 +157,7 @@ public class ProtoConfiguration extends Fragment {
private final List<Label> protoCompilerJavaBlacklistedProtos;
private final String protoCompilerJavaLiteFlags;
private final Label protoCompilerJavaLitePlugin;
+ private final Label protoToolchainForJavaLite;
public ProtoConfiguration(Options options) {
this.experimentalProtoExtraActions = options.experimentalProtoExtraActions;
@@ -156,6 +167,7 @@ public class ProtoConfiguration extends Fragment {
this.protoCompilerJavaLiteFlags = options.protoCompilerJavaLiteFlags;
this.protoCompilerJavaLitePlugin = options.protoCompilerJavaLitePlugin;
this.protoCompilerJavaBlacklistedProtos = options.protoCompilerJavaBlacklistedProtos;
+ this.protoToolchainForJavaLite = options.protoToolchainForJavaLite;
}
public ImmutableList<String> protocOpts() {
@@ -190,4 +202,8 @@ public class ProtoConfiguration extends Fragment {
public List<Label> protoCompilerJavaBlacklistedProtos() {
return protoCompilerJavaBlacklistedProtos;
}
+
+ public Label protoToolchainForJavaLite() {
+ return protoToolchainForJavaLite;
+ }
}