aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis
diff options
context:
space:
mode:
authorGravatar mstaib <mstaib@google.com>2018-08-02 08:42:02 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-08-02 08:43:33 -0700
commitf29f78d19288f6d6e7aea6bc65e6bfa01b2531ad (patch)
tree80874e57d51e6f3b60c272fee9d4c7229145249c /src/main/java/com/google/devtools/build/lib/analysis
parentca59cf38088e25a13fa244d8cd30d8a7197779a3 (diff)
Keep the analysis cache between builds when only trimmed test options change.
When --trim_test_configuration is on and the only options which have changed are from the (trimmed) TestOptions (not counting trim_test_configuration itself), preserve the analysis cache rather than dropping it all. This means that as long as no non-test options change, non-test rules will not need to be reanalyzed. This also applies to test rules which were analyzed with this configuration since the last time non-test options changed. For example: --test_arg=A //test (//test and its dependencies are analyzed) --test_arg=B //test (only //test is reanalyzed) --test_arg=A //test (no reanalysis needed) --test_arg=A --define=Test=A //test (full reanalysis) --test_arg=A //test (full reanalysis) RELNOTES: None. PiperOrigin-RevId: 207105915
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java
index ea9c9e9281..0d2f85b1cb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java
@@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+import com.google.common.collect.MoreCollectors;
+import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.OptionsDiffPredicate;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelConverter;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
@@ -31,8 +33,10 @@ import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.util.RegexFilter;
import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDefinition;
import com.google.devtools.common.options.OptionDocumentationCategory;
import com.google.devtools.common.options.OptionEffectTag;
+import com.google.devtools.common.options.OptionsParser;
import com.google.devtools.common.options.OptionsParsingException;
import com.google.devtools.common.options.TriState;
import java.util.Collections;
@@ -43,8 +47,37 @@ import java.util.Set;
/** Test-related options. */
@AutoCodec
public class TestConfiguration extends Fragment {
+ public static final OptionsDiffPredicate HAVE_OPTIONS_AFFECTING_NON_TEST_TARGETS_CHANGED =
+ (diff, options) -> {
+ if (!options.contains(TestOptions.class)) {
+ // if there's a diff and there are no test options, a non-test option definitely changed
+ return true;
+ }
+ if (!options.get(TestOptions.class).trimTestConfiguration) {
+ // if trimTestConfiguration is off, test options affect all targets
+ return true;
+ }
+ for (OptionDefinition changedOption : diff.getFirst().keySet()) {
+ if (TestOptions.TRIM_TEST_CONFIGURATION.equals(changedOption)) {
+ // toggling trimTestConfiguration affects all non-test targets
+ return true;
+ }
+ if (!changedOption.getField().getDeclaringClass().equals(TestOptions.class)) {
+ // only TestOptions are trimmed; options from other classes affect all targets
+ return true;
+ }
+ }
+ return false;
+ };
+
/** Command-line options. */
public static class TestOptions extends FragmentOptions {
+ private static final OptionDefinition TRIM_TEST_CONFIGURATION =
+ OptionsParser.getOptionDefinitions(TestOptions.class)
+ .stream()
+ .filter(definition -> definition.getOptionName().equals("trim_test_configuration"))
+ .collect(MoreCollectors.onlyElement());
+
@Option(
name = "test_filter",
allowMultiple = false,