Генератор кода файла заголовка 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()
},
)

и файл 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"],
)

Генерация кода работает и записывает код Базэлы-аут / местный FastBuild / бен / общий / gen_header.h но командная строка gcc не добавляет путь включения в сгенерированный заголовочный файл, что приводит к ошибка: gen_header.h: нет такого файла или каталога

7

Решение

Два возможных решения:

1) Используйте output_to_genfiles атрибут:

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

По сути, он поместит ваш сгенерированный вывод в bazel-genfiles, а cc_ * будет искать там заголовки. Это не очень тщательно документировано Вот.

2) Вы можете создать genrule, который работает python codegen.py (вместо того, чтобы делать это в правиле жаворонка).

8

Другие решения

Других решений пока нет …