Bazel select在ctx.file中失败
我试图根据运行bazel的操作系统来指定构建条件,因此在.bzl脚本中,我有一个规则,可以从外部源生成所有Simlink,并编写一个构建文件(使用ctx.file),在该文件中声明所有导入和库,并在其中添加select函数。但是,当我构建时,会收到以下错误消息:Bazel select在ctx.file中失败,bazel,Bazel,我试图根据运行bazel的操作系统来指定构建条件,因此在.bzl脚本中,我有一个规则,可以从外部源生成所有Simlink,并编写一个构建文件(使用ctx.file),在该文件中声明所有导入和库,并在其中添加select函数。但是,当我构建时,会收到以下错误消息: ERROR: no such package '@maya_repo//': Traceback (most recent call last): File "/var/tmp/doNotRemove/mdilena_p
ERROR: no such package '@maya_repo//': Traceback (most recent call last):
File "/var/tmp/doNotRemove/mdilena_plugins/MayaMathNodes/src/maya.bzl", line 149
ctx.file("BUILD", _BUILD_STRUC.format(maya_...))
File "/var/tmp/doNotRemove/mdilena_plugins/MayaMathNodes/src/maya.bzl", line 149, in ctx.file
_BUILD_STRUC.format(maya_dir = maya_dir)
Invalid character '[' inside replacement field
下面是我的代码示例,以及我试图实现的目标:
_BUILD_STRUC = \
"""
# Windows imports
cc_import(
name = "Foundation-win",
interface_library = "{maya_dir}/lib/Foundation.lib",
shared_library = "{maya_dir}/bin/Foundation.dll",
)
cc_import(
name = "OpenMaya-win",
interface_library = "{maya_dir}/lib/OpenMaya.lib",
shared_library = "{maya_dir}/bin/OpenMaya.dll",
)
# Linux imports
cc_import(
name = "Foundation-lnx",
shared_library = "{maya_dir}/bin/Foundation.so",
)
cc_import(
name = "OpenMaya-lnx",
shared_library = "{maya_dir}/bin/OpenMaya.so",
)
cc_library(
name = "Foundation",
deps = select({
"@bazel_tools//src/conditions:windows": [":Foundation-win"],
"//conditions:default": [":Foundation-lnx"],
}),
includes = ["{maya_dir}/include"],
visibility = ["//visibility:public"],
)
cc_library(
name = "OpenMaya",
deps = select({
"@bazel_tools//src/conditions:windows": [":OpenMaya-win"],
"//conditions:default": [":OpenMaya-lnx"],
}),
includes = ["{maya_dir}/include"],
visibility = ["//visibility:public"],
)
"""
def _impl(ctx):
maya_src = ctx.os.environ["MAYA_LOCATION"]
maya_ver = ctx.os.environ["MAYA_VERSION"]
maya_dir = "maya{}".format(maya_ver)
ctx.symlink(maya_src, maya_dir)
ctx.file("BUILD", _BUILD_STRUC.format(maya_dir=maya_dir))
link_maya = repository_rule(
implementation = _impl,
local = True,
environ = ["MAYA_LOCATION"],
)
有人知道为什么会这样吗?我看了一下和文档,似乎这就是使用它的方式;我不知道是我做错了什么,还是某个地方有个bug
谢谢你的帮助
编辑:
看起来Bazel真的不喜欢在ctx.file中使用select,
我会把这个问题留待讨论,以防万一有人能提出一些问题
打开它。与此同时,我通过制作所有的cc\u导入
并包括关联回购协议中的公众,同时保留所有
cc_库
使用选择
到我的插件的构建文件;从那里我很高兴
能够使用条件和构建的所有内容
看起来错误来自这一行,特别是对的调用
string.format
在模板字符串中搜索大括号,如{}
或{key}
,并用位置参数或关键字参数替换它们
您看到此错误是因为string.format
将模板中select
的dict参数误认为是要替换的对象,因为它以大括号开头。通过将大括号加倍来转义模板字符串中的大括号可以解决此问题:
_BUILD_STRUC = \
"""
...
cc_library(
name = "Foundation",
deps = select({{
"@bazel_tools//src/conditions:windows": [":Foundation-win"],
"//conditions:default": [":Foundation-lnx"],
}}),
includes = ["{maya_dir}/include"],
visibility = ["//visibility:public"],
)
...
仅供参考,您可能会发现更容易合作。它的语义稍有不同:它逐字替换字符串,而不查找像
{
,因此不需要转义。太好了,非常感谢!我完全忘记了我使用的是格式,不得不转义字典!
_BUILD_STRUC = \
"""
...
cc_library(
name = "Foundation",
deps = select({{
"@bazel_tools//src/conditions:windows": [":Foundation-win"],
"//conditions:default": [":Foundation-lnx"],
}}),
includes = ["{maya_dir}/include"],
visibility = ["//visibility:public"],
)
...