【问题标题】:Chain expand_template and run in one bazel rule链 expand_template 并在一个 bazel 规则中运行
【发布时间】:2021-01-19 19:52:51
【问题描述】:

我正在尝试编写一个自定义规则,我首先从模板生成一个文件,然后将此文件传递给脚本以生成一些作为我的规则输出的 c++ 标头。

def _msg_library_impl(ctx):
  # For each target in deps, print its label and files.
  for source in enumerate(ctx.attr.srcs):
    print("File = " + str(source))
  out_header = ctx.actions.declare_file("some_header.hpp")
  out_arguments = ctx.actions.declare_file("arguments.json")
  ctx.actions.expand_template(
        template = ctx.file._arguments_file,
        output = out_arguments,
        substitutions = {
            "{output_dir}": out_header.dirname,
            "{idl_tuples}": out_header.path,
        },
  )
  args = ctx.actions.args()
  args.add("--arguments-file")
  args.add(out_arguments)
  ctx.actions.run(
      outputs = [out_header],
      progress_message = "Generating headers '{}'".format(out_header.short_path),
      executable = ctx.executable._generator,
      arguments = [args],
  )
  return [
    CcInfo(compilation_context=cc_common.create_compilation_context(
        includes=depset([out_header.dirname]),
        headers=depset([out_header])))
  ]



msg_library = rule(
    implementation = _msg_library_impl,
    output_to_genfiles = True,
    attrs = {
        "srcs": attr.label_list(allow_files = True),
        "outs": attr.output_list(),
        "_arguments_file": attr.label(
            allow_single_file = [".json"],
            default = Label("//examples/generation_rule:arguments_template.json"),
        ),
        "_generator": attr.label(
            default = Label("//examples/generation_rule:generator"),
            executable = True,
            cfg = "exec"
        ),
    },
)

这里,generator 是一个 python 库,给定一个提供给srcs 的输入文件和一个参数文件生成标头。

我面临的问题是expand_template 似乎在调用run 之前实际上并没有运行,因此找不到生成的文件。我在这里做错了什么?我误解了事情的运作方式吗?

【问题讨论】:

    标签: bazel rules starlark


    【解决方案1】:

    除了在参数中传递其路径外,您还需要指明文件是操作的输入。将 ctx.actions.run 更改为:

      ctx.actions.run(
          outputs = [out_header],
          inputs = [out_arguments],
          progress_message = "Generating headers '{}'".format(out_header.short_path),
          executable = ctx.executable._generator,
          arguments = [args],
      )
    

    【讨论】:

    • 非常感谢!我只是在早上在这里找到你的答案之前想通了! :) 我想让我感到困惑的是,我正在考虑将 inputs 作为我在这里调用的任何二进制文件的输入,而不是作为不会传递给实际二进制文件的规则的输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多