blob: 96597c01ed76c23d1a564ba6d8fe86dd404d8f24 [file] [log] [blame]
// 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, Integer> 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;
}
}