Изменение путей включения в настраиваемом правиле C++ Bazel
Я создаю некоторые собственные правила C++ Bazel, и мне нужно добавить поддержку для изменения путей включения заголовков C++ таким же образом cc_library
заголовки могут быть изменены с помощью strip_include_prefix
.
Мое собственное правило реализовано с использованием ctx.actions.run
нравится:
custom_cc_library = rule(
_impl,
attrs = {
...
"hdrs": attr.label_list(allow_files = [".h"]),
"strip_include_prefix": attr.string(),
...
},
)
Тогда в пределах _impl
Я вызываю следующую функцию для перезаписи hdrs
:
def _strip_prefix(ctx, hdrs, prefix):
stripped = []
for hdr in hdrs:
stripped = hdr
if file.path.startswith(strip_prefix):
stripped_file = ctx.actions.declare_file(file.path[len(strip_prefix):])
ctx.actions.run_shell(
command = "mkdir -p {dest} && cp {src} {dest};".format(src=hdr.path, dest=stripped.path),
inputs = [hdr],
outputs = [stripped],
)
stripped.append(stripped_file)
return stripped
Это не работает, потому что Bazel не копирует файлы за пределы своего каталога пакетов, и, кроме того, кажется, что это совершенно неправильный подход к реализации этого.
Как лучше всего изменить каталоги заголовков C++ для зависимостей для достижения той же функциональности, что и cc_library
параметр strip_include_prefix
?
1 ответ
Вы можете создать нужный макет заголовка в каталоге внутри вашего пакета, а затем добавить его в путь включения через create_compilation_outputs.includes
. Это в основном то, к чему сводится реализация cc_library.
Реализация cc_library называет это_virtual_includes
, и создает его с помощью getUniqueDirectoryArtifact
который является помощником в коде Java для его создания "в каталоге, уникальном для правила". Я использую что-то вроде"_%s_virtual_includes" % ctx.label.name
чтобы получить аналогичную функциональность от Starlark и намекнуть, что это частная деталь реализации, на которую другим правилам следует избегать.