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/devtools/build/lib/rules | |
parent | 27458be9cd752dd1dfd4d2c8f1bdc421bdbf16bb (diff) |
Add a CODEC for CppCompileAction.
PiperOrigin-RevId: 185733313
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
9 files changed, 145 insertions, 54 deletions
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; |