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

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