9

ジェネレーターを実行するルールを記述してコード ジェネレーターを 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: Noそのようなファイルまたはディレクトリ

4

1 に答える 1

9

考えられる解決策は次の 2 つです。

1) 次のoutput_to_genfiles属性を使用します。

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

基本的に、生成された出力は bazel-genfiles に配置され、cc_* はそこでヘッダーを探します。ここでは十分に文書化されていません。

python codegen.py2) (Skylark ルールで実行する代わりに) 実行する genrule を作成できます。

于 2015-09-23T17:56:51.780 に答える