Как с помощью 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
напрямую. build
Genrule не должен действительно нуждаться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
файлы и заголовочные файлы. (Я не проверял это, хотя)