Bazel WORKSPACE 中的条件 new_local_library

conditional new_local_library in Bazel WORKSPACE

我有一些预构建的第 3 方库,我必须将它们包含在我的 Bazel 构建中。所以我的 WORKSPACE:

里有这样的东西
new_local_repository(
   name = "thirdparty",
   path = ".install/OSX/DEBUG",
   build_file = "bazel/BUILD.third_party",
)

BUILD.third_party 看起来像:

cc_library(
    name = "glog",
    srcs = ["glog/0.3.5.r1/lib/libglog.a"],
    hdrs = glob([
       "glog/0.3.5.r1/include/**"
    ]),
   visibility = ["//visibility:public"],
   includes = [
      "glog/0.3.5.r1/include"
   ]
)

问题是 new_local_repository 规则中 pathOSX/DEBUG 部分需要依赖于当前平台和 compilation_mode(例如我想link 在 glog 的发布版本中(如果 compilation_mode == opt)。但是,据我了解 new_local_repository 规则必须在加载阶段进行评估,此时命令行选项和其他配置信息不可用。同样,select 表达式在 WORKSPACE 文件中不可用。有什么办法吗?

编辑

我找到了一种应该有效的方法,但 Bazel 中似乎存在错误。这是我的错误报告:https://github.com/bazelbuild/bazel/issues/10400

您可以通过翻转来做到这一点:编写单独的 new_local_repository 规则和使用它们的 select

例如 WORKSPACE 中的两个存储库,具有相同的 build_file:

new_local_repository(
   name = "thirdparty_debug",
   path = ".install/OSX/DEBUG",
   build_file = "bazel/BUILD.third_party",
)
new_local_repository(
   name = "thirdparty_release",
   path = ".install/OSX/RELEASE",
   build_file = "bazel/BUILD.third_party",
)

然后,使用额外的 "forwarding" 库,该库依赖于相应存储库中的相关库。像这样:

cc_library(
    name = "glog",
    deps = select({
        "a_config_setting_for_opt": ["@thirdparty_release//:glog"],
        "//conditions:default": ["@thirdparty_debug//:glog"],
    }),
    visibility = ["//visibility:public"],
)

BUILD.third_party 可能看起来与您的示例相同。可能值得将可见性限制为仅转发目标的包以避免意外的直接依赖。