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