Jan*_*Jan 7 c c++ code-generation bazel
我试图通过编写规则来执行生成器来为我的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()
},
)
Run Code Online (Sandbox Code Playgroud)
和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"],
)
Run Code Online (Sandbox Code Playgroud)
代码生成工作并将代码写入bazel-out/local-fastbuild/bin/common/gen_header.h但gcc命令行不会将生成的头文件的include路径添加到导致错误的内容:gen_header.h:否这样的文件或目录
两种可能的解决方
1)使用output_to_genfiles属性:
code_generate = rule(
implementation = _impl,
output_to_genfiles = True,
attrs = {...}
)
Run Code Online (Sandbox Code Playgroud)
基本上它会将生成的输出放在bazel-genfiles中,而cc_*确实会查找标题.这里没有详细记录.
2)您可以创建一个运行的genrule python codegen.py(而不是在Skylark规则中执行).
| 归档时间: |
|
| 查看次数: |
1990 次 |
| 最近记录: |