aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentOptions.java
blob: 6cdc251dfb3b1a86ce566c0c263329bc876ab045 (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
// 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.analysis.config;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Multimap;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.common.options.Options;
import com.google.devtools.common.options.OptionsBase;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Command-line build options for a Blaze module.
 */
public abstract class FragmentOptions extends OptionsBase implements Cloneable, Serializable {

  /**
   * Adds all labels defined by the options to a multimap. See {@code BuildOptions.getAllLabels()}.
   *
   * <p>There should generally be no code duplication between this code and DefaultsPackage. Either
   * the labels are loaded unconditionally using this method, or they are added as magic labels
   * using the tools/defaults package, but not both.
   *
   * @param labelMap a mutable multimap to which the labels of this fragment should be added
   */
  public void addAllLabels(Multimap<String, Label> labelMap) {
  }

  /**
   * Returns the labels contributed to the defaults package by this fragment.
   *
   * <p>The set of keys returned by this function should be constant, however, the values are
   * allowed to change depending on the value of the options.
   */
  @SuppressWarnings("unused")
  public Map<String, Set<Label>> getDefaultsLabels(BuildConfiguration.Options commonOptions) {
    return ImmutableMap.of();
  }

  /**
   * Returns the extra rules contributed to the default package by this fragment.
   *
   * <p>The return value should be a list of strings, which are merged into the BUILD files of the
   * defaults package.
   *
   * <p><strong>WARNING;</strong> this method should only be used when absolutely necessary. Always
   * prefer {@code getDefaultsLabels()} to this.
   */
  public ImmutableList<String> getDefaultsRules() {
    return ImmutableList.of();
  }

  /**
   * Returns a list of potential split configuration transitions for this fragment. Split
   * configurations usually need to be explicitly enabled by passing in an option.
   */
  public List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() {
    return ImmutableList.of();
  }

  /**
   * Returns true if actions should be enabled for this configuration. If <b>any</b> fragment
   * sets this to false, <i>all</i> actions are disabled for the configuration.
   *
   * <p>Disabling actions is unusual behavior that should only be triggered under exceptionally
   * special circumstances. In practice this only exists to support LIPO in C++. Don't override
   * this method for any other purpose.
   */
  public boolean enableActions() {
    return true;
  }

  @Override
  public FragmentOptions clone() {
    try {
      return (FragmentOptions) super.clone();
    } catch (CloneNotSupportedException e) {
      // This can't happen.
      throw new IllegalStateException(e);
    }
  }

  /**
   * Creates a new FragmentOptions instance with all flags set to default.
   */
  public FragmentOptions getDefault() {
    return Options.getDefaults(getClass());
  }

  /**
   * Creates a new FragmentOptions instance with flags adjusted to host platform.
   *
   * @param fallback see {@code BuildOptions.createHostOptions}
   */
  @SuppressWarnings("unused")
  public FragmentOptions getHost(boolean fallback) {
    return getDefault();
  }

  protected void addOptionalLabel(Multimap<String, Label> map, String key, String value) {
    Label label = parseOptionalLabel(value);
    if (label != null) {
      map.put(key, label);
    }
  }

  private static Label parseOptionalLabel(String value) {
    if (value != null) {
      try {
        return Label.parseAbsolute(value);
      } catch (LabelSyntaxException e) {
        // We ignore this exception here - it will cause an error message at a later time.
        // TODO(bazel-team): We can use a Converter to check the validity of the crosstoolTop
        // earlier.
        return null;
      }
    } else {
      return null;
    }
  }

  /**
   * Returns {@code true} if static configurations should be used with
   * {@link BuildConfiguration.Options.DynamicConfigsMode.NOTRIM_PARTIAL}.
   */
  public boolean useStaticConfigurationsOverride() {
    return false;
  }
}