【问题标题】:Bazel select fails inside ctx.fileBazel 选择在 ctx.file 中失败
【发布时间】:2018-09-13 00:21:39
【问题描述】:

我正在尝试根据运行 bazel 的操作系统指定构建条件,因此在我的 .bzl 脚本中,我有一个规则,该规则从外部源创建所有 simlink 并写入 BUILD 文件(使用 ctx.file) ,我在其中声明了所有导入和库,并且我想在其中添加选择函数。但是,当我构建时,我收到此错误消息:

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"],
)

有人知道为什么会这样吗?我查看了selectconfigurable attributes 文档,似乎这就是使用它的方法;我想知道是我做错了什么还是某个地方有错误。

感谢您的帮助!

编辑:

看起来 Bazel 真的不喜欢在 ctx.file 中使用 select, 我会留下这个问题,以防有人能够摆脱一些 点亮它。与此同时,我通过制作所有 cc_imports 来解决它 并包括来自链接回购的公开,同时保留所有 cc_librariesselect 到我插件的 BUILD 文件中;从那里我 能够使用条件和一切构建。

【问题讨论】:

    标签: bazel


    【解决方案1】:

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

    ctx.file("BUILD", _BUILD_STRUC.format(maya_dir=maya_dir))
    

    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"],
    )
    ...
    

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

    【讨论】:

    • 太完美了,非常感谢!我完全忘记了我使用的格式,不得不转义字典!
    猜你喜欢
    • 2014-06-11
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多