blob: 39fc05d0b99356039e6a8704edfb36babe201100 [file] [log] [blame]
"""Function for preserving `select` entries for Cargo cfg expressions which did
not match any enabled target triple / Bazel platform.
For example we might generate:
rust_library(
...
deps = [
"//common:unconditional_dep",
] + selects.with_unmapped({
"@rules_rust//rust/platform:x86_64-pc-windows-msvc": [
"//third-party/rust:windows-sys", # cfg(windows)
],
"@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [
"//third-party/rust:libc", # cfg(any(unix, target_os = "wasi"))
],
"//conditions:default": [],
selects.NO_MATCHING_PLATFORM_TRIPLES: [
"//third-party/rust:hermit-abi", # cfg(target_os = "hermit")
],
})
)
"""
_SENTINEL = struct()
def _with_unmapped(configurations):
configurations.pop(_SENTINEL)
return select(configurations)
selects = struct(
with_unmapped = _with_unmapped,
NO_MATCHING_PLATFORM_TRIPLES = _SENTINEL,
)
# TODO: No longer used by the serde_starlark-based renderer. Delete after all
# BUILD files using it have been regenerated.
#
# buildifier: disable=function-docstring
def select_with_or(input_dict, no_match_error = ""):
output_dict = {}
for (key, value) in input_dict.items():
if type(key) == type(()):
for config_setting in key:
if config_setting in output_dict:
output_dict[config_setting].extend(value)
else:
output_dict[config_setting] = list(value)
elif key in output_dict:
output_dict[key].extend(value)
else:
output_dict[key] = list(value)
# return a dict with deduped lists
return select(
{key: depset(value).to_list() for key, value in output_dict.items()},
no_match_error = no_match_error,
)