diff options
author | Carmi Grushko <carmi@google.com> | 2016-11-02 22:54:51 +0000 |
---|---|---|
committer | Laszlo Csomor <laszlocsomor@google.com> | 2016-11-03 07:17:25 +0000 |
commit | a87b60da13ecbb427aeed85b3e59873a6ac8f70e (patch) | |
tree | ca61953f06215e7386bd8e2404b0164ade77e390 /src | |
parent | 9ea049313ace3affea177732b0b193ce17c83412 (diff) |
Use proto_lang_toolchain in java_lite_proto_library.
--
MOS_MIGRATED_REVID=138005602
Diffstat (limited to 'src')
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; + } } |