149 lines
4.9 KiB
Python
149 lines
4.9 KiB
Python
# Copyright 2018 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.
|
|
|
|
"""android_library rule."""
|
|
|
|
load("@rules_android//rules:acls.bzl", "acls")
|
|
load(":attrs.bzl", _ATTRS = "ATTRS")
|
|
load(":impl.bzl", _impl = "impl")
|
|
load(
|
|
"@rules_android//rules:attrs.bzl",
|
|
_attrs = "attrs",
|
|
)
|
|
|
|
def _outputs(name, _package_name, _defined_local_resources):
|
|
outputs = dict(
|
|
lib_jar = "lib%{name}.jar",
|
|
lib_src_jar = "lib%{name}-src.jar",
|
|
aar = "%{name}.aar",
|
|
)
|
|
|
|
if _defined_local_resources:
|
|
# TODO(b/177261846): resource-related predeclared outputs need to be re-pointed at the
|
|
# corresponding artifacts in the Starlark pipeline.
|
|
label = "//" + _package_name + ":" + name
|
|
if acls.in_android_library_starlark_resource_outputs_rollout(label):
|
|
path_prefix = "_migrated/"
|
|
else:
|
|
path_prefix = ""
|
|
outputs.update(
|
|
dict(
|
|
resources_src_jar = path_prefix + "%{name}.srcjar",
|
|
resources_txt = path_prefix + "%{name}_symbols/R.txt",
|
|
resources_jar = path_prefix + "%{name}_resources.jar",
|
|
),
|
|
)
|
|
|
|
return outputs
|
|
|
|
def make_rule(
|
|
attrs = _ATTRS,
|
|
implementation = _impl,
|
|
outputs = _outputs,
|
|
additional_toolchains = []):
|
|
"""Makes the rule.
|
|
|
|
Args:
|
|
attrs: A dict. The attributes for the rule.
|
|
implementation: A function. The rule's implementation method.
|
|
outputs: A dict, function, or None. The rule's outputs.
|
|
additional_toolchains: A list. Additional toolchains passed to pass to rule(toolchains).
|
|
|
|
Returns:
|
|
A rule.
|
|
"""
|
|
return rule(
|
|
attrs = attrs,
|
|
fragments = [
|
|
"android",
|
|
"java",
|
|
],
|
|
implementation = implementation,
|
|
provides = [
|
|
AndroidCcLinkParamsInfo,
|
|
AndroidIdeInfo,
|
|
AndroidIdlInfo,
|
|
AndroidLibraryResourceClassJarProvider,
|
|
AndroidNativeLibsInfo,
|
|
JavaInfo,
|
|
],
|
|
outputs = outputs,
|
|
toolchains = [
|
|
"@rules_android//toolchains/android:toolchain_type",
|
|
"@rules_android//toolchains/android_sdk:toolchain_type",
|
|
] + additional_toolchains,
|
|
_skylark_testable = True,
|
|
)
|
|
|
|
android_library = make_rule()
|
|
|
|
def _is_defined(name, attrs):
|
|
return name in attrs and attrs[name] != None
|
|
|
|
def attrs_metadata(attrs):
|
|
"""Adds additional metadata for specific android_library attrs.
|
|
|
|
Bazel native rules have additional capabilities when inspecting attrs that
|
|
are not available in Starlark. For example, native rules are able to
|
|
determine if an attribute was set by a user and make decisions based on this
|
|
knowledge - sometimes the behavior may differ if the user specifies the
|
|
default value of the attribute. As such the Starlark android_library uses
|
|
this shim to provide similar capabilities.
|
|
|
|
Args:
|
|
attrs: The attributes passed to the android_library rule.
|
|
|
|
Returns:
|
|
A dictionary containing attr values with additional metadata.
|
|
"""
|
|
|
|
# Required for the outputs.
|
|
attrs["$defined_local_resources"] = bool(
|
|
attrs.get("assets") or
|
|
attrs.get("assets_dir") or
|
|
attrs.get("assets_dir") == "" or
|
|
attrs.get("export_manifest") or
|
|
attrs.get("manifest") or
|
|
attrs.get("resource_files"),
|
|
)
|
|
|
|
# TODO(b/116691720): Remove normalization when bug is fixed.
|
|
if _is_defined("exports_manifest", attrs):
|
|
attrs["exports_manifest"] = _attrs.tristate.normalize(
|
|
attrs.get("exports_manifest"),
|
|
)
|
|
|
|
# TODO(b/127517031): Remove these entries once fixed.
|
|
attrs["$defined_assets"] = _is_defined("assets", attrs)
|
|
attrs["$defined_assets_dir"] = _is_defined("assets_dir", attrs)
|
|
attrs["$defined_idl_import_root"] = _is_defined("idl_import_root", attrs)
|
|
attrs["$defined_idl_parcelables"] = _is_defined("idl_parcelables", attrs)
|
|
attrs["$defined_idl_srcs"] = _is_defined("idl_srcs", attrs)
|
|
|
|
# Required for ACLs check in _outputs(), since the callback can't access
|
|
# the native module.
|
|
attrs["$package_name"] = native.package_name()
|
|
|
|
return attrs
|
|
|
|
def android_library_macro(**attrs):
|
|
"""Bazel android_library rule.
|
|
|
|
https://docs.bazel.build/versions/master/be/android.html#android_library
|
|
|
|
Args:
|
|
**attrs: Rule attributes
|
|
"""
|
|
android_library(**attrs_metadata(attrs))
|