blob: 1f8327bd5ff6a056a3152e95bc245e0ad05c3e2b [file] [log] [blame]
"""
The run_cxxbridge_cmd rule is a variant of the run_binary rule defined in
`@bazel_skylib//rules:run_binary.bzl` that specifically runs `@cxxbridge_cmd//:cxxbridge` and
provides a `crate_features` attribute that gets expanded into `--cfg` arguments to cxxbuild.
Defining this as a rule (rather than a macro that thinly wraps `run_binary`) allows `crate_features`
to be evaluated as a "select" [1], which is not possible for macro parameters [2].
[1] https://bazel.build/docs/configurable-attributes#select-and-dependencies
[2] https://bazel.build/docs/configurable-attributes#faq-select-macro
"""
def _run_cxxbridge_cmd_impl(ctx):
tool_as_list = [ctx.attr._cxxbridge]
args = [
# https://bazel.build/rules/lib/builtins/ctx#expand_location
ctx.expand_location(a, tool_as_list)
for a in ctx.attr.args
]
for f in ctx.attr.crate_features:
args.append("--cfg")
args.append("feature=\"%s\"" % f)
# https://bazel.build/rules/lib/builtins/ctx#resolve_tools
tool_inputs, tool_input_manifests = ctx.resolve_tools(tools = tool_as_list)
# https://bazel.build/rules/lib/builtins/actions.html#run
ctx.actions.run(
outputs = ctx.outputs.outs,
inputs = ctx.files.srcs,
tools = tool_inputs,
executable = ctx.executable._cxxbridge,
arguments = args,
mnemonic = "RunCxxbridgeCmd",
input_manifests = tool_input_manifests,
)
return DefaultInfo(
files = depset(ctx.outputs.outs),
runfiles = ctx.runfiles(ctx.outputs.outs),
)
run_cxxbridge_cmd = rule(
implementation = _run_cxxbridge_cmd_impl,
attrs = {
"srcs": attr.label_list(
doc = "Source dependencies for this rule",
allow_files = True,
mandatory = True,
),
"outs": attr.output_list(
doc = "C++ output files generated by cxxbridge_cmd.",
mandatory = True,
),
"args": attr.string_list(
doc = "Arguments to `cxxbridge_cmd`.",
mandatory = True,
),
"crate_features": attr.string_list(
doc = "Optional list of cargo features that CXX bridge definitions may depend on.",
),
"_cxxbridge": attr.label(
default = Label("@cxxbridge_cmd//:cxxbridge"),
allow_single_file = True,
executable = True,
cfg = "exec",
),
},
)