不要用 Bazel 混淆共享库的名称

Do not mangle name of shared library with Bazel

给定一个使用 Bazel 构建的 C++ 应用程序,该应用程序依赖于系统提供的外部共享库:

cc_binary(
  name = 'app',
  srcs = ['app.cpp'],
  linkstatic = False,
  deps = ['@my_system//:system_lib'],
)

WORKSPACE 和 BUILD.my_system 文件:

new_local_repository(
  name = 'my_system',
  build_file = 'BUILD.my_system',
  path = '/usr/lib/my_system/',
)
cc_import(
  name = 'system_lib',
  shared_library = 'system_lib.so',
  visibility = ['//visibility:public'],
)

这将构建,但首先将系统提供的库复制到缓存,并链接到该库:

$ ldd bazel-bin/app/app
    system_lib.so => /home/erenon/bazel/proj/bazel-bin/app/../_solib_k8/_U@my_system_S_S_Csystem_Ulib___Uexternal_Smy_system/system_lib.so
    [...]

如果我将 app 移动到具有 /usr/lib/my_system/system_lib.so 的相同系统,它会中断,因为它错过了缓存。我想以直接链接到原始 .so 的方式打包 app,没有中间缓存副本或名称修改,即:我想实现:

$ ldd bazel-bin/app/app
    system_lib.so => /usr/lib/my_system/system_lib.so
    [...]

我试过 cc_import.system_provided,但似乎只适用于 Windows lib/dlls。

用另一个 cc_library 包装你的图书馆。
我无法解释为什么它有效,但它确实有效。

cc_library(
    name = "libsystem_lib",
    srcs = [ ":system_lib" ],
    hdrs = ...
)

就靠这个了