0

我有几个依赖于 的第三方库,所以我通过存储库机制 ( )openssl获取和构建 openssl 。http_archive()而且我有 GRPC,boringssl它具有与 openssl 相同的符号(链接后我因冲突而出错)。

我想重新定义boringsll使用new_local_repository()方法。但我不知道如何将生成的路径传递给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"],
)
""",
)
4

1 回答 1

0

我会@boringsslalias 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, just deps)来执行诸如将多个@openssl目标组合成一个@boringssl等价目标之类的事情。

使用您的方法,即使您使用一些技巧来重用存储库目录或复制源文件,您仍然会遇到链接问题。Bazel 将构建所有@openssl源文件两次,然后尝试链接两个副本。链接器可能只选择一个并使一切正常,或者它可能拒绝链接,或者您可能会在运行时遇到重复的全局状态的微妙问题。

于 2022-01-20T00:22:41.897 回答