blob: e7a20d075b2d14c67c71b7914571ce62d2b1d868 [file] [log] [blame]
"""A macro to handle shared library stripping."""
load("@rules_cc//examples:experimental_cc_shared_library.bzl", "CcSharedLibraryInfo", "cc_shared_library")
load("@rules_cc//cc:find_cc_toolchain.bzl", "find_cpp_toolchain")
# Keep this consistent with soong/cc/strip.go#NeedsStrip.
def needs_strip(attrs):
force_disable = attrs.none
force_enable = attrs.all or attrs.keep_symbols or attrs.keep_symbols_and_debug_frame
return force_enable and not force_disable
# Keep this consistent with soong/cc/strip.go#strip and soong/cc/builder.go#transformStrip.
def get_strip_args(attrs):
strip_args = []
keep_symbols_list = attrs.keep_symbols_list
keep_mini_debug_info = False
if attrs.keep_symbols:
strip_args += ["--keep-symbols"]
elif attrs.keep_symbols_and_debug_frame:
strip_args += ["--keep-symbols-and-debug-frame"]
elif len(keep_symbols_list) > 0:
strip_args += ["-k"+",".join(keep_symbols_list)]
elif not attrs.all:
strip_args += ["--keep-mini-debug-info"]
keep_mini_debug_info = True
if not keep_mini_debug_info:
strip_args += ["--add-gnu-debuglink"]
return strip_args
# https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/builder.go;l=131-146;drc=master
def _stripped_shared_library_impl(ctx):
# If this library doesn't need to be stripped, return the DefaultInfo
# and CcSharedLibraryInfo as-is.
if not needs_strip(ctx.attr):
return [
DefaultInfo(files = ctx.attr.src[DefaultInfo].files),
ctx.attr.src[CcSharedLibraryInfo]
]
cc_toolchain = find_cpp_toolchain(ctx)
d_file = ctx.actions.declare_file(ctx.attr.name + ".d")
out_file = ctx.actions.declare_file("lib" + ctx.attr.name + ".so")
ctx.actions.run(
env = {
"CREATE_MINIDEBUGINFO": ctx.executable._create_minidebuginfo.path,
"XZ": ctx.executable._xz.path,
"CLANG_BIN": ctx.executable._ar.dirname,
},
inputs = ctx.files.src,
tools = [
ctx.executable._ar,
ctx.executable._create_minidebuginfo,
ctx.executable._objcopy,
ctx.executable._readelf,
ctx.executable._strip,
ctx.executable._strip_script,
ctx.executable._xz,
],
outputs = [out_file, d_file],
executable = ctx.executable._strip_script,
arguments = get_strip_args(ctx.attr) + [
"-i",
ctx.files.src[0].path,
"-o",
out_file.path,
"-d",
d_file.path,
],
)
return [
DefaultInfo(files = depset([out_file])),
ctx.attr.src[CcSharedLibraryInfo]
]
stripped_shared_library = rule(
implementation = _stripped_shared_library_impl,
attrs = {
"src": attr.label(mandatory = True, providers = [CcSharedLibraryInfo]),
"keep_symbols": attr.bool(default = False),
"keep_symbols_and_debug_frame": attr.bool(default = False),
"all": attr.bool(default = False),
"none": attr.bool(default = False),
"keep_symbols_list": attr.string_list(default = []),
"_xz": attr.label(
cfg = "host",
executable = True,
allow_single_file = True,
default = "//prebuilts/build-tools:linux-x86/bin/xz",
),
"_create_minidebuginfo": attr.label(
cfg = "host",
executable = True,
allow_single_file = True,
default = "//prebuilts/build-tools:linux-x86/bin/create_minidebuginfo",
),
"_strip_script": attr.label(
cfg = "host",
executable = True,
allow_single_file = True,
default = "//build/soong/scripts:strip.sh",
),
"_ar": attr.label(
cfg = "host",
executable = True,
allow_single_file = True,
default = "//prebuilts/clang/host/linux-x86:llvm-ar",
),
"_strip": attr.label(
cfg = "host",
executable = True,
allow_single_file = True,
default = "//prebuilts/clang/host/linux-x86:llvm-strip",
),
"_readelf": attr.label(
cfg = "host",
executable = True,
allow_single_file = True,
default = "//prebuilts/clang/host/linux-x86:llvm-readelf",
),
"_objcopy": attr.label(
cfg = "host",
executable = True,
allow_single_file = True,
default = "//prebuilts/clang/host/linux-x86:llvm-objcopy",
),
"_cc_toolchain": attr.label(
default = Label("@local_config_cc//:toolchain"),
providers = [cc_common.CcToolchainInfo],
),
},
toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
)