diff options
author | mstaib <mstaib@google.com> | 2018-08-02 08:42:02 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-02 08:43:33 -0700 |
commit | f29f78d19288f6d6e7aea6bc65e6bfa01b2531ad (patch) | |
tree | 80874e57d51e6f3b60c272fee9d4c7229145249c /src/main/java/com/google/devtools/build/lib/analysis | |
parent | ca59cf38088e25a13fa244d8cd30d8a7197779a3 (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.java | 33 |
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, |