// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.exec; import com.google.devtools.build.lib.actions.ResourceSet; import com.google.devtools.build.lib.packages.TestTimeout; import com.google.devtools.build.lib.rules.test.TestStrategy; import com.google.devtools.build.lib.rules.test.TestStrategy.TestOutputFormat; import com.google.devtools.build.lib.rules.test.TestStrategy.TestSummaryFormat; import com.google.devtools.build.lib.util.OptionsUtils; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.Options; import com.google.devtools.common.options.OptionsBase; import java.util.Map; /** * Options affecting the execution phase of a build. * * These options are interpreted by the BuildTool to choose an Executor to * be used for the build. * * Note: from the user's point of view, the characteristic function of this * set of options is indistinguishable from that of the BuildRequestOptions: * they are all per-request. The difference is only apparent in the * implementation: these options are used only by the lib.exec machinery, which * affects how C++ and Java compilation occur. (The BuildRequestOptions * contain a mixture of "semantic" options affecting the choice of targets to * build, and "non-semantic" options affecting the lib.actions machinery.) * Ideally, the user would be unaware of the difference. For now, the usage * strings are identical modulo "part 1", "part 2". */ public class ExecutionOptions extends OptionsBase { public static final ExecutionOptions DEFAULTS = Options.getDefaults(ExecutionOptions.class); @Option(name = "verbose_failures", defaultValue = "false", category = "verbosity", help = "If a command fails, print out the full command line.") public boolean verboseFailures; @Option(name = "subcommands", abbrev = 's', defaultValue = "false", category = "verbosity", help = "Display the subcommands executed during a build.") public boolean showSubcommands; @Option(name = "check_up_to_date", defaultValue = "false", category = "what", help = "Don't perform the build, just check if it is up-to-date. If all targets are " + "up-to-date, the build completes successfully. If any step needs to be executed " + "an error is reported and the build fails.") public boolean checkUpToDate; @Option(name = "check_tests_up_to_date", defaultValue = "false", category = "testing", implicitRequirements = { "--check_up_to_date" }, help = "Don't run tests, just check if they are up-to-date. If all tests results are " + "up-to-date, the testing completes successfully. If any test needs to be built or " + "executed, an error is reported and the testing fails. This option implies " + "--check_up_to_date behavior." ) public boolean testCheckUpToDate; @Option(name = "test_strategy", defaultValue = "", category = "testing", help = "Specifies which strategy to use when running tests.") public String testStrategy; @Option(name = "test_keep_going", defaultValue = "true", category = "testing", help = "When disabled, any non-passing test will cause the entire build to stop. By default " + "all tests are run, even if some do not pass.") public boolean testKeepGoing; @Option(name = "runs_per_test_detects_flakes", defaultValue = "false", category = "testing", help = "If true, any shard in which at least one run/attempt passes and at least one " + "run/attempt fails gets a FLAKY status.") public boolean runsPerTestDetectsFlakes; @Option(name = "flaky_test_attempts", defaultValue = "default", category = "testing", converter = TestStrategy.TestAttemptsConverter.class, help = "Each test will be retried up to the specified number of times in case of any test " + "failure. Tests that required more than one attempt to pass would be marked as " + "'FLAKY' in the test summary. If this option is set, it should specify an int N or the " + "string 'default'. If it's an int, then all tests will be run up to N times. If it is " + "not specified or its value is 'default', then only a single test attempt will be made " + "for regular tests and three for tests marked explicitly as flaky by their rule " + "(flaky=1 attribute).") public int testAttempts; @Option(name = "test_tmpdir", defaultValue = "null", category = "testing", converter = OptionsUtils.PathFragmentConverter.class, help = "Specifies the base temporary directory for 'blaze test' to use.") public PathFragment testTmpDir; @Option(name = "test_output", defaultValue = "summary", category = "testing", converter = TestStrategy.TestOutputFormat.Converter.class, help = "Specifies desired output mode. Valid values are 'summary' to " + "output only test status summary, 'errors' to also print test logs " + "for failed tests, 'all' to print logs for all tests and 'streamed' " + "to output logs for all tests in real time (this will force tests " + "to be executed locally one at a time regardless of --test_strategy " + "value).") public TestOutputFormat testOutput; @Option(name = "test_summary", defaultValue = "short", category = "testing", converter = TestStrategy.TestSummaryFormat.Converter.class, help = "Specifies the desired format ot the test summary. Valid values " + "are 'short' to print information only about tests executed, " + "'terse', to print information only about unsuccessful tests," + "'detailed' to print detailed information about failed test cases, " + "and 'none' to omit the summary.") public TestSummaryFormat testSummary; @Option(name = "test_timeout", defaultValue = "-1", category = "testing", converter = TestTimeout.TestTimeoutConverter.class, help = "Override the default test timeout values for test timeouts (in secs). If a single " + "positive integer value is specified it will override all categories. If 4 comma-" + "separated integers are specified, they will override the timeouts for short, " + "moderate, long and eternal (in that order). In either form, a value of -1 tells blaze " + "to use its default timeouts for that category.") public Map testTimeout; @Option(name = "resource_autosense", defaultValue = "false", category = "strategy", help = "This flag has no effect, and is deprecated") public boolean useResourceAutoSense; @Option(name = "ram_utilization_factor", defaultValue = "67", category = "strategy", help = "Specify what percentage of the system's RAM Blaze should try to use for its " + "subprocesses. " + "This option affects how many processes Blaze will try to run in parallel. " + "If you run several Blaze builds in parallel, using a lower value for " + "this option may avoid thrashing and thus improve overall throughput. " + "Using a value higher than the default is NOT recommended. " + "Note that Blaze's estimates are very coarse, so the actual RAM usage may be much " + "higher or much lower than specified. " + "Note also that this option does not affect the amount of memory that the Blaze " + "server itself will use. " ) public int ramUtilizationPercentage; @Option(name = "local_resources", defaultValue = "null", category = "strategy", help = "Explicitly set amount of local resources available to Blaze. " + "By default, Blaze will query system configuration to estimate amount of RAM (in MB) " + "and number of CPU cores available for the locally executed build actions. It would also " + "assume default I/O capabilities of the local workstation (1.0). This options allows to " + "explicitly set all 3 values. Note, that if this option is used, Blaze will ignore " + "--ram_utilization_factor.", converter = ResourceSet.ResourceSetConverter.class ) public ResourceSet availableResources; @Option(name = "local_test_jobs", defaultValue = "0", category = "testing", help = "The max number of local test jobs to run concurrently. " + "0 means local resources will limit the number of local test jobs to run " + "concurrently instead. Setting this greater than the value for --jobs is ineffectual." ) public int localTestJobs; public boolean usingLocalTestJobs() { return localTestJobs != 0; } }