aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2018-02-14 13:14:13 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-14 13:16:13 -0800
commita84e9e4dcc4bdc1a3b3f39605421ff7a451894d6 (patch)
tree91b4736a97697d09ff45c5734a7902444f4849ea /src/main/java/com/google/devtools/build/lib/rules
parent27458be9cd752dd1dfd4d2c8f1bdc421bdbf16bb (diff)
Add a CODEC for CppCompileAction.
PiperOrigin-RevId: 185733313
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java144
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/NoProcessing.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java4
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;