2015-09-23 30 views
6

Sto cercando di aggiungere un generatore di codice alla build di bazel scrivendo una regola per eseguire il generatore, ma sono bloccato ad aggiungere il file di intestazione generato come dipendenza del percorso di inclusione alla libreria in cui sto provando costruire.Generatore di file di intestazione Bazel

La regola si presenta così:

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() 
     }, 
) 

e il file BUILD in questo modo:

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"], 
) 

il codice funziona generazione e scrive il codice per Bazel-out/local-FastBuild/bin /common/gen_header.h ma la riga di comando gcc non aggiunge il percorso di inclusione al file di intestazione generato ciò che porta a errore: gen_header.h: Nessun file o directory

risposta

7

due possibili soluzioni:

1) utilizzare l'attributo output_to_genfiles:

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

Fondamentalmente metterò l'output generato in Bazel-genfiles e CC_ * non cercare lì per le intestazioni. Non è documentato molto dettagliatamente here.

2) È possibile creare un genrule che esegue python codegen.py (anziché farlo in una regola di Skylark).