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
规则中 path
的 OSX/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
可能看起来与您的示例相同。可能值得将可见性限制为仅转发目标的包以避免意外的直接依赖。
我有一些预构建的第 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
规则中 path
的 OSX/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
可能看起来与您的示例相同。可能值得将可见性限制为仅转发目标的包以避免意外的直接依赖。