diff options
author | 2018-02-07 15:01:44 -0800 | |
---|---|---|
committer | 2018-02-07 15:03:59 -0800 | |
commit | beb66e0fb63ce5cff2da8faa58ff9a55887affb3 (patch) | |
tree | d5f62c3d6deec1befbb8b92659bdb9e97c56602c /src | |
parent | 342f9fdd1444d90dec61c60c08ed2aa62a862860 (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')
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"))); |