xref: /aosp_15_r20/external/bazelbuild-rules_android/rules/attrs.bzl (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
1*9e965d6fSRomain Jobredeaux# Copyright 2018 The Bazel Authors. All rights reserved.
2*9e965d6fSRomain Jobredeaux#
3*9e965d6fSRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License");
4*9e965d6fSRomain Jobredeaux# you may not use this file except in compliance with the License.
5*9e965d6fSRomain Jobredeaux# You may obtain a copy of the License at
6*9e965d6fSRomain Jobredeaux#
7*9e965d6fSRomain Jobredeaux#    http://www.apache.org/licenses/LICENSE-2.0
8*9e965d6fSRomain Jobredeaux#
9*9e965d6fSRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software
10*9e965d6fSRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS,
11*9e965d6fSRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e965d6fSRomain Jobredeaux# See the License for the specific language governing permissions and
13*9e965d6fSRomain Jobredeaux# limitations under the License.
14*9e965d6fSRomain Jobredeaux
15*9e965d6fSRomain Jobredeaux"""Common attributes for Android rules."""
16*9e965d6fSRomain Jobredeaux
17*9e965d6fSRomain Jobredeauxload(":utils.bzl", "log")
18*9e965d6fSRomain Jobredeauxload(":native_toolchain_attrs.bzl", "ANDROID_SDK_TOOLCHAIN_TYPE_DEFAULT")
19*9e965d6fSRomain Jobredeaux
20*9e965d6fSRomain Jobredeauxdef _add(attrs, *others):
21*9e965d6fSRomain Jobredeaux    new = {}
22*9e965d6fSRomain Jobredeaux    new.update(attrs)
23*9e965d6fSRomain Jobredeaux    for o in others:
24*9e965d6fSRomain Jobredeaux        for name in o.keys():
25*9e965d6fSRomain Jobredeaux            if name in new:
26*9e965d6fSRomain Jobredeaux                log.error("Attr '%s' is defined twice." % name)
27*9e965d6fSRomain Jobredeaux            new[name] = o[name]
28*9e965d6fSRomain Jobredeaux    return new
29*9e965d6fSRomain Jobredeaux
30*9e965d6fSRomain Jobredeauxdef _replace(attrs, **kwargs):
31*9e965d6fSRomain Jobredeaux    # Verify that new values are replacing existing ones, not adding.
32*9e965d6fSRomain Jobredeaux    for name in kwargs.keys():
33*9e965d6fSRomain Jobredeaux        if name not in attrs:
34*9e965d6fSRomain Jobredeaux            log.error("Attr '%s' is not defined, replacement failed." % name)
35*9e965d6fSRomain Jobredeaux    new = dict()
36*9e965d6fSRomain Jobredeaux    new.update(attrs)
37*9e965d6fSRomain Jobredeaux    new.update(kwargs)
38*9e965d6fSRomain Jobredeaux    return new
39*9e965d6fSRomain Jobredeaux
40*9e965d6fSRomain Jobredeauxdef _make_tristate_attr(default, doc = "", mandatory = False):
41*9e965d6fSRomain Jobredeaux    return attr.int(
42*9e965d6fSRomain Jobredeaux        default = default,
43*9e965d6fSRomain Jobredeaux        doc = doc,
44*9e965d6fSRomain Jobredeaux        mandatory = mandatory,
45*9e965d6fSRomain Jobredeaux        values = [-1, 0, 1],
46*9e965d6fSRomain Jobredeaux    )
47*9e965d6fSRomain Jobredeaux
48*9e965d6fSRomain Jobredeauxdef _normalize_tristate(attr_value):
49*9e965d6fSRomain Jobredeaux    """Normalizes the tristate value going into a rule.
50*9e965d6fSRomain Jobredeaux
51*9e965d6fSRomain Jobredeaux    This is required because "tristate" is not officially supported as an
52*9e965d6fSRomain Jobredeaux    attribute type. An equivalent attribute type is an in with a constrained
53*9e965d6fSRomain Jobredeaux    set of values, namely [-1, 0, 1]. Unfortunately, tristate accepts
54*9e965d6fSRomain Jobredeaux    multiple types, integers, booleans and strings ("auto"). As a result, this
55*9e965d6fSRomain Jobredeaux    method normalizes the inputs to an integer.
56*9e965d6fSRomain Jobredeaux
57*9e965d6fSRomain Jobredeaux    This method needs to be applied to attributes that were formally tristate
58*9e965d6fSRomain Jobredeaux    to normalize the inputs.
59*9e965d6fSRomain Jobredeaux    """
60*9e965d6fSRomain Jobredeaux    if type(attr_value) == "int":
61*9e965d6fSRomain Jobredeaux        return attr_value
62*9e965d6fSRomain Jobredeaux
63*9e965d6fSRomain Jobredeaux    if type(attr_value) == "string":
64*9e965d6fSRomain Jobredeaux        if attr_value.lower() == "auto":
65*9e965d6fSRomain Jobredeaux            return -1
66*9e965d6fSRomain Jobredeaux
67*9e965d6fSRomain Jobredeaux    if type(attr_value) == "bool":
68*9e965d6fSRomain Jobredeaux        return int(attr_value)
69*9e965d6fSRomain Jobredeaux
70*9e965d6fSRomain Jobredeaux    return attr_value  # Return unknown type, let the rule fail.
71*9e965d6fSRomain Jobredeaux
72*9e965d6fSRomain Jobredeaux_tristate = struct(
73*9e965d6fSRomain Jobredeaux    create = _make_tristate_attr,
74*9e965d6fSRomain Jobredeaux    normalize = _normalize_tristate,
75*9e965d6fSRomain Jobredeaux    yes = 1,
76*9e965d6fSRomain Jobredeaux    no = 0,
77*9e965d6fSRomain Jobredeaux    auto = -1,
78*9e965d6fSRomain Jobredeaux)
79*9e965d6fSRomain Jobredeaux
80*9e965d6fSRomain Jobredeaux_JAVA_RUNTIME = dict(
81*9e965d6fSRomain Jobredeaux    _host_javabase = attr.label(
82*9e965d6fSRomain Jobredeaux        cfg = "exec",
83*9e965d6fSRomain Jobredeaux        default = Label("//tools/jdk:current_java_runtime"),
84*9e965d6fSRomain Jobredeaux    ),
85*9e965d6fSRomain Jobredeaux)
86*9e965d6fSRomain Jobredeaux
87*9e965d6fSRomain Jobredeaux
88*9e965d6fSRomain Jobredeaux# Android SDK attribute.
89*9e965d6fSRomain Jobredeaux_ANDROID_SDK = dict(
90*9e965d6fSRomain Jobredeaux    _android_sdk = attr.label(
91*9e965d6fSRomain Jobredeaux        allow_rules = ["android_sdk"],
92*9e965d6fSRomain Jobredeaux        default = configuration_field(
93*9e965d6fSRomain Jobredeaux            fragment = "android",
94*9e965d6fSRomain Jobredeaux            name = "android_sdk_label",
95*9e965d6fSRomain Jobredeaux        ),
96*9e965d6fSRomain Jobredeaux        providers = [AndroidSdkInfo],
97*9e965d6fSRomain Jobredeaux    ),
98*9e965d6fSRomain Jobredeaux)
99*9e965d6fSRomain Jobredeaux
100*9e965d6fSRomain Jobredeaux# Compilation attributes for Android rules.
101*9e965d6fSRomain Jobredeaux_COMPILATION = _add(
102*9e965d6fSRomain Jobredeaux    dict(
103*9e965d6fSRomain Jobredeaux        assets = attr.label_list(
104*9e965d6fSRomain Jobredeaux            allow_files = True,
105*9e965d6fSRomain Jobredeaux            cfg = "target",
106*9e965d6fSRomain Jobredeaux            doc = ("The list of assets to be packaged. This is typically a glob of " +
107*9e965d6fSRomain Jobredeaux                   "all files under the assets directory. You can also reference " +
108*9e965d6fSRomain Jobredeaux                   "other rules (any rule that produces files) or exported files in " +
109*9e965d6fSRomain Jobredeaux                   "the other packages, as long as all those files are under the " +
110*9e965d6fSRomain Jobredeaux                   "assets_dir directory in the corresponding package."),
111*9e965d6fSRomain Jobredeaux        ),
112*9e965d6fSRomain Jobredeaux        assets_dir = attr.string(
113*9e965d6fSRomain Jobredeaux            doc = ("The string giving the path to the files in assets. " +
114*9e965d6fSRomain Jobredeaux                   "The pair assets and assets_dir describe packaged assets and either both " +
115*9e965d6fSRomain Jobredeaux                   "attributes should be provided or none of them."),
116*9e965d6fSRomain Jobredeaux        ),
117*9e965d6fSRomain Jobredeaux        custom_package = attr.string(
118*9e965d6fSRomain Jobredeaux            doc = ("Java package for which java sources will be generated. " +
119*9e965d6fSRomain Jobredeaux                   "By default the package is inferred from the directory where the BUILD file " +
120*9e965d6fSRomain Jobredeaux                   "containing the rule is. You can specify a different package but this is " +
121*9e965d6fSRomain Jobredeaux                   "highly discouraged since it can introduce classpath conflicts with other " +
122*9e965d6fSRomain Jobredeaux                   "libraries that will only be detected at runtime."),
123*9e965d6fSRomain Jobredeaux        ),
124*9e965d6fSRomain Jobredeaux        manifest = attr.label(
125*9e965d6fSRomain Jobredeaux            allow_single_file = [".xml"],
126*9e965d6fSRomain Jobredeaux            doc = ("The name of the Android manifest file, normally " +
127*9e965d6fSRomain Jobredeaux                   "AndroidManifest.xml. Must be defined if resource_files or assets are defined."),
128*9e965d6fSRomain Jobredeaux        ),
129*9e965d6fSRomain Jobredeaux        resource_files = attr.label_list(
130*9e965d6fSRomain Jobredeaux            allow_files = True,
131*9e965d6fSRomain Jobredeaux            doc = ("The list of resources to be packaged. This " +
132*9e965d6fSRomain Jobredeaux                   "is typically a glob of all files under the res directory. Generated files " +
133*9e965d6fSRomain Jobredeaux                   "(from genrules) can be referenced by Label here as well. The only " +
134*9e965d6fSRomain Jobredeaux                   "restriction is that the generated outputs must be under the same \"res\" " +
135*9e965d6fSRomain Jobredeaux                   "directory as any other resource files that are included."),
136*9e965d6fSRomain Jobredeaux        ),
137*9e965d6fSRomain Jobredeaux        data = attr.label_list(
138*9e965d6fSRomain Jobredeaux            allow_files = True,
139*9e965d6fSRomain Jobredeaux            doc = (
140*9e965d6fSRomain Jobredeaux                "Files needed by this rule at runtime. May list file or rule targets. Generally allows any target.\n\n" +
141*9e965d6fSRomain Jobredeaux                "The default outputs and runfiles of targets in the `data` attribute should appear in the `*.runfiles` area of" +
142*9e965d6fSRomain Jobredeaux                "any executable which is output by or has a runtime dependency on this target. " +
143*9e965d6fSRomain Jobredeaux                "This may include data files or binaries used when this target's " +
144*9e965d6fSRomain Jobredeaux                "[srcs](https://docs.bazel.build/versions/main/be/common-definitions.html#typical.srcs) are executed. " +
145*9e965d6fSRomain Jobredeaux                "See the [data dependencies](https://docs.bazel.build/versions/main/build-ref.html#data) section " +
146*9e965d6fSRomain Jobredeaux                "for more information about how to depend on and use data files.\n\n" +
147*9e965d6fSRomain Jobredeaux                "New rules should define a `data` attribute if they process inputs which might use other inputs at runtime. " +
148*9e965d6fSRomain Jobredeaux                "Rules' implementation functions must also " +
149*9e965d6fSRomain Jobredeaux                "[populate the target's runfiles](https://docs.bazel.build/versions/main/skylark/rules.html#runfiles) " +
150*9e965d6fSRomain Jobredeaux                "from the outputs and runfiles of any `data` attribute, as well as runfiles from any dependency attribute " +
151*9e965d6fSRomain Jobredeaux                "which provides either source code or runtime dependencies."
152*9e965d6fSRomain Jobredeaux            ),
153*9e965d6fSRomain Jobredeaux        ),
154*9e965d6fSRomain Jobredeaux        plugins = attr.label_list(
155*9e965d6fSRomain Jobredeaux            providers = [JavaPluginInfo],
156*9e965d6fSRomain Jobredeaux            cfg = "exec",
157*9e965d6fSRomain Jobredeaux            doc = (
158*9e965d6fSRomain Jobredeaux                "Java compiler plugins to run at compile-time. " +
159*9e965d6fSRomain Jobredeaux                "Every `java_plugin` specified in the plugins attribute will be run whenever this rule is built. " +
160*9e965d6fSRomain Jobredeaux                "A library may also inherit plugins from dependencies that use [exported_plugins](https://docs.bazel.build/versions/main/be/java.html#java_library.exported_plugins). " +
161*9e965d6fSRomain Jobredeaux                "Resources generated by the plugin will be included in the resulting jar of this rule."
162*9e965d6fSRomain Jobredeaux            ),
163*9e965d6fSRomain Jobredeaux        ),
164*9e965d6fSRomain Jobredeaux        javacopts = attr.string_list(
165*9e965d6fSRomain Jobredeaux            doc = (
166*9e965d6fSRomain Jobredeaux                "Extra compiler options for this library. " +
167*9e965d6fSRomain Jobredeaux                "Subject to \"[Make variable](https://docs.bazel.build/versions/main/be/make-variables.html)\" substitution and " +
168*9e965d6fSRomain Jobredeaux                "[Bourne shell tokenization](https://docs.bazel.build/versions/main/be/common-definitions.html#sh-tokenization).\n" +
169*9e965d6fSRomain Jobredeaux                "These compiler options are passed to javac after the global compiler options."
170*9e965d6fSRomain Jobredeaux            ),
171*9e965d6fSRomain Jobredeaux        ),
172*9e965d6fSRomain Jobredeaux        # TODO: Expose getPlugins() in JavaConfiguration.java
173*9e965d6fSRomain Jobredeaux        #       com/google/devtools/build/lib/rules/java/JavaConfiguration.java
174*9e965d6fSRomain Jobredeaux        #       com/google/devtools/build/lib/rules/java/JavaOptions.java
175*9e965d6fSRomain Jobredeaux        #
176*9e965d6fSRomain Jobredeaux        # _java_plugins = attr.label(
177*9e965d6fSRomain Jobredeaux        #     allow_rules = ["java_plugin"],
178*9e965d6fSRomain Jobredeaux        #     default = configuration_field(
179*9e965d6fSRomain Jobredeaux        #         fragment = "java",
180*9e965d6fSRomain Jobredeaux        #         name = "plugin",
181*9e965d6fSRomain Jobredeaux        #     ),
182*9e965d6fSRomain Jobredeaux        # ),
183*9e965d6fSRomain Jobredeaux    ),
184*9e965d6fSRomain Jobredeaux    _JAVA_RUNTIME,
185*9e965d6fSRomain Jobredeaux)
186*9e965d6fSRomain Jobredeaux
187*9e965d6fSRomain Jobredeaux# Attributes for rules that use the AndroidDataContext android_data.make_context
188*9e965d6fSRomain Jobredeaux_DATA_CONTEXT = _add(
189*9e965d6fSRomain Jobredeaux    dict(
190*9e965d6fSRomain Jobredeaux        # Additional attrs needed for AndroidDataContext
191*9e965d6fSRomain Jobredeaux        _add_g3itr_xslt = attr.label(
192*9e965d6fSRomain Jobredeaux            cfg = "exec",
193*9e965d6fSRomain Jobredeaux            default = Label("//tools/android/xslt:add_g3itr.xslt"),
194*9e965d6fSRomain Jobredeaux            allow_single_file = True,
195*9e965d6fSRomain Jobredeaux        ),
196*9e965d6fSRomain Jobredeaux        _android_manifest_merge_tool = attr.label(
197*9e965d6fSRomain Jobredeaux            cfg = "exec",
198*9e965d6fSRomain Jobredeaux            default = Label("//tools/android:merge_manifests"),
199*9e965d6fSRomain Jobredeaux            executable = True,
200*9e965d6fSRomain Jobredeaux        ),
201*9e965d6fSRomain Jobredeaux        # TODO(b/145617058) Switching back to head RPBB until the Android rules release process is improved
202*9e965d6fSRomain Jobredeaux        _android_resources_busybox = attr.label(
203*9e965d6fSRomain Jobredeaux            cfg = "exec",
204*9e965d6fSRomain Jobredeaux            default = Label("//rules:ResourceProcessorBusyBox"),
205*9e965d6fSRomain Jobredeaux            executable = True,
206*9e965d6fSRomain Jobredeaux        ),
207*9e965d6fSRomain Jobredeaux        _xsltproc_tool = attr.label(
208*9e965d6fSRomain Jobredeaux            cfg = "exec",
209*9e965d6fSRomain Jobredeaux            default = Label("//tools/android/xslt:xslt"),
210*9e965d6fSRomain Jobredeaux            allow_files = True,
211*9e965d6fSRomain Jobredeaux        ),
212*9e965d6fSRomain Jobredeaux    ),
213*9e965d6fSRomain Jobredeaux    _ANDROID_SDK,
214*9e965d6fSRomain Jobredeaux)
215*9e965d6fSRomain Jobredeaux
216*9e965d6fSRomain Jobredeaux
217*9e965d6fSRomain Jobredeaux
218*9e965d6fSRomain Jobredeaux
219*9e965d6fSRomain Jobredeaux
220*9e965d6fSRomain Jobredeaux
221*9e965d6fSRomain Jobredeaux
222*9e965d6fSRomain JobredeauxANDROID_SDK_ATTRS = dict(
223*9e965d6fSRomain Jobredeaux    aapt = attr.label(
224*9e965d6fSRomain Jobredeaux        allow_single_file = True,
225*9e965d6fSRomain Jobredeaux        cfg = "exec",
226*9e965d6fSRomain Jobredeaux        executable = True,
227*9e965d6fSRomain Jobredeaux        mandatory = True,
228*9e965d6fSRomain Jobredeaux    ),
229*9e965d6fSRomain Jobredeaux    aapt2 = attr.label(
230*9e965d6fSRomain Jobredeaux        allow_single_file = True,
231*9e965d6fSRomain Jobredeaux        cfg = "exec",
232*9e965d6fSRomain Jobredeaux        executable = True,
233*9e965d6fSRomain Jobredeaux    ),
234*9e965d6fSRomain Jobredeaux    aidl = attr.label(
235*9e965d6fSRomain Jobredeaux        allow_files = True,
236*9e965d6fSRomain Jobredeaux        cfg = "exec",
237*9e965d6fSRomain Jobredeaux        executable = True,
238*9e965d6fSRomain Jobredeaux        mandatory = True,
239*9e965d6fSRomain Jobredeaux    ),
240*9e965d6fSRomain Jobredeaux    aidl_lib = attr.label(
241*9e965d6fSRomain Jobredeaux        allow_files = [".jar"],
242*9e965d6fSRomain Jobredeaux    ),
243*9e965d6fSRomain Jobredeaux    android_jar = attr.label(
244*9e965d6fSRomain Jobredeaux        allow_single_file = [".jar"],
245*9e965d6fSRomain Jobredeaux        cfg = "exec",
246*9e965d6fSRomain Jobredeaux        mandatory = True,
247*9e965d6fSRomain Jobredeaux    ),
248*9e965d6fSRomain Jobredeaux    annotations_jar = attr.label(
249*9e965d6fSRomain Jobredeaux        allow_single_file = [".jar"],
250*9e965d6fSRomain Jobredeaux        cfg = "exec",
251*9e965d6fSRomain Jobredeaux    ),
252*9e965d6fSRomain Jobredeaux    apkbuilder = attr.label(
253*9e965d6fSRomain Jobredeaux        allow_files = True,
254*9e965d6fSRomain Jobredeaux        cfg = "exec",
255*9e965d6fSRomain Jobredeaux        executable = True,
256*9e965d6fSRomain Jobredeaux    ),
257*9e965d6fSRomain Jobredeaux    apksigner = attr.label(
258*9e965d6fSRomain Jobredeaux        allow_files = True,
259*9e965d6fSRomain Jobredeaux        cfg = "exec",
260*9e965d6fSRomain Jobredeaux        executable = True,
261*9e965d6fSRomain Jobredeaux        mandatory = True,
262*9e965d6fSRomain Jobredeaux    ),
263*9e965d6fSRomain Jobredeaux    adb = attr.label(
264*9e965d6fSRomain Jobredeaux        allow_single_file = True,
265*9e965d6fSRomain Jobredeaux        cfg = "exec",
266*9e965d6fSRomain Jobredeaux        executable = True,
267*9e965d6fSRomain Jobredeaux        mandatory = True,
268*9e965d6fSRomain Jobredeaux    ),
269*9e965d6fSRomain Jobredeaux    build_tools_version = attr.string(),
270*9e965d6fSRomain Jobredeaux    dexdump = attr.label(
271*9e965d6fSRomain Jobredeaux        allow_files = True,
272*9e965d6fSRomain Jobredeaux        cfg = "exec",
273*9e965d6fSRomain Jobredeaux        executable = True,
274*9e965d6fSRomain Jobredeaux        mandatory = False,
275*9e965d6fSRomain Jobredeaux    ),
276*9e965d6fSRomain Jobredeaux    dx = attr.label(
277*9e965d6fSRomain Jobredeaux        allow_files = True,
278*9e965d6fSRomain Jobredeaux        cfg = "exec",
279*9e965d6fSRomain Jobredeaux        executable = True,
280*9e965d6fSRomain Jobredeaux        mandatory = True,
281*9e965d6fSRomain Jobredeaux    ),
282*9e965d6fSRomain Jobredeaux    framework_aidl = attr.label(
283*9e965d6fSRomain Jobredeaux        allow_single_file = True,
284*9e965d6fSRomain Jobredeaux        cfg = "exec",
285*9e965d6fSRomain Jobredeaux        mandatory = True,
286*9e965d6fSRomain Jobredeaux    ),
287*9e965d6fSRomain Jobredeaux    legacy_main_dex_list_generator = attr.label(
288*9e965d6fSRomain Jobredeaux        allow_files = True,
289*9e965d6fSRomain Jobredeaux        cfg = "exec",
290*9e965d6fSRomain Jobredeaux        executable = True,
291*9e965d6fSRomain Jobredeaux    ),
292*9e965d6fSRomain Jobredeaux    main_dex_classes = attr.label(
293*9e965d6fSRomain Jobredeaux        allow_single_file = True,
294*9e965d6fSRomain Jobredeaux        cfg = "exec",
295*9e965d6fSRomain Jobredeaux        mandatory = True,
296*9e965d6fSRomain Jobredeaux    ),
297*9e965d6fSRomain Jobredeaux    main_dex_list_creator = attr.label(
298*9e965d6fSRomain Jobredeaux        allow_files = True,
299*9e965d6fSRomain Jobredeaux        cfg = "exec",
300*9e965d6fSRomain Jobredeaux        executable = True,
301*9e965d6fSRomain Jobredeaux        mandatory = True,
302*9e965d6fSRomain Jobredeaux    ),
303*9e965d6fSRomain Jobredeaux    proguard = attr.label(
304*9e965d6fSRomain Jobredeaux        allow_files = True,
305*9e965d6fSRomain Jobredeaux        cfg = "exec",
306*9e965d6fSRomain Jobredeaux        executable = True,
307*9e965d6fSRomain Jobredeaux        mandatory = True,
308*9e965d6fSRomain Jobredeaux    ),
309*9e965d6fSRomain Jobredeaux    shrinked_android_jar = attr.label(
310*9e965d6fSRomain Jobredeaux        allow_single_file = True,
311*9e965d6fSRomain Jobredeaux        cfg = "exec",
312*9e965d6fSRomain Jobredeaux    ),
313*9e965d6fSRomain Jobredeaux    source_properties = attr.label(
314*9e965d6fSRomain Jobredeaux        allow_single_file = True,
315*9e965d6fSRomain Jobredeaux        cfg = "exec",
316*9e965d6fSRomain Jobredeaux    ),
317*9e965d6fSRomain Jobredeaux    zipalign = attr.label(
318*9e965d6fSRomain Jobredeaux        allow_single_file = True,
319*9e965d6fSRomain Jobredeaux        cfg = "exec",
320*9e965d6fSRomain Jobredeaux        executable = True,
321*9e965d6fSRomain Jobredeaux        mandatory = True,
322*9e965d6fSRomain Jobredeaux    ),
323*9e965d6fSRomain Jobredeaux    _proguard = attr.label(
324*9e965d6fSRomain Jobredeaux        cfg = "exec",
325*9e965d6fSRomain Jobredeaux        default = configuration_field(
326*9e965d6fSRomain Jobredeaux            fragment = "java",
327*9e965d6fSRomain Jobredeaux            name = "proguard_top",
328*9e965d6fSRomain Jobredeaux        ),
329*9e965d6fSRomain Jobredeaux    ),
330*9e965d6fSRomain Jobredeaux    _system = attr.label(
331*9e965d6fSRomain Jobredeaux        default = Label("//tools/android:bootclasspath_android_only"),
332*9e965d6fSRomain Jobredeaux    ),
333*9e965d6fSRomain Jobredeaux)
334*9e965d6fSRomain Jobredeaux
335*9e965d6fSRomain Jobredeaux# Attributes for resolving platform-based toolchains. Only needed by the native
336*9e965d6fSRomain Jobredeaux# DexArchiveAspect.
337*9e965d6fSRomain Jobredeaux_ANDROID_TOOLCHAIN_ATTRS = dict(
338*9e965d6fSRomain Jobredeaux    _android_sdk_toolchain_type = attr.label(
339*9e965d6fSRomain Jobredeaux        allow_rules = ["toolchain_type"],
340*9e965d6fSRomain Jobredeaux        default = ANDROID_SDK_TOOLCHAIN_TYPE_DEFAULT,
341*9e965d6fSRomain Jobredeaux    ),
342*9e965d6fSRomain Jobredeaux)
343*9e965d6fSRomain Jobredeaux
344*9e965d6fSRomain JobredeauxANDROID_TOOLS_DEFAULTS_JAR_ATTRS = _add(_ANDROID_SDK)
345*9e965d6fSRomain Jobredeaux
346*9e965d6fSRomain Jobredeaux_AUTOMATIC_EXEC_GROUPS_ENABLED = dict(
347*9e965d6fSRomain Jobredeaux    _use_auto_exec_groups = attr.bool(default = True),
348*9e965d6fSRomain Jobredeaux)
349*9e965d6fSRomain Jobredeaux
350*9e965d6fSRomain Jobredeauxattrs = struct(
351*9e965d6fSRomain Jobredeaux    ANDROID_SDK = _ANDROID_SDK,
352*9e965d6fSRomain Jobredeaux    COMPILATION = _COMPILATION,
353*9e965d6fSRomain Jobredeaux    DATA_CONTEXT = _DATA_CONTEXT,
354*9e965d6fSRomain Jobredeaux    JAVA_RUNTIME = _JAVA_RUNTIME,
355*9e965d6fSRomain Jobredeaux    ANDROID_TOOLCHAIN_ATTRS = _ANDROID_TOOLCHAIN_ATTRS,
356*9e965d6fSRomain Jobredeaux    tristate = _tristate,
357*9e965d6fSRomain Jobredeaux    add = _add,
358*9e965d6fSRomain Jobredeaux    replace = _replace,
359*9e965d6fSRomain Jobredeaux    AUTOMATIC_EXEC_GROUPS_ENABLED = _AUTOMATIC_EXEC_GROUPS_ENABLED,
360*9e965d6fSRomain Jobredeaux)
361