Изменение путей включения в настраиваемом правиле 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 и намекнуть, что это частная деталь реализации, на которую другим правилам следует избегать.

Другие вопросы по тегам