diff options
author | 2018-02-14 13:14:13 -0800 | |
---|---|---|
committer | 2018-02-14 13:16:13 -0800 | |
commit | a84e9e4dcc4bdc1a3b3f39605421ff7a451894d6 (patch) | |
tree | 91b4736a97697d09ff45c5734a7902444f4849ea /src/main/java/com/google | |
parent | 27458be9cd752dd1dfd4d2c8f1bdc421bdbf16bb (diff) |
Add a CODEC for CppCompileAction.
PiperOrigin-RevId: 185733313
Diffstat (limited to 'src/main/java/com/google')
20 files changed, 202 insertions, 73 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java index 8e470fa033..5aba95bec6 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java +++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.packages.AspectDescriptor; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -77,7 +78,7 @@ public abstract class AbstractAction implements Action, SkylarkValue { * AbstractAction itself. The appropriate getter methods should be used instead. This has to be * done due to the fact that the getter methods can be overridden in subclasses. */ - private final ActionOwner owner; + @VisibleForSerialization protected final ActionOwner owner; /** * Tools are a subset of inputs and used by the WorkerSpawnStrategy to determine whether a @@ -103,11 +104,12 @@ public abstract class AbstractAction implements Action, SkylarkValue { // The variable inputs is non-final only so that actions that discover their inputs can modify it. @GuardedBy("this") - private Iterable<Artifact> inputs; + @VisibleForSerialization + protected Iterable<Artifact> inputs; protected final ActionEnvironment env; private final RunfilesSupplier runfilesSupplier; - private final ImmutableSet<Artifact> outputs; + @VisibleForSerialization protected final ImmutableSet<Artifact> outputs; private String cachedKey; diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java index 85b2574eb9..caa1859d77 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java @@ -21,6 +21,8 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.AspectDescriptor; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import javax.annotation.Nullable; /** @@ -31,8 +33,11 @@ import javax.annotation.Nullable; * analysis and actions packages, the RuleConfiguredTarget provides an instance of this class. */ @AutoValue +@AutoCodec @Immutable public abstract class ActionOwner { + public static final ObjectCodec<ActionOwner> CODEC = new ActionOwner_AutoCodec(); + /** An action owner for special cases. Usage is strongly discouraged. */ public static final ActionOwner SYSTEM_ACTION_OWNER = ActionOwner.create( @@ -46,6 +51,7 @@ public abstract class ActionOwner { null, null); + @AutoCodec.Instantiator public static ActionOwner create( @Nullable Label label, ImmutableList<AspectDescriptor> aspectDescriptors, @@ -80,7 +86,7 @@ public abstract class ActionOwner { /** Returns the configuration's mnemonic. */ @Nullable - public abstract String getConfigurationMnemonic(); + public abstract String getMnemonic(); /** * Returns the short cache key for the configuration of the action owner. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD index acd0618a1a..b36b478b73 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD +++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD @@ -23,6 +23,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib:transitive-info-provider", "//src/main/java/com/google/devtools/build/lib/concurrent", + "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//third_party:auto_value", "//third_party:guava", ], diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java index 9554692dfc..4b3f2f44f7 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java @@ -21,6 +21,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NativeProvider; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -35,7 +38,10 @@ import com.google.devtools.build.lib.syntax.SkylarkType; category = SkylarkModuleCategory.PROVIDER ) @Immutable +@AutoCodec public class ConstraintSettingInfo extends NativeInfo { + public static final ObjectCodec<ConstraintSettingInfo> CODEC = + new ConstraintSettingInfo_AutoCodec(); /** Name used in Skylark for accessing this provider. */ public static final String SKYLARK_NAME = "ConstraintSettingInfo"; @@ -67,7 +73,8 @@ public class ConstraintSettingInfo extends NativeInfo { private final Label label; - private ConstraintSettingInfo(Label label, Location location) { + @VisibleForSerialization + ConstraintSettingInfo(Label label, Location location) { super(PROVIDER, ImmutableMap.<String, Object>of("label", label), location); this.label = label; diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java index d9b167bf1a..84f3544428 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java @@ -21,6 +21,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NativeProvider; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -35,7 +38,9 @@ import com.google.devtools.build.lib.syntax.SkylarkType; category = SkylarkModuleCategory.PROVIDER ) @Immutable +@AutoCodec public class ConstraintValueInfo extends NativeInfo { + public static final ObjectCodec<ConstraintValueInfo> CODEC = new ConstraintValueInfo_AutoCodec(); /** Name used in Skylark for accessing this provider. */ public static final String SKYLARK_NAME = "ConstraintValueInfo"; @@ -70,7 +75,8 @@ public class ConstraintValueInfo extends NativeInfo { private final ConstraintSettingInfo constraint; private final Label label; - private ConstraintValueInfo(ConstraintSettingInfo constraint, Label label, Location location) { + @VisibleForSerialization + ConstraintValueInfo(ConstraintSettingInfo constraint, Label label, Location location) { super( SKYLARK_CONSTRUCTOR, ImmutableMap.<String, Object>of( diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java index bfee814b6c..3b3462d420 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java @@ -29,6 +29,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NativeProvider; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -49,7 +52,9 @@ import javax.annotation.Nullable; category = SkylarkModuleCategory.PROVIDER ) @Immutable +@AutoCodec public class PlatformInfo extends NativeInfo { + public static final ObjectCodec<PlatformInfo> CODEC = new PlatformInfo_AutoCodec(); /** Name used in Skylark for accessing this provider. */ public static final String SKYLARK_NAME = "PlatformInfo"; @@ -99,27 +104,36 @@ public class PlatformInfo extends NativeInfo { private final ImmutableMap<ConstraintSettingInfo, ConstraintValueInfo> constraints; private final String remoteExecutionProperties; - private PlatformInfo( + @AutoCodec.Instantiator + @VisibleForSerialization + PlatformInfo( Label label, - ImmutableList<ConstraintValueInfo> constraints, + ImmutableMap<ConstraintSettingInfo, ConstraintValueInfo> constraints, String remoteExecutionProperties, Location location) { super( SKYLARK_CONSTRUCTOR, ImmutableMap.<String, Object>of( "label", label, - "constraints", constraints), + "constraints", constraints.values().asList()), location); this.label = label; + this.constraints = constraints; this.remoteExecutionProperties = remoteExecutionProperties; + } + static PlatformInfo create( + Label label, + ImmutableList<ConstraintValueInfo> constraints, + String remoteExecutionProperties, + Location location) { ImmutableMap.Builder<ConstraintSettingInfo, ConstraintValueInfo> constraintsBuilder = new ImmutableMap.Builder<>(); for (ConstraintValueInfo constraint : constraints) { constraintsBuilder.put(constraint.constraint(), constraint); } - this.constraints = constraintsBuilder.build(); + return new PlatformInfo(label, constraintsBuilder.build(), remoteExecutionProperties, location); } @SkylarkCallable( @@ -243,7 +257,7 @@ public class PlatformInfo extends NativeInfo { */ public PlatformInfo build() throws DuplicateConstraintException { ImmutableList<ConstraintValueInfo> validatedConstraints = validateConstraints(constraints); - return new PlatformInfo(label, validatedConstraints, remoteExecutionProperties, location); + return PlatformInfo.create(label, validatedConstraints, remoteExecutionProperties, location); } public static ImmutableList<ConstraintValueInfo> validateConstraints( diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java index d497113bf3..b15c523200 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java @@ -39,7 +39,7 @@ public class BazelCppSemantics implements AspectLegalCppSemantics { private final IncludeProcessing includeProcessing; private BazelCppSemantics() { - this.includeProcessing = new NoProcessing(); + this.includeProcessing = NoProcessing.INSTANCE; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/collect/CollectionUtils.java b/src/main/java/com/google/devtools/build/lib/collect/CollectionUtils.java index 369ef52274..9198ba2ba7 100644 --- a/src/main/java/com/google/devtools/build/lib/collect/CollectionUtils.java +++ b/src/main/java/com/google/devtools/build/lib/collect/CollectionUtils.java @@ -13,7 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.collect; -import static com.google.common.collect.ImmutableList.toImmutableList; +import static com.google.common.collect.ImmutableSet.toImmutableSet; import static java.util.stream.Collectors.toCollection; import com.google.common.base.Preconditions; @@ -106,12 +106,11 @@ public final class CollectionUtils { } /** - * Returns an immutable list of all non-null parameters in the order in which - * they are specified. + * Returns an immutable set of all non-null parameters in the order in which they are specified. */ @SuppressWarnings("unchecked") - public static <T> ImmutableList<T> asListWithoutNulls(T... elements) { - return Arrays.stream(elements).filter(Objects::nonNull).collect(toImmutableList()); + public static <T> ImmutableSet<T> asSetWithoutNulls(T... elements) { + return Arrays.stream(elements).filter(Objects::nonNull).collect(toImmutableSet()); } /** diff --git a/src/main/java/com/google/devtools/build/lib/packages/Info.java b/src/main/java/com/google/devtools/build/lib/packages/Info.java index 33b8c95d13..e50ab26e81 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Info.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Info.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Ordering; import com.google.devtools.build.lib.events.Location; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; @@ -57,7 +58,7 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { * * <p>Built-in provider instances may use {@link Location#BUILTIN}. */ - private final Location location; + @VisibleForSerialization protected final Location location; /** * Constructs an {@link Info}. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java index 0270ff6237..281f2d0af8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java @@ -167,15 +167,18 @@ public class CcToolchainFeatures implements Serializable { return Objects.hash(text); } } - - /** - * A chunk of a string value into which a variable should be expanded. - */ + + /** A chunk of a string value into which a variable should be expanded. */ @Immutable - private static class VariableChunk implements StringChunk, Serializable { + @AutoCodec + static class VariableChunk implements StringChunk, Serializable { + public static final ObjectCodec<VariableChunk> CODEC = + new CcToolchainFeatures_VariableChunk_AutoCodec(); + private final String variableName; - - private VariableChunk(String variableName) { + + @VisibleForSerialization + VariableChunk(String variableName) { this.variableName = variableName; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index e3a92ec93d..273974b978 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java @@ -86,9 +86,11 @@ import java.util.UUID; import javax.annotation.Nullable; /** Action that represents some kind of C++ compilation step. */ +@AutoCodec @ThreadCompatible public class CppCompileAction extends AbstractAction implements IncludeScannable, ExecutionInfoSpecifier, CommandAction { + public static final ObjectCodec<CppCompileAction> CODEC = new CppCompileAction_AutoCodec(); private static final PathFragment BUILD_PATH_FRAGMENT = PathFragment.create("BUILD"); @@ -259,7 +261,7 @@ public class CppCompileAction extends AbstractAction * @param cppSemantics C++ compilation semantics * @param cppProvider - CcToolchainProvider with configuration-dependent information. */ - protected CppCompileAction( + CppCompileAction( ActionOwner owner, NestedSet<Artifact> allInputs, FeatureConfiguration featureConfiguration, @@ -291,61 +293,125 @@ public class CppCompileAction extends AbstractAction String actionName, CppSemantics cppSemantics, CcToolchainProvider cppProvider) { - super( + this( owner, allInputs, - CollectionUtils.asListWithoutNulls( + CollectionUtils.asSetWithoutNulls( outputFile, - (dotdFile == null ? null : dotdFile.artifact()), + dotdFile == null ? null : dotdFile.artifact(), gcnoFile, dwoFile, - ltoIndexingFile)); + ltoIndexingFile), + localShellEnvironment, + Preconditions.checkNotNull(outputFile), + sourceFile, + optionalSourceFile, + // We do not need to include the middleman artifact since it is a generated + // artifact and will definitely exist prior to this action execution. + mandatoryInputs, + prunableInputs, + // inputsKnown begins as the logical negation of shouldScanIncludes. + // When scanning includes, the inputs begin as not known, and become + // known after inclusion scanning. When *not* scanning includes, + // the inputs are as declared, hence known, and remain so. + shouldScanIncludes, + shouldPruneModules, + usePic, + useHeaderModules, + isStrictSystemIncludes, + context, + lipoScannables, + builtinIncludeFiles, + ImmutableList.copyOf(additionalIncludeScanningRoots), + CompileCommandLine.builder( + sourceFile, coptsFilter, actionName, crosstoolTopPathFragment, dotdFile) + .setFeatureConfiguration(featureConfiguration) + .setVariables(variables) + .build(), + executionInfo, + environment, + actionName, + featureConfiguration, + actionClassId, + shouldScanIncludes || cppSemantics.needsDotdInputPruning(), + ImmutableList.copyOf(cppProvider.getBuiltInIncludeDirectories()), + /*additionalInputs=*/ null, + /*usedModules=*/ null, + /*topLevelModules=*/ null, + /*overwrittenVariables=*/ null, + cppSemantics.needsDotdInputPruning(), + cppSemantics.needsIncludeValidation(), + cppSemantics.getIncludeProcessing()); + Preconditions.checkArgument(!shouldPruneModules || shouldScanIncludes); + } + + @AutoCodec.Instantiator + @VisibleForSerialization + CppCompileAction( + ActionOwner owner, + NestedSet<Artifact> inputs, + ImmutableSet<Artifact> outputs, + ImmutableMap<String, String> localShellEnvironment, + Artifact outputFile, + Artifact sourceFile, + Artifact optionalSourceFile, + NestedSet<Artifact> mandatoryInputs, + NestedSet<Artifact> prunableInputs, + boolean shouldScanIncludes, + boolean shouldPruneModules, + boolean usePic, + boolean useHeaderModules, + boolean isStrictSystemIncludes, + CppCompilationContext context, + Iterable<IncludeScannable> lipoScannables, + ImmutableList<Artifact> builtinIncludeFiles, + ImmutableList<Artifact> additionalIncludeScanningRoots, + CompileCommandLine compileCommandLine, + ImmutableMap<String, String> executionInfo, + ImmutableMap<String, String> environment, + String actionName, + FeatureConfiguration featureConfiguration, + UUID actionClassId, + boolean discoversInputs, + ImmutableList<PathFragment> builtInIncludeDirectories, + Iterable<Artifact> additionalInputs, + Collection<Artifact> usedModules, + Iterable<Artifact> topLevelModules, + CcToolchainFeatures.Variables overwrittenVariables, + boolean needsDotdInputPruning, + boolean needsIncludeValidation, + IncludeProcessing includeProcessing) { + super(owner, inputs, outputs); this.localShellEnvironment = localShellEnvironment; + this.outputFile = outputFile; this.sourceFile = sourceFile; - this.outputFile = Preconditions.checkNotNull(outputFile); this.optionalSourceFile = optionalSourceFile; - this.context = context; - this.featureConfiguration = featureConfiguration; - // inputsKnown begins as the logical negation of shouldScanIncludes. - // When scanning includes, the inputs begin as not known, and become - // known after inclusion scanning. When *not* scanning includes, - // the inputs are as declared, hence known, and remain so. + this.mandatoryInputs = mandatoryInputs; + this.prunableInputs = prunableInputs; this.shouldScanIncludes = shouldScanIncludes; this.shouldPruneModules = shouldPruneModules; - // We can only prune modules if include scanning is enabled. - Preconditions.checkArgument(!shouldPruneModules || shouldScanIncludes, this); this.usePic = usePic; this.useHeaderModules = useHeaderModules; this.isStrictSystemIncludes = isStrictSystemIncludes; - this.discoversInputs = shouldScanIncludes || cppSemantics.needsDotdInputPruning(); - this.compileCommandLine = - CompileCommandLine.builder( - sourceFile, - coptsFilter, - actionName, - crosstoolTopPathFragment, - dotdFile) - .setFeatureConfiguration(featureConfiguration) - .setVariables(variables) - .build(); + this.context = context; this.lipoScannables = lipoScannables; - this.actionClassId = actionClassId; + this.builtinIncludeFiles = builtinIncludeFiles; + this.additionalIncludeScanningRoots = additionalIncludeScanningRoots; + this.compileCommandLine = compileCommandLine; this.executionInfo = executionInfo; this.environment = environment; this.actionName = actionName; - - // We do not need to include the middleman artifact since it is a generated - // artifact and will definitely exist prior to this action execution. - this.mandatoryInputs = mandatoryInputs; - this.prunableInputs = prunableInputs; - this.builtinIncludeFiles = builtinIncludeFiles; - this.needsDotdInputPruning = cppSemantics.needsDotdInputPruning(); - this.needsIncludeValidation = cppSemantics.needsIncludeValidation(); - this.includeProcessing = cppSemantics.getIncludeProcessing(); - - this.additionalIncludeScanningRoots = ImmutableList.copyOf(additionalIncludeScanningRoots); - this.builtInIncludeDirectories = - ImmutableList.copyOf(cppProvider.getBuiltInIncludeDirectories()); + this.featureConfiguration = featureConfiguration; + this.needsDotdInputPruning = needsDotdInputPruning; + this.needsIncludeValidation = needsIncludeValidation; + this.includeProcessing = includeProcessing; + this.actionClassId = actionClassId; + this.discoversInputs = discoversInputs; + this.builtInIncludeDirectories = builtInIncludeDirectories; + this.additionalInputs = additionalInputs; + this.usedModules = usedModules; + this.topLevelModules = topLevelModules; + this.overwrittenVariables = overwrittenVariables; } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java index 46c9d92a81..c965bba2dd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java @@ -1179,7 +1179,7 @@ public class CppLinkActionBuilder { return new ImmutableList.Builder<Artifact>() .add(primaryOutput) .addAll(outputList) - .addAll(CollectionUtils.asListWithoutNulls(outputs)) + .addAll(CollectionUtils.asSetWithoutNulls(outputs)) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java index e9721a5a3d..6bd958930b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java @@ -18,10 +18,16 @@ import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.rules.cpp.IncludeScanner.IncludeScannerSupplier; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; import javax.annotation.Nullable; /** Used as an interface to thin header inputs to compile actions for C++-like compiles. */ +@AutoCodec(strategy = Strategy.POLYMORPHIC) public interface IncludeProcessing { + ObjectCodec<IncludeProcessing> CODEC = new IncludeProcessing_AutoCodec(); + /** Performs include processing actions and returns the processed set of resulting headers. */ Iterable<Artifact> determineAdditionalInputs( @Nullable IncludeScannerSupplier includeScannerSupplier, diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java index 2c625901ea..71c9ce406b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java @@ -16,22 +16,25 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; import com.google.devtools.build.lib.vfs.PathFragment; - import java.util.Collection; import java.util.List; import java.util.Map; - import javax.annotation.Nullable; /** - * To be implemented by actions (such as C++ compilation steps) whose inputs - * can be scanned to discover other implicit inputs (such as C++ header files). + * To be implemented by actions (such as C++ compilation steps) whose inputs can be scanned to + * discover other implicit inputs (such as C++ header files). * - * <p>This is useful for remote execution strategies to be able to compute the - * complete set of files that must be distributed in order to execute such an action. + * <p>This is useful for remote execution strategies to be able to compute the complete set of files + * that must be distributed in order to execute such an action. */ +@AutoCodec(strategy = Strategy.POLYMORPHIC) public interface IncludeScannable { + public static final ObjectCodec<IncludeScannable> CODEC = new IncludeScannable_AutoCodec(); /** * Returns the built-in list of system include paths for the toolchain compiler. All paths in this diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java index 85bfcd9997..954214994a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java @@ -18,10 +18,18 @@ import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.rules.cpp.IncludeScanner.IncludeScannerSupplier; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; import javax.annotation.Nullable; /** Always performs no include processing and returns null. */ +@AutoCodec(strategy = Strategy.SINGLETON) public class NoProcessing implements IncludeProcessing { + public static final ObjectCodec<NoProcessing> CODEC = new NoProcessing_AutoCodec(); + + public static final NoProcessing INSTANCE = new NoProcessing(); + @Override public Iterable<Artifact> determineAdditionalInputs( @Nullable IncludeScannerSupplier includeScannerSupplier, diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD index c9022b5d3f..d6c8cf42ab 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD @@ -25,6 +25,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/analysis/platform", "//src/main/java/com/google/devtools/build/lib/collect", "//src/main/java/com/google/devtools/build/lib/collect/nestedset", + "//src/main/java/com/google/devtools/build/lib/collect/nestedset:serialization", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/profiler", "//src/main/java/com/google/devtools/build/lib/rules/apple", diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index b6bd529655..2a69298e45 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -300,7 +300,7 @@ public class CompilationSupport { } return new HeaderThinning(potentialInputs); } else { - return new NoProcessing(); + return NoProcessing.INSTANCE; } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java b/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java index dcd8bca663..3291a405f4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java @@ -24,6 +24,8 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.rules.cpp.CppCompileAction; import com.google.devtools.build.lib.rules.cpp.IncludeProcessing; import com.google.devtools.build.lib.rules.cpp.IncludeScanner.IncludeScannerSupplier; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; @@ -42,7 +44,9 @@ import javax.annotation.Nullable; * <p>Reads the .headers_list output file if one was generated for the actions source file and * returns the Artifact objects associated with the headers that were found. */ +@AutoCodec public class HeaderThinning implements IncludeProcessing { + public static final ObjectCodec<HeaderThinning> CODEC = new HeaderThinning_AutoCodec(); private final Iterable<Artifact> potentialInputs; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java index 33d29d3461..8eee47800c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java @@ -172,6 +172,8 @@ public class ConfiguredTargetKey extends ActionLookupKey { } private static class HostConfiguredTargetKey extends ConfiguredTargetKey { + public static final ObjectCodec<ConfiguredTargetKey> CODEC = ConfiguredTargetKey.CODEC; + private HostConfiguredTargetKey( Label label, @Nullable BuildConfigurationValue.Key configurationKey) { super(label, configurationKey); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java index b627952a2f..8476298243 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java @@ -94,6 +94,6 @@ public @interface AutoCodec { * * <p>TODO(janakr): Add an ErrorProne checker to enforce this. */ - @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR}) + @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) @interface VisibleForSerialization {} } |