2015-09-23 6 views
6

ジェネレーターを実行するルールを作成することで、私の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() 
     }, 
) 

と、このようなビルドファイル:

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アウト/ローカルfastbuild /ビンにコードを書き込み、 /common/gen_header.hしかし、gccコマンドラインは、生成されたヘッダーファイルへのインクルードパスを追加しません。エラー:gen_header.h:そのようなファイルまたはディレクトリはありません。

答えて

7

2つの解決策:

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

は基本的にそれが*ヘッダーのためにそこに見えるんbazel-GENFILESとCC_であなたの生成された出力を出してあげる:

1)output_to_genfiles属性を使用します。それは完全に文書化されていませんhere

2)python codegen.py(Skylarkルールで実行するのではなく)を実行するgenruleを作成できます。