diff options
author | 2018-05-24 01:55:01 -0700 | |
---|---|---|
committer | 2018-05-24 01:56:13 -0700 | |
commit | 8bbcccd8f86a9361dfbe3f562320d6575576948b (patch) | |
tree | e5dad711225c9edf208a064388074530fa74d0fa /src/main/java/com/google | |
parent | d62833f640690309e1a73aefa62de1d8821dc8ba (diff) |
PiperOrigin-RevId: 197857419
Diffstat (limited to 'src/main/java/com/google')
6 files changed, 138 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index ada11c9514..d745e73632 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -913,6 +913,7 @@ java_library( "rules/java/ProguardSpecProvider.java", "rules/java/ProtoJavaApiInfoAspectProvider.java", "rules/java/ProtoJavaApiInfoProvider.java", + "rules/java/proto/ActionReuser.java", "rules/java/proto/JavaLiteProtoAspect.java", "rules/java/proto/JavaLiteProtoLibrary.java", "rules/java/proto/JavaProtoAspect.java", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java index a634a10eed..4d95e44430 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java @@ -74,6 +74,7 @@ import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.File; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import javax.annotation.Nullable; @@ -119,6 +120,10 @@ public class BazelJavaSemantics implements JavaSemantics { public void checkForProtoLibraryAndJavaProtoLibraryOnSameProto( RuleContext ruleContext, JavaCommon javaCommon) {} + @Override + public void checkProtoDeps( + RuleContext ruleContext, Collection<? extends TransitiveInfoCollection> deps) {} + private static final String JUNIT4_RUNNER = "org.junit.runner.JUnitCore"; @Nullable diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java index 66f584428a..a7d80cc300 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java @@ -627,6 +627,8 @@ public class JavaCommon { javaTargetAttributes.addSourceArtifacts(extraSrcs); processRuntimeDeps(javaTargetAttributes); + semantics.checkProtoDeps(ruleContext, targetsTreatedAsDeps(ClasspathType.BOTH)); + if (disallowDepsWithoutSrcs(ruleContext.getRule().getRuleClass()) && ruleContext.attributes().get("srcs", BuildType.LABEL_LIST).isEmpty() && ruleContext.getRule().isAttributeValueExplicitlySpecified("deps")) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java index 90972d2315..a95e338b7c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java @@ -47,6 +47,7 @@ import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.File; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -255,6 +256,8 @@ public interface JavaSemantics { void checkForProtoLibraryAndJavaProtoLibraryOnSameProto( RuleContext ruleContext, JavaCommon javaCommon); + void checkProtoDeps(RuleContext ruleContext, Collection<? extends TransitiveInfoCollection> deps); + /** * Returns the main class of a Java binary. */ diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java new file mode 100644 index 0000000000..8f4479eecb --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java @@ -0,0 +1,123 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.java.proto; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.getOnlyElement; +import static com.google.common.collect.Iterables.isEmpty; +import static com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode.TARGET; +import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.BOTH; +import static com.google.devtools.build.lib.rules.java.proto.JplCcLinkParams.createCcLinkParamsStore; +import static com.google.devtools.build.lib.rules.java.proto.StrictDepsUtils.createNonStrictCompilationArgsProvider; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.ConfiguredAspect; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap; +import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.rules.java.JavaCompilationArgs; +import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; +import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts; +import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; +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.ProtoJavaApiInfoProvider; + +public class ActionReuser { + + /** + * If the underlying proto_library rule already registers the compile actions we need, just reuse + * them. This will preserve memory. + * + * <p>TODO(b/36191931): Delete when it's time. + */ + public static boolean reuseExistingActions( + ConfiguredTarget base, RuleContext ruleContext, ConfiguredAspect.Builder aspect) { + ProtoJavaApiInfoProvider javaApi = base.getProvider(ProtoJavaApiInfoProvider.class); + if (javaApi == null) { + return false; + } + + JavaCompilationArtifacts directJars = javaApi.getJavaCompilationArtifactsImmutable(); + if (isEmpty(directJars.getCompileTimeJars()) || javaApi.sourceJarImmutable() == null) { + return false; + } + + JavaCompilationArgs.Builder transitiveJars = + JavaCompilationArgs.builder() + .addTransitiveArgs(javaApi.getTransitiveJavaCompilationArgsImmutable(), BOTH) + .addTransitiveArgs(javaApi.getTransitiveProtoRuntimeImmutable(), BOTH) + .merge(directJars); + + Artifact outputJar = getOnlyElement(directJars.getRuntimeJars()); + Artifact compileTimeJar = getOnlyElement(directJars.getCompileTimeJars()); + Artifact sourceJar = checkNotNull(javaApi.sourceJarImmutable()); + + JavaCompilationArgsProvider compilationArgsProvider = + JavaCompilationArgsProvider.create( + JavaCompilationArgs.builder().merge(directJars).build(), + transitiveJars.build(), + NestedSetBuilder.create( + Order.STABLE_ORDER, directJars.getCompileTimeDependencyArtifact())); + + TransitiveInfoProviderMapBuilder javaProvidersBuilder = + new TransitiveInfoProviderMapBuilder() + .add(createOutputJarProvider(outputJar, compileTimeJar, sourceJar)) + .add(createSrcJarProvider(sourceJar)) + .add(compilationArgsProvider) + .add(createCcLinkParamsStore(ruleContext, javaApi.getProtoRuntimeImmutable())); + + Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders = + ruleContext.getPrerequisites("deps", TARGET, JavaProtoLibraryAspectProvider.class); + + NestedSetBuilder<Artifact> transitiveOutputJars = NestedSetBuilder.stableOrder(); + for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) { + transitiveOutputJars.addTransitive(provider.getJars()); + } + transitiveOutputJars.add(outputJar); + + TransitiveInfoProviderMap javaProviders = javaProvidersBuilder.build(); + aspect + .addSkylarkTransitiveInfo( + JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), + JavaSkylarkApiProvider.fromProviderMap(javaProviders)) + .addProviders( + new JavaProtoLibraryAspectProvider( + javaProviders, + transitiveOutputJars.build(), + createNonStrictCompilationArgsProvider( + javaProtoLibraryAspectProviders, + compilationArgsProvider, + javaApi.getProtoRuntimeImmutable()))); + return true; + } + + private static JavaRuleOutputJarsProvider createOutputJarProvider( + Artifact outputJar, Artifact compileTimeJar, Artifact sourceJar) { + return JavaRuleOutputJarsProvider.builder() + .addOutputJar(outputJar, compileTimeJar, ImmutableList.of(sourceJar)) + .build(); + } + + private static JavaSourceJarsProvider createSrcJarProvider(Artifact sourceJar) { + return JavaSourceJarsProvider.create( + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>stableOrder().add(sourceJar).build()); + } +} 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 0e59ce8367..4a4eab01e0 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 @@ -106,6 +106,10 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe JavaProtoAspectCommon aspectCommon = JavaProtoAspectCommon.getSpeedInstance(ruleContext, javaSemantics, rpcSupport); Impl impl = new Impl(ruleContext, supportData, aspectCommon, rpcSupport); + if (impl.shouldGenerateCode() + && ActionReuser.reuseExistingActions(ctadBase.getConfiguredTarget(), ruleContext, aspect)) { + return aspect.build(); + } impl.addProviders(aspect); return aspect.build(); } |