Bazel: Как сделать так, чтобы цель new_local_repository зависела от цели, сгенерированной http_archive?
У меня есть несколько сторонних библиотек, которые зависят от , поэтому я извлекаю и собираю openssl через механику репозитория (
http_archive()
). И у меня есть GRPC, который извлекает
boringssl
который имеет те же символы, что и openssl (после связывания я получаю сообщение об ошибке из-за столкновения).
Я хочу переопределить
boringsll
используя метод. Но я не знаю, как передать сгенерированный путь к
path
аргумент и как сделать
new_local_repository()
вызов зависит от
openssl
цель.
Код, который нужно получить, выглядит так:
new_local_repository(
name = "boringssl",
??? path = "bazel-out/k8-fastbuild/bin/external/openssl/openssl/", <-- generated path with openssl
build_file_content = """
cc_library(
name = "ssl",
deps = ["@openssl"],
srcs = ["lib/libssl.a"],
hdrs = glob(["include/openssl/*.h"]),
strip_include_prefix = "/include/openssl",
visibility = ["//visibility:public"],
)
cc_library(
name = "crypto",
deps = ["@openssl"],
srcs = ["lib/libcrypto.a"],
hdrs = glob(["include/openssl/*.h"]),
strip_include_prefix = "/include/openssl",
visibility = ["//visibility:public"],
)
""",
)
1 ответ
Я бы написал замену псевдонимом es для каждого правила. Что-то вроде этого как
third_party/boringssl/BUILD.bazel
:
alias(
name = "crypto",
actual = "@openssl//:libcrypto",
visibility = ["//visibility:public"],
)
Затем вы можете рекламировать его в своем
WORKSPACE
с относительным путем:
local_repository(
name = "boringssl",
path = "third_party/boringssl",
)
Это также позволяет вам свободно сопоставлять имена целей, если они различаются. В качестве альтернативы вы можете написать
cc_library
обертки (без
srcs
, просто
deps
), чтобы делать такие вещи, как объединение нескольких целей в одну для
@boringssl
эквивалент.
С вашим подходом, даже если вы используете некоторые хаки для повторного использования каталога репозитория или копирования исходных файлов, у вас все равно будут проблемы с связыванием. «Базэл» построит все
@openssl
исходные файлы дважды, а затем попытаться связать обе копии. Компоновщик может просто выбрать одну и заставить все работать, или он может отказаться связать, или вы можете получить тонкие проблемы во время выполнения с дублированным глобальным состоянием.