【问题标题】:Bazel header file code generatorBazel 头文件代码生成器
【发布时间】:2015-12-20 22:29:16
【问题描述】:

我正在尝试通过编写执行生成器的规则将代码生成器添加到我的 bazel 构建中,但我坚持将生成的头文件作为包含路径依赖项添加到我正在尝试构建的库中。

规则如下所示:

def _impl(ctx):
  output = ctx.outputs.out
  input = ctx.attr.defs
  md_dir = list(ctx.attr.md_dir.files)[0]
  print("generating", output.path)
  ctx.action(
      outputs=[output],
      progress_message="Generating %s" % md_dir,
      command="python codegen.py -md_dir %s %s -o %s" % (md_dir.path, input, output.path)
  )

code_generate = rule(
  implementation=_impl,
  attrs={
       "defs": attr.string(),
       "md_dir": attr.label(allow_files=True, single_file=True),
       "out": attr.output()
       },
)

和这样的 BUILD 文件:

load("/common/code_generate", "code_generate")

code_generate(
  name="generate_header_defs",
  defs="common/header_definition_file",
  md_dir="header_defs",
  out="gen_header.h",
)

cc_library(
  name="lnt",
  hdrs=glob(["*.h"]),
  srcs=["source.c":gen_header.h"],
  visibility=["//visibility:public"],
  deps=["@dep1//:x", "@dep2//:y", "@dep3//:z"],
)

代码生成工作并将代码写入 bazel-out/local-fastbuild/bin/common/gen_header.h 但 gcc 命令行未将包含路径添加到生成的头文件是什么导致错误:gen_header.h:没有这样的文件或目录

【问题讨论】:

    标签: c++ c code-generation bazel


    【解决方案1】:

    两种可能的解决方案:

    1) 使用output_to_genfiles 属性:

    code_generate = rule(
      implementation = _impl,
      output_to_genfiles = True,
      attrs = {...}
    )
    

    基本上,它会将您生成的输出放在 bazel-genfiles 中,而 cc_* 确实会在那里查找标题。 here 的记录不是很彻底。

    2) 您可以创建一个运行 python codegen.py 的 genrule(而不是在 Skylark 规则中这样做)。

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多