Как с помощью Bazel сделать часть исходных файлов одного жанра (например, файлы заголовков) доступной для другого жанра?

Может быть, это не проблема, и я просто еще не понял концепцию.

У меня есть genrule, в основном обертывающий существующийmake/configрабочий процесс, чтобы интегрировать его в конфигурацию сборки на основе Bazel. В моем примере я хотел бы построить , а затем (с тем же подходом) некоторую библиотеку, зависящую от, скажем,

Мое (сокращенное) правило для выглядит следующим образом:

      genrule(
    name = "build",
    visibility = ["//visibility:public"],
    srcs = glob(["**/*"], exclude=["bazel-*"]),
    outs =  [
        "libssl.a",
        "libcrypto.a",
        "include/openssl/opensslconf.h",
    ],
    cmd = """
        OUT_DIR="$$(realpath $(RULEDIR))"
        pushd "$$(dirname $(location config))"
        ./config
        make
        make -j6 DESTDIR="$$OUT_DIR" install_sw install_ssldirs
    """
)

Это хорошо строит и$OUT_DIRсодержит все файлы, которые мне нужно построить против

Теперь я хочу создать еще одно зданиеxmlsec1которому нужен путь к файлам заголовков.

Теперь, если я хочу получить доступ к заголовку, скажемinclude/opensslv.hэто не будет частью@openssl//:buildартефакты, так как я не указывал их явно вouts. Но это приводит к

      ERROR: Traceback (most recent call last):
    File "/bla/blubb/.cache/bazel/_bazel_me/f68917ddf601b6533d6db04f8101d580/external/openssl/BUILD.bazel", line 37, column 8, in <toplevel>
        genrule(
Error in genrule: rule 'build' has file 'include/openssl/opensslv.h' as both an input and an output

что правильно конечно, но что я могу с этим поделать?

Удаление этих заголовочных файлов изsrcsтоже не работают, так как они не будут доступны во время сборки.

Одним из способов было быmake install opensslв какой-либо целевой каталог, явно перечисляя каждый из десятков файлов заголовков и используя этот префикс во всех зависимых проектах. Но это не кажется правильным.

Каков рекомендуемый способ передачи списков файлов из одногоgenruleдругому?

1 ответ

xmlsec1мог иметь в своем собственномsrcsнапрямую. buildGenrule не должен действительно нуждатьсяinclude/openssl/opensslv.hв своемoutsкак потому, что это будет циклическая зависимость, как сказал базель, так и потому, что genrule на самом деле не создает этот файл: он уже существует на диске (я предполагаю, что он захватываетсяglob())

Однако может быть более приятный способ организовать библиотеку, что-то вроде этого:

      genrule(
    name = "build_openssl",
    visibility = ["//visibility:private"],
    outs =  [
        "libssl.a",
        "libcrypto.a",
        "include/openssl/opensslconf.h",
    ],
    .....,
)

cc_library(
    name = "openssl",
    srcs = [":build_openssl"],
    hdrs = [
        "include/openssl/opensslv.h",
        # other headers that openssl should provide
    ],
)

то ваши другие правила могут зависеть отopenssl cc_libraryи получить оба.aфайлы и заголовочные файлы. (Я не проверял это, хотя)

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