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