aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/exec/ExecutionOptions.java
blob: 93d51618a27a7215fde4bd76efbf2079544becaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
// Copyright 2014 Google Inc. 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;
  }
}