android13/build/bazel/rules/cc/cc_library_common.bzl

133 lines
5.0 KiB
Python

"""
Copyright (C) 2021 The Android Open Source Project
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.
"""
load("//build/bazel/product_variables:constants.bzl", "constants")
load("@rules_cc//cc:find_cc_toolchain.bzl", "find_cpp_toolchain")
load("@soong_injection//api_levels:api_levels.bzl", "api_levels")
_bionic_targets = ["//bionic/libc", "//bionic/libdl", "//bionic/libm"]
_static_bionic_targets = ["//bionic/libc:libc_bp2build_cc_library_static", "//bionic/libdl:libdl_bp2build_cc_library_static", "//bionic/libm:libm_bp2build_cc_library_static"]
# The default system_dynamic_deps value for cc libraries. This value should be
# used if no value for system_dynamic_deps is specified.
system_dynamic_deps_defaults = select({
constants.ArchVariantToConstraints["linux_bionic"]: _bionic_targets,
constants.ArchVariantToConstraints["android"]: _bionic_targets,
"//conditions:default": [],
})
system_static_deps_defaults = select({
constants.ArchVariantToConstraints["linux_bionic"]: _static_bionic_targets,
constants.ArchVariantToConstraints["android"]: _static_bionic_targets,
"//conditions:default": [],
})
def add_lists_defaulting_to_none(*args):
"""Adds multiple lists, but is well behaved with a `None` default."""
combined = None
for arg in args:
if arg != None:
if combined == None:
combined = []
combined += arg
return combined
# By default, crtbegin/crtend linking is enabled for shared libraries and cc_binary.
def disable_crt_link(features):
return features + ["-link_crt"]
# get_includes_paths expects a rule context, a list of directories, and
# whether the directories are package-relative and returns a list of exec
# root-relative paths. This handles the need to search for files both in the
# source tree and generated files.
def get_includes_paths(ctx, dirs, package_relative = True):
execution_relative_dirs = []
for rel_dir in dirs:
if rel_dir == ".":
rel_dir = ""
execution_rel_dir = rel_dir
if package_relative:
execution_rel_dir = ctx.label.package
if len(rel_dir) > 0:
execution_rel_dir = execution_rel_dir + "/" + rel_dir
execution_relative_dirs.append(execution_rel_dir)
# to support generated files, we also need to export includes relatives to the bin directory
if not execution_rel_dir.startswith("/"):
execution_relative_dirs.append(ctx.bin_dir.path + "/" + execution_rel_dir)
return execution_relative_dirs
def create_ccinfo_for_includes(
ctx,
includes = [],
absolute_includes = [],
system_includes = [],
deps = []):
cc_toolchain = find_cpp_toolchain(ctx)
# Create a compilation context using the string includes of this target.
compilation_context = cc_common.create_compilation_context(
includes = depset(
get_includes_paths(ctx, includes) +
get_includes_paths(ctx, absolute_includes, package_relative = False),
),
system_includes = depset(get_includes_paths(ctx, system_includes)),
)
# Combine this target's compilation context with those of the deps; use only
# the compilation context of the combined CcInfo.
cc_infos = [dep[CcInfo] for dep in deps]
cc_infos += [CcInfo(compilation_context = compilation_context)]
combined_info = cc_common.merge_cc_infos(cc_infos = cc_infos)
return CcInfo(compilation_context = combined_info.compilation_context)
def is_external_directory(package_name):
if package_name.startswith('external'):
return True
if package_name.startswith('hardware'):
paths = package_name.split("/")
if len(paths) < 2:
return True
secondary_path = paths[1]
if secondary_path in ["google", "interfaces", "ril"]:
return True
return secondary_path.startswith("libhardware")
if package_name.startswith("vendor"):
paths = package_name.split("/")
if len(paths) < 2:
return True
secondary_path = paths[1]
return secondary_path.contains("google")
return False
def parse_sdk_version(version):
future_version = "10000"
if version == "" or version == "current":
return future_version
elif version.isdigit() and int(version) in api_levels.values():
return version
elif version in api_levels.keys():
return str(api_levels[version])
# We need to handle this case properly later
elif version == "apex_inherit":
return future_version
else:
fail("Unknown sdk version: %s" % (version))