"""C# library rule with SourceLink metadata embedded in PDB files."""
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
load("@rules_dotnet//dotnet/private:common.bzl", "is_debug")
load("@rules_dotnet//dotnet/private/rules/common:attrs.bzl", "CSHARP_LIBRARY_COMMON_ATTRS")
load("@rules_dotnet//dotnet/private/rules/common:library.bzl", "build_library")
load("@rules_dotnet//dotnet/private/rules/csharp/actions:csharp_assembly.bzl", "AssemblyAction")
load("@rules_dotnet//dotnet/private/transitions:tfm_transition.bzl", "tfm_transition")
def _generate_sourcelink_json(ctx):
output = ctx.actions.declare_file(ctx.label.name + "_sourcelink.json")
ctx.actions.run_shell(
inputs = [ctx.info_file],
outputs = [output],
command = """
COMMIT=$(grep "^STABLE_GIT_REVISION_FULL " "{status}" | cut -d' ' -f2 | tr -d '*')
[ -z "$COMMIT" ] && COMMIT=HEAD
printf '{{"documents":{{"*":"{repo}/raw/%s/*"}}}}\\n' "$COMMIT" > "{output}"
""".format(
status = ctx.info_file.path,
repo = ctx.attr.repo_url.rstrip("/"),
output = output.path,
),
mnemonic = "GenSourcelinkJson",
progress_message = "Generating sourcelink.json for " + str(ctx.label),
)
return output
def _compile_action(ctx, tfm):
toolchain = ctx.toolchains["@rules_dotnet//dotnet:toolchain_type"]
is_windows = ctx.target_platform_has_constraint(
ctx.attr._windows_constraint[platform_common.ConstraintValueInfo],
)
sourcelink_json = _generate_sourcelink_json(ctx)
# Map Bazel output paths to a stable prefix so that generated file references
# (e.g. sourcelink.json) don't vary across configurations or platforms.
pathmap = "/pathmap:{}=/_/".format(ctx.bin_dir.path)
return AssemblyAction(
ctx.actions,
ctx.executable._compiler_wrapper_bat if is_windows else ctx.executable._compiler_wrapper_sh,
label = ctx.label,
additionalfiles = ctx.files.additionalfiles,
debug = is_debug(ctx),
defines = ctx.attr.defines,
deps = ctx.attr.deps,
exports = ctx.attr.exports,
targeting_pack = ctx.attr._targeting_pack[0],
internals_visible_to = ctx.attr.internals_visible_to,
keyfile = ctx.file.keyfile,
langversion = ctx.attr.langversion,
resources = ctx.files.resources,
srcs = ctx.files.srcs,
data = ctx.files.data,
appsetting_files = [],
compile_data = ctx.files.compile_data + [sourcelink_json],
out = ctx.attr.out,
target = "library",
target_name = ctx.attr.name,
target_framework = tfm,
toolchain = toolchain,
strict_deps = toolchain.strict_deps[BuildSettingInfo].value,
generate_documentation_file = ctx.attr.generate_documentation_file,
include_host_model_dll = False,
treat_warnings_as_errors = ctx.attr.treat_warnings_as_errors,
warnings_as_errors = ctx.attr.warnings_as_errors,
warnings_not_as_errors = ctx.attr.warnings_not_as_errors,
warning_level = ctx.attr.warning_level,
nowarn = ctx.attr.nowarn,
project_sdk = ctx.attr.project_sdk,
allow_unsafe_blocks = ctx.attr.allow_unsafe_blocks,
nullable = ctx.attr.nullable,
run_analyzers = ctx.attr.run_analyzers,
is_analyzer = ctx.attr.is_analyzer,
is_language_specific_analyzer = ctx.attr.is_language_specific_analyzer,
analyzer_configs = ctx.files.analyzer_configs,
compiler_options = ctx.attr.compiler_options + [pathmap, "/sourcelink:" + sourcelink_json.path],
is_windows = is_windows,
)
def _csharp_sourcelink_library_impl(ctx):
return build_library(ctx, _compile_action)
_SOURCELINK_ATTRS = dict(CSHARP_LIBRARY_COMMON_ATTRS)
_SOURCELINK_ATTRS["repo_url"] = attr.string(
doc = "Source repository URL for SourceLink metadata (e.g. https://github.com/owner/repo).",
default = "https://github.com/SeleniumHQ/selenium",
)
csharp_sourcelink_library = rule(
_csharp_sourcelink_library_impl,
doc = "Compile a C# DLL with SourceLink metadata embedded in the PDB.",
attrs = _SOURCELINK_ATTRS,
executable = False,
toolchains = ["@rules_dotnet//dotnet:toolchain_type"],
cfg = tfm_transition,
)