首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bazel在ctx.file内部失败

Bazel在ctx.file内部失败
EN

Stack Overflow用户
提问于 2018-09-10 11:42:19
回答 1查看 351关注 0票数 3

我试图根据运行bazel的os来指定构建条件,因此在我的.bzl脚本中,我有一个规则,该规则使所有simlinks都来自外部源,并编写一个构建文件(使用ctx.file),在该文件中,我声明所有导入和库,并在其中添加select函数。但是,当我构建时,我会收到以下错误消息:

代码语言:javascript
运行
复制
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

下面是我的代码和我想要实现的目标的一个例子:

代码语言:javascript
运行
复制
_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_imports来解决这个问题,并从链接的回购中包含了公开的内容,同时将所有的cc_librariesselect放在我插件的构建文件中;从那里我就可以使用这个条件,所有的东西都会生成。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 16:21:39

看起来错误来自这一行,特别是对string.format的调用。

代码语言:javascript
运行
复制
ctx.file("BUILD", _BUILD_STRUC.format(maya_dir=maya_dir))

string.format在模板字符串中搜索大括号(如{}{key} ),并使用位置或关键字参数替换它们。

您会看到这个错误,因为string.format将dict参数误认为模板中的select是要替换的,因为它是以大括号开头的。通过加倍将大括号转义到模板字符串中,应该可以解决以下问题:

代码语言:javascript
运行
复制
_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"],
)
...

FYI,您可能会发现repository_ctx.template更容易使用。它的语义略有不同:它按字面顺序替换字符串,而不需要寻找像{这样的特殊字符,因此不需要转义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52257038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档