xref: /aosp_15_r20/external/skia/bazel/run_cxxbridge_cmd.bzl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker"""
2*c8dee2aaSAndroid Build Coastguard WorkerThe run_cxxbridge_cmd rule is a variant of the run_binary rule defined in
3*c8dee2aaSAndroid Build Coastguard Worker`@bazel_skylib//rules:run_binary.bzl` that specifically runs `@cxxbridge_cmd//:cxxbridge` and
4*c8dee2aaSAndroid Build Coastguard Workerprovides a `crate_features` attribute that gets expanded into `--cfg` arguments to cxxbuild.
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard WorkerDefining this as a rule (rather than a macro that thinly wraps `run_binary`) allows `crate_features`
7*c8dee2aaSAndroid Build Coastguard Workerto be evaluated as a "select" [1], which is not possible for macro parameters [2].
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker[1] https://bazel.build/docs/configurable-attributes#select-and-dependencies
10*c8dee2aaSAndroid Build Coastguard Worker[2] https://bazel.build/docs/configurable-attributes#faq-select-macro
11*c8dee2aaSAndroid Build Coastguard Worker"""
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Workerdef _run_cxxbridge_cmd_impl(ctx):
14*c8dee2aaSAndroid Build Coastguard Worker    tool_as_list = [ctx.attr._cxxbridge]
15*c8dee2aaSAndroid Build Coastguard Worker    args = [
16*c8dee2aaSAndroid Build Coastguard Worker        # https://bazel.build/rules/lib/builtins/ctx#expand_location
17*c8dee2aaSAndroid Build Coastguard Worker        ctx.expand_location(a, tool_as_list)
18*c8dee2aaSAndroid Build Coastguard Worker        for a in ctx.attr.args
19*c8dee2aaSAndroid Build Coastguard Worker    ]
20*c8dee2aaSAndroid Build Coastguard Worker    for f in ctx.attr.crate_features:
21*c8dee2aaSAndroid Build Coastguard Worker        args.append("--cfg")
22*c8dee2aaSAndroid Build Coastguard Worker        args.append("feature=\"%s\"" % f)
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker    # https://bazel.build/rules/lib/builtins/ctx#resolve_tools
25*c8dee2aaSAndroid Build Coastguard Worker    tool_inputs, tool_input_manifests = ctx.resolve_tools(tools = tool_as_list)
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker    # https://bazel.build/rules/lib/builtins/actions.html#run
28*c8dee2aaSAndroid Build Coastguard Worker    ctx.actions.run(
29*c8dee2aaSAndroid Build Coastguard Worker        outputs = ctx.outputs.outs,
30*c8dee2aaSAndroid Build Coastguard Worker        inputs = ctx.files.srcs,
31*c8dee2aaSAndroid Build Coastguard Worker        tools = tool_inputs,
32*c8dee2aaSAndroid Build Coastguard Worker        executable = ctx.executable._cxxbridge,
33*c8dee2aaSAndroid Build Coastguard Worker        arguments = args,
34*c8dee2aaSAndroid Build Coastguard Worker        mnemonic = "RunCxxbridgeCmd",
35*c8dee2aaSAndroid Build Coastguard Worker        input_manifests = tool_input_manifests,
36*c8dee2aaSAndroid Build Coastguard Worker    )
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker    return DefaultInfo(
39*c8dee2aaSAndroid Build Coastguard Worker        files = depset(ctx.outputs.outs),
40*c8dee2aaSAndroid Build Coastguard Worker        runfiles = ctx.runfiles(ctx.outputs.outs),
41*c8dee2aaSAndroid Build Coastguard Worker    )
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Workerrun_cxxbridge_cmd = rule(
44*c8dee2aaSAndroid Build Coastguard Worker    implementation = _run_cxxbridge_cmd_impl,
45*c8dee2aaSAndroid Build Coastguard Worker    attrs = {
46*c8dee2aaSAndroid Build Coastguard Worker        "srcs": attr.label_list(
47*c8dee2aaSAndroid Build Coastguard Worker            doc = "Source dependencies for this rule",
48*c8dee2aaSAndroid Build Coastguard Worker            allow_files = True,
49*c8dee2aaSAndroid Build Coastguard Worker            mandatory = True,
50*c8dee2aaSAndroid Build Coastguard Worker        ),
51*c8dee2aaSAndroid Build Coastguard Worker        "outs": attr.output_list(
52*c8dee2aaSAndroid Build Coastguard Worker            doc = "C++ output files generated by cxxbridge_cmd.",
53*c8dee2aaSAndroid Build Coastguard Worker            mandatory = True,
54*c8dee2aaSAndroid Build Coastguard Worker        ),
55*c8dee2aaSAndroid Build Coastguard Worker        "args": attr.string_list(
56*c8dee2aaSAndroid Build Coastguard Worker            doc = "Arguments to `cxxbridge_cmd`.",
57*c8dee2aaSAndroid Build Coastguard Worker            mandatory = True,
58*c8dee2aaSAndroid Build Coastguard Worker        ),
59*c8dee2aaSAndroid Build Coastguard Worker        "crate_features": attr.string_list(
60*c8dee2aaSAndroid Build Coastguard Worker            doc = "Optional list of cargo features that CXX bridge definitions may depend on.",
61*c8dee2aaSAndroid Build Coastguard Worker        ),
62*c8dee2aaSAndroid Build Coastguard Worker        "_cxxbridge": attr.label(
63*c8dee2aaSAndroid Build Coastguard Worker            default = Label("@cxxbridge_cmd//:cxxbridge"),
64*c8dee2aaSAndroid Build Coastguard Worker            allow_single_file = True,
65*c8dee2aaSAndroid Build Coastguard Worker            executable = True,
66*c8dee2aaSAndroid Build Coastguard Worker            cfg = "exec",
67*c8dee2aaSAndroid Build Coastguard Worker        ),
68*c8dee2aaSAndroid Build Coastguard Worker    },
69*c8dee2aaSAndroid Build Coastguard Worker)
70