blob: d5b1801b7d9ddb501a0211485ebcf10649d787f8 [file] [log] [blame]
load("@rules_cc//cc:find_cc_toolchain.bzl", "find_cpp_toolchain")
load(":cc_constants.bzl", "constants")
# "cc_object" module copts, taken from build/soong/cc/object.go
_CC_OBJECT_COPTS = ["-fno-addrsig"]
# partialLd module link opts, taken from build/soong/cc/builder.go
# https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/builder.go;l=87;drc=f2be52c4dcc2e3d743318e106633e61de0ad2afd
_CC_OBJECT_LINKOPTS = [
"-fuse-ld=lld",
"-nostdlib",
"-no-pie",
"-Wl,-r",
]
CcObjectInfo = provider(fields = [
# The merged compilation outputs for this cc_object and its transitive
# dependencies.
"objects",
])
def split_srcs_hdrs(files):
headers = []
non_headers = []
for f in files:
if f.extension in constants.hdr_exts:
headers += [f]
else:
non_headers += [f]
return non_headers, headers
def _cc_object_impl(ctx):
cc_toolchain = find_cpp_toolchain(ctx)
feature_configuration = cc_common.configure_features(
ctx = ctx,
cc_toolchain = cc_toolchain,
requested_features = ctx.features,
unsupported_features = ctx.disabled_features + ["linker_flags"],
)
compilation_contexts = []
deps_objects = []
for obj in ctx.attr.deps:
compilation_contexts.append(obj[CcInfo].compilation_context)
deps_objects.append(obj[CcObjectInfo].objects)
product_variables = ctx.attr._android_product_variables[platform_common.TemplateVariableInfo]
asflags = [ctx.expand_make_variables("asflags", flag, product_variables.variables) for flag in ctx.attr.asflags]
srcs, private_hdrs = split_srcs_hdrs(ctx.files.srcs)
(compilation_context, compilation_outputs) = cc_common.compile(
name = ctx.label.name,
actions = ctx.actions,
feature_configuration = feature_configuration,
cc_toolchain = cc_toolchain,
srcs = srcs,
includes = ctx.attr.includes,
public_hdrs = ctx.files.hdrs,
private_hdrs = private_hdrs,
user_compile_flags = ctx.attr.copts + asflags,
compilation_contexts = compilation_contexts,
)
objects_to_link = cc_common.merge_compilation_outputs(compilation_outputs=deps_objects + [compilation_outputs])
# partially link if there are multiple object files
if len(objects_to_link.objects) + len(objects_to_link.pic_objects) > 1:
linking_output = cc_common.link(
name = ctx.label.name + ".o",
actions = ctx.actions,
feature_configuration = feature_configuration,
cc_toolchain = cc_toolchain,
user_link_flags = _CC_OBJECT_LINKOPTS,
compilation_outputs = objects_to_link,
)
files = depset([linking_output.executable])
else:
files = depset(objects_to_link.objects + objects_to_link.pic_objects)
return [
DefaultInfo(files = files),
CcInfo(compilation_context = compilation_context),
CcObjectInfo(objects = objects_to_link),
]
_cc_object = rule(
implementation = _cc_object_impl,
attrs = {
"srcs": attr.label_list(allow_files = constants.all_dot_exts),
"hdrs": attr.label_list(allow_files = constants.hdr_dot_exts),
"includes": attr.string_list(),
"copts": attr.string_list(),
"asflags": attr.string_list(),
"deps": attr.label_list(providers=[CcInfo, CcObjectInfo]),
"_cc_toolchain": attr.label(
default = Label("@local_config_cc//:toolchain"),
providers = [cc_common.CcToolchainInfo],
),
"_android_product_variables": attr.label(
default = Label("//build/bazel/platforms:android_target_product_vars"),
providers = [platform_common.TemplateVariableInfo],
),
},
toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
fragments = ["cpp"],
)
def cc_object(
name,
copts = [],
hdrs = [],
asflags = [],
srcs = [],
srcs_as = [],
deps = [],
native_bridge_supported = False, # TODO: not supported yet.
**kwargs):
"Build macro to correspond with the cc_object Soong module."
_cc_object(
name = name,
hdrs = hdrs,
asflags = asflags,
copts = _CC_OBJECT_COPTS + copts,
srcs = srcs + srcs_as,
deps = deps,
**kwargs
)