aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2018-02-07 15:01:44 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-07 15:03:59 -0800
commitbeb66e0fb63ce5cff2da8faa58ff9a55887affb3 (patch)
treed5f62c3d6deec1befbb8b92659bdb9e97c56602c /src
parent342f9fdd1444d90dec61c60c08ed2aa62a862860 (diff)
Add a CODEC for some dependencies of CppCompileAction: CompileCommandLine and
CcToolchainFeatures.Variables. We rephrase the nocopts filter from a Predicate<String> to a custom class, since AutoCodec cannot serialize a Predicate. PiperOrigin-RevId: 184902162
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java54
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java70
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java12
9 files changed, 154 insertions, 55 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 7d2aec8624..07e2ca9408 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -15,8 +15,6 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
@@ -52,6 +50,9 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.HeadersCheckingMode;
import com.google.devtools.build.lib.shell.ShellUtils;
+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.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.Pair;
@@ -176,7 +177,7 @@ public final class CcCommon {
}
public ImmutableList<String> getCopts() {
- if (!getCoptsFilter(ruleContext).apply("-Wno-future-warnings")) {
+ if (!getCoptsFilter(ruleContext).passesFilter("-Wno-future-warnings")) {
ruleContext.attributeWarning(
"nocopts",
String.format(
@@ -359,18 +360,55 @@ public final class CcCommon {
}
}
+ /** A filter that removes copts from a c++ compile action according to a nocopts regex. */
+ @AutoCodec
+ static class CoptsFilter {
+ public static final ObjectCodec<CoptsFilter> CODEC = new CcCommon_CoptsFilter_AutoCodec();
+
+ private final Pattern noCoptsPattern;
+ private final boolean allPasses;
+
+ @VisibleForSerialization
+ CoptsFilter(Pattern noCoptsPattern, boolean allPasses) {
+ this.noCoptsPattern = noCoptsPattern;
+ this.allPasses = allPasses;
+ }
+
+ /** Creates a filter that filters all matches to a regex. */
+ public static CoptsFilter fromRegex(Pattern noCoptsPattern) {
+ return new CoptsFilter(noCoptsPattern, false);
+ }
+
+ /** Creates a filter that passes on all inputs. */
+ public static CoptsFilter alwaysPasses() {
+ return new CoptsFilter(null, true);
+ }
+
+ /**
+ * Returns true if the provided string passes through the filter, or false if it should be
+ * removed.
+ */
+ public boolean passesFilter(String flag) {
+ if (allPasses) {
+ return true;
+ } else {
+ return !noCoptsPattern.matcher(flag).matches();
+ }
+ }
+ }
+
/** Returns copts filter built from the make variable expanded nocopts attribute. */
- Predicate<String> getCoptsFilter() {
+ CoptsFilter getCoptsFilter() {
return getCoptsFilter(ruleContext);
}
/** @see CcCommon#getCoptsFilter() */
- private static Predicate<String> getCoptsFilter(RuleContext ruleContext) {
+ private static CoptsFilter getCoptsFilter(RuleContext ruleContext) {
Pattern noCoptsPattern = getNoCoptsPattern(ruleContext);
if (noCoptsPattern == null) {
- return Predicates.alwaysTrue();
+ return CoptsFilter.alwaysPasses();
}
- return flag -> !noCoptsPattern.matcher(flag).matches();
+ return CoptsFilter.fromRegex(noCoptsPattern);
}
@Nullable
@@ -402,7 +440,7 @@ public final class CcCommon {
* otherwise.
*/
static boolean noCoptsMatches(String option, RuleContext ruleContext) {
- return !getCoptsFilter(ruleContext).apply(option);
+ return !getCoptsFilter(ruleContext).passesFilter(option);
}
private static final String DEFINES_ATTRIBUTE = "defines";
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index f4d62f1951..e898aa4820 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -20,7 +20,6 @@ import static java.util.stream.Collectors.toCollection;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -49,6 +48,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariablesExtension;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.HeadersCheckingMode;
@@ -333,7 +333,7 @@ public final class CcLibraryHelper {
private final List<Artifact> nonCodeLinkerInputs = new ArrayList<>();
private ImmutableList<String> copts = ImmutableList.of();
private final List<String> linkopts = new ArrayList<>();
- private Predicate<String> coptsFilter = Predicates.alwaysTrue();
+ private CoptsFilter coptsFilter = CoptsFilter.alwaysPasses();
private final Set<String> defines = new LinkedHashSet<>();
private final List<TransitiveInfoCollection> deps = new ArrayList<>();
private final List<CppCompilationContext> depContexts = new ArrayList<>();
@@ -703,7 +703,7 @@ public final class CcLibraryHelper {
}
/** Sets a pattern that is used to filter copts; set to {@code null} for no filtering. */
- public CcLibraryHelper setCoptsFilter(Predicate<String> coptsFilter) {
+ public CcLibraryHelper setCoptsFilter(CoptsFilter coptsFilter) {
this.coptsFilter = Preconditions.checkNotNull(coptsFilter);
return this;
}
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 503af1ac4d..410fb41fbd 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
@@ -38,12 +38,13 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariableValue;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
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.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.vfs.FileSystemProvider;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain.WithFeatureSet;
@@ -551,7 +552,7 @@ public class CcToolchainFeatures implements Serializable {
return;
}
if (iterateOverVariable != null) {
- for (VariableValue variableValue :
+ for (Variables.VariableValue variableValue :
variables.getSequenceVariable(iterateOverVariable, expander)) {
Variables nestedVariables = new Variables(variables, iterateOverVariable, variableValue);
for (Expandable expandable : expandables) {
@@ -1120,7 +1121,7 @@ public class CcToolchainFeatures implements Serializable {
return result.charAt(0) == '/' ? result.substring(1) : result;
}
}
-
+
/**
* Configured build variables usable by the toolchain configuration.
*
@@ -1128,8 +1129,11 @@ public class CcToolchainFeatures implements Serializable {
* instance could serve as a top level View used to expand all flag_groups.
*/
@Immutable
+ @AutoCodec(dependency = FileSystemProvider.class)
public static class Variables {
-
+ public static final InjectingObjectCodec<Variables, FileSystemProvider> CODEC =
+ new CcToolchainFeatures_Variables_AutoCodec();
+
/** An empty variables instance. */
public static final Variables EMPTY = new Variables.Builder().build();
@@ -1161,7 +1165,10 @@ public class CcToolchainFeatures implements Serializable {
* <p>Implementations must be immutable and without any side-effects. They will be expanded and
* queried multiple times.
*/
+ @AutoCodec(strategy = Strategy.POLYMORPHIC, dependency = FileSystemProvider.class)
interface VariableValue {
+ public static final InjectingObjectCodec<VariableValue, FileSystemProvider> CODEC =
+ new CcToolchainFeatures_Variables_VariableValue_AutoCodec();
/**
* Returns string value of the variable, if the variable type can be converted to string (e.g.
@@ -1335,11 +1342,16 @@ public class CcToolchainFeatures implements Serializable {
* supplier} doesn't capture anything that shouldn't outlive analysis phase (e.g. {@link
* RuleContext}).
*/
- private static final class LazyStringSequence extends VariableValueAdapter {
+ @AutoCodec
+ @VisibleForSerialization
+ static final class LazyStringSequence extends VariableValueAdapter {
+ public static final ObjectCodec<LazyStringSequence> CODEC =
+ new CcToolchainFeatures_Variables_LazyStringSequence_AutoCodec();
private final Supplier<ImmutableList<String>> supplier;
- private LazyStringSequence(Supplier<ImmutableList<String>> supplier) {
+ @VisibleForSerialization
+ LazyStringSequence(Supplier<ImmutableList<String>> supplier) {
this.supplier = Preconditions.checkNotNull(supplier);
}
@@ -1369,7 +1381,10 @@ public class CcToolchainFeatures implements Serializable {
* significantly reduces memory overhead.
*/
@Immutable
+ @AutoCodec(dependency = FileSystemProvider.class)
public static class LibraryToLinkValue extends VariableValueAdapter {
+ public static final InjectingObjectCodec<LibraryToLinkValue, FileSystemProvider> CODEC =
+ new CcToolchainFeatures_Variables_LibraryToLinkValue_AutoCodec();
public static final String OBJECT_FILES_FIELD_NAME = "object_files";
public static final String NAME_FIELD_NAME = "name";
@@ -1378,7 +1393,8 @@ public class CcToolchainFeatures implements Serializable {
private static final String LIBRARY_TO_LINK_VARIABLE_TYPE_NAME = "structure (LibraryToLink)";
- private enum Type {
+ @VisibleForSerialization
+ enum Type {
OBJECT_FILE("object_file"),
OBJECT_FILE_GROUP("object_file_group"),
INTERFACE_LIBRARY("interface_library"),
@@ -1440,7 +1456,8 @@ public class CcToolchainFeatures implements Serializable {
null, directory, null, isWholeArchive, Type.OBJECT_FILE_GROUP);
}
- private LibraryToLinkValue(
+ @VisibleForSerialization
+ LibraryToLinkValue(
String name,
Artifact directory,
ImmutableList<String> objectFiles,
@@ -1497,7 +1514,11 @@ public class CcToolchainFeatures implements Serializable {
/** Sequence of arbitrary VariableValue objects. */
@Immutable
- private static final class Sequence extends VariableValueAdapter {
+ @AutoCodec(dependency = FileSystemProvider.class)
+ @VisibleForSerialization
+ static final class Sequence extends VariableValueAdapter {
+ public static final InjectingObjectCodec<Sequence, FileSystemProvider> CODEC =
+ new CcToolchainFeatures_Variables_Sequence_AutoCodec();
private static final String SEQUENCE_VARIABLE_TYPE_NAME = "sequence";
@@ -1529,11 +1550,16 @@ public class CcToolchainFeatures implements Serializable {
* significantly reduces memory overhead.
*/
@Immutable
- private static final class StructureSequence extends VariableValueAdapter {
+ @AutoCodec(dependency = FileSystemProvider.class)
+ @VisibleForSerialization
+ static final class StructureSequence extends VariableValueAdapter {
+ public static final InjectingObjectCodec<StructureSequence, FileSystemProvider> CODEC =
+ new CcToolchainFeatures_Variables_StructureSequence_AutoCodec();
private final ImmutableList<ImmutableMap<String, VariableValue>> values;
- private StructureSequence(ImmutableList<ImmutableMap<String, VariableValue>> values) {
+ @VisibleForSerialization
+ StructureSequence(ImmutableList<ImmutableMap<String, VariableValue>> values) {
Preconditions.checkNotNull(values);
this.values = values;
}
@@ -1564,7 +1590,10 @@ public class CcToolchainFeatures implements Serializable {
* objects significantly reduces memory overhead.
*/
@Immutable
+ @AutoCodec
static final class StringSequence extends VariableValueAdapter {
+ public static final ObjectCodec<StringSequence> CODEC =
+ new CcToolchainFeatures_Variables_StringSequence_AutoCodec();
private final Iterable<String> values;
@@ -1598,7 +1627,11 @@ public class CcToolchainFeatures implements Serializable {
* memory overhead is prohibitively big. Use optimized {@link StructureSequence} instead.
*/
@Immutable
- private static final class StructureValue extends VariableValueAdapter {
+ @AutoCodec(dependency = FileSystemProvider.class)
+ @VisibleForSerialization
+ static final class StructureValue extends VariableValueAdapter {
+ public static final InjectingObjectCodec<StructureValue, FileSystemProvider> CODEC =
+ new CcToolchainFeatures_Variables_StructureValue_AutoCodec();
private static final String STRUCTURE_VARIABLE_TYPE_NAME = "structure";
@@ -1634,7 +1667,11 @@ public class CcToolchainFeatures implements Serializable {
* never live outside of {@code expand}, as the object overhead is prohibitively expensive.
*/
@Immutable
- private static final class StringValue extends VariableValueAdapter {
+ @AutoCodec
+ @VisibleForSerialization
+ static final class StringValue extends VariableValueAdapter {
+ public static final ObjectCodec<StringValue> CODEC =
+ new CcToolchainFeatures_Variables_StringValue_AutoCodec();
private static final String STRING_VARIABLE_TYPE_NAME = "string";
@@ -1667,7 +1704,10 @@ public class CcToolchainFeatures implements Serializable {
* expensive.
*/
@Immutable
+ @AutoCodec
static final class IntegerValue extends VariableValueAdapter {
+ public static final ObjectCodec<IntegerValue> CODEC =
+ new CcToolchainFeatures_Variables_IntegerValue_AutoCodec();
private static final String INTEGER_VALUE_TYPE_NAME = "integer";
private final int value;
@@ -1870,7 +1910,9 @@ public class CcToolchainFeatures implements Serializable {
private final ImmutableMap<String, String> stringVariablesMap;
private final Variables parent;
- private Variables(
+ @AutoCodec.Instantiator
+ @VisibleForSerialization
+ Variables(
Variables parent,
ImmutableMap<String, VariableValue> variablesMap,
ImmutableMap<String, String> stringVariablesMap) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java
index db52da2b72..5f2a3d8a52 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java
@@ -15,14 +15,18 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables;
import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
+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.util.FileType;
import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.vfs.FileSystemProvider;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.ArrayList;
import java.util.List;
@@ -30,21 +34,26 @@ import java.util.Map;
import javax.annotation.Nullable;
/** The compile command line for the C++ compile action. */
+@AutoCodec(dependency = FileSystemProvider.class)
public final class CompileCommandLine {
+ public static final InjectingObjectCodec<CompileCommandLine, FileSystemProvider> CODEC =
+ new CompileCommandLine_AutoCodec();
private final Artifact sourceFile;
private final Artifact outputFile;
- private final Predicate<String> coptsFilter;
+ private final CoptsFilter coptsFilter;
private final FeatureConfiguration featureConfiguration;
private final PathFragment crosstoolTopPathFragment;
private final CcToolchainFeatures.Variables variables;
private final String actionName;
private final DotdFile dotdFile;
- private CompileCommandLine(
+ @AutoCodec.Instantiator
+ @VisibleForSerialization
+ CompileCommandLine(
Artifact sourceFile,
Artifact outputFile,
- Predicate<String> coptsFilter,
+ CoptsFilter coptsFilter,
FeatureConfiguration featureConfiguration,
PathFragment crosstoolTopPathFragment,
CcToolchainFeatures.Variables variables,
@@ -140,7 +149,7 @@ public final class CompileCommandLine {
continue;
}
- pair.getSecond().stream().filter(coptsFilter).forEachOrdered(out::add);
+ pair.getSecond().stream().filter(coptsFilter::passesFilter).forEachOrdered(out::add);
}
}
@@ -174,7 +183,7 @@ public final class CompileCommandLine {
public static Builder builder(
Artifact sourceFile,
Artifact outputFile,
- Predicate<String> coptsFilter,
+ CoptsFilter coptsFilter,
String actionName,
PathFragment crosstoolTopPathFragment,
DotdFile dotdFile) {
@@ -186,7 +195,7 @@ public final class CompileCommandLine {
public static final class Builder {
private final Artifact sourceFile;
private final Artifact outputFile;
- private Predicate<String> coptsFilter;
+ private CoptsFilter coptsFilter;
private FeatureConfiguration featureConfiguration;
private CcToolchainFeatures.Variables variables = Variables.EMPTY;
private final String actionName;
@@ -208,7 +217,7 @@ public final class CompileCommandLine {
private Builder(
Artifact sourceFile,
Artifact outputFile,
- Predicate<String> coptsFilter,
+ CoptsFilter coptsFilter,
String actionName,
PathFragment crosstoolTopPathFragment,
DotdFile dotdFile) {
@@ -232,7 +241,7 @@ public final class CompileCommandLine {
}
@VisibleForTesting
- Builder setCoptsFilter(Predicate<String> filter) {
+ Builder setCoptsFilter(CoptsFilter filter) {
this.coptsFilter = Preconditions.checkNotNull(filter);
return this;
}
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 1968bb9083..c2804a75c6 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
@@ -15,7 +15,6 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -54,13 +53,18 @@ import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CppCompileActionContext.Reply;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
import com.google.devtools.build.lib.rules.cpp.CppHelper.PregreppedHeader;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
+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.util.DependencySet;
import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.build.lib.util.ShellEscaper;
+import com.google.devtools.build.lib.vfs.FileSystemProvider;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -279,7 +283,7 @@ public class CppCompileAction extends AbstractAction
Artifact optionalSourceFile,
ImmutableMap<String, String> localShellEnvironment,
CppCompilationContext context,
- Predicate<String> coptsFilter,
+ CoptsFilter coptsFilter,
Iterable<IncludeScannable> lipoScannables,
ImmutableList<Artifact> additionalIncludeScanningRoots,
UUID actionClassId,
@@ -1344,7 +1348,11 @@ public class CppCompileAction extends AbstractAction
* <li>just an execPath that refers to a virtual .d file that is not written to disk
* </ol>
*/
+ @AutoCodec(dependency = FileSystemProvider.class)
public static class DotdFile {
+ public static final InjectingObjectCodec<DotdFile, FileSystemProvider> CODEC =
+ new CppCompileAction_DotdFile_AutoCodec();
+
private final Artifact artifact;
private final PathFragment execPath;
@@ -1358,6 +1366,13 @@ public class CppCompileAction extends AbstractAction
this.execPath = execPath;
}
+ @AutoCodec.Instantiator
+ @VisibleForSerialization
+ DotdFile(Artifact artifact, PathFragment execPath) {
+ this.artifact = artifact;
+ this.execPath = execPath;
+ }
+
/**
* @return the Artifact or null
*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index 3d9a3d6c6f..d3037ff265 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -16,7 +16,6 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.common.base.Functions;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -30,6 +29,7 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables;
import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile;
@@ -65,7 +65,7 @@ public class CppCompileActionBuilder {
private Artifact gcnoFile;
private CppCompilationContext context = CppCompilationContext.EMPTY;
private final List<String> pluginOpts = new ArrayList<>();
- private Predicate<String> coptsFilter = Predicates.alwaysTrue();
+ private CoptsFilter coptsFilter = CoptsFilter.alwaysPasses();
private ImmutableList<PathFragment> extraSystemIncludePrefixes = ImmutableList.of();
private boolean usePic;
private boolean allowUsingHeaderModules;
@@ -690,7 +690,7 @@ public class CppCompileActionBuilder {
return ccToolchain;
}
- public CppCompileActionBuilder setCoptsFilter(Predicate<String> coptsFilter) {
+ public CppCompileActionBuilder setCoptsFilter(CoptsFilter coptsFilter) {
this.coptsFilter = Preconditions.checkNotNull(coptsFilter);
return this;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
index 6384c8a51f..34c625b5b9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
@@ -17,8 +17,6 @@ package com.google.devtools.build.lib.rules.cpp;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -36,6 +34,7 @@ import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.ExpansionException;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.StringSequenceBuilder;
@@ -183,7 +182,7 @@ public final class CppModel {
private final List<Artifact> compilationMandatoryInputs = new ArrayList<>();
private final List<Artifact> additionalIncludeScanningRoots = new ArrayList<>();
private final ImmutableList<String> copts;
- private final Predicate<String> coptsFilter;
+ private final CoptsFilter coptsFilter;
private boolean fake;
private boolean maySaveTemps;
private CcCompilationOutputs compilationOutputs;
@@ -218,7 +217,7 @@ public final class CppModel {
fdoSupport,
ruleContext.getConfiguration(),
copts,
- Predicates.alwaysTrue());
+ CoptsFilter.alwaysPasses());
}
public CppModel(
@@ -227,7 +226,7 @@ public final class CppModel {
CcToolchainProvider ccToolchain,
FdoSupportProvider fdoSupport,
ImmutableList<String> copts,
- Predicate<String> coptsFilter) {
+ CoptsFilter coptsFilter) {
this(
ruleContext,
semantics,
@@ -245,7 +244,7 @@ public final class CppModel {
FdoSupportProvider fdoSupport,
BuildConfiguration configuration,
ImmutableList<String> copts,
- Predicate<String> coptsFilter) {
+ CoptsFilter coptsFilter) {
this.ruleContext = Preconditions.checkNotNull(ruleContext);
this.semantics = semantics;
this.ccToolchain = Preconditions.checkNotNull(ccToolchain);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java
index 0a497bd8cf..102b895182 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java
@@ -18,7 +18,6 @@ import static java.nio.charset.StandardCharsets.ISO_8859_1;
import static java.util.stream.Collectors.joining;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.ActionExecutionContext;
@@ -33,6 +32,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
import com.google.devtools.build.lib.events.Event;
+import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.util.ShellEscaper;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -75,7 +75,7 @@ public class FakeCppCompileAction extends CppCompileAction {
DotdFile dotdFile,
ImmutableMap<String, String> localShellEnvironment,
CppCompilationContext context,
- Predicate<String> nocopts,
+ CoptsFilter nocopts,
Iterable<IncludeScannable> lipoScannables,
CppSemantics cppSemantics,
CcToolchainProvider cppProvider,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java
index e9a3992fab..513b64269a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java
@@ -15,17 +15,18 @@ package com.google.devtools.build.lib.rules.cpp;
import static com.google.common.truth.Truth.assertThat;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ArtifactRoot;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CompileCommandLine.Builder;
import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile;
import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
import java.util.List;
+import java.util.regex.Pattern;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -130,7 +131,7 @@ public class CompileCommandLineTest extends BuildViewTestCase {
" }",
" }",
"}"))
- .setCoptsFilter(flag -> !flag.contains("i_am_a_flag"))
+ .setCoptsFilter(CoptsFilter.fromRegex(Pattern.compile(".*i_am_a_flag.*")))
.build();
return compileCommandLine.getArgv(scratchArtifact("a/FakeOutput").getExecPath(), null);
}
@@ -139,12 +140,7 @@ public class CompileCommandLineTest extends BuildViewTestCase {
return CompileCommandLine.builder(
scratchArtifact("a/FakeInput"),
scratchArtifact("a/FakeOutput"),
- new Predicate<String>() {
- @Override
- public boolean apply(String s) {
- return true;
- }
- },
+ CoptsFilter.alwaysPasses(),
"c++-compile",
getTargetConfiguration().getFragment(CppConfiguration.class).getCrosstoolTopPathFragment(),
new DotdFile(scratchArtifact("a/dotD")));