Bazel 如何将规则限制为cpp工具链的子集?

Bazel 如何将规则限制为cpp工具链的子集?,bazel,bazel-rules,Bazel,Bazel Rules,我有这样的规定 行动=规则 实现=_impl, 属性={ ... _cc_工具链:attr.labeldefault=Label@bazel_tools//工具/cpp:当前的工具链, }, 片段=[cpp], 工具链=[ @bazel_工具//工具/cpp:工具链类型, ], 我为自定义cpu定义了自定义cc_工具链: 工具链 name=cc toolchain-%{toolchain_name}, toolchain=:cc编译器-%{toolchain_name}, 可以在这个平台上运行

我有这样的规定

行动=规则 实现=_impl, 属性={ ... _cc_工具链:attr.labeldefault=Label@bazel_tools//工具/cpp:当前的工具链, }, 片段=[cpp], 工具链=[ @bazel_工具//工具/cpp:工具链类型, ], 我为自定义cpu定义了自定义cc_工具链:

工具链 name=cc toolchain-%{toolchain_name}, toolchain=:cc编译器-%{toolchain_name}, 可以在这个平台上运行 目标\u兼容\u与=[ @平台//操作系统:windows, @平台//cpu:x86_64, ], 工具链类型=@bazel\u tools//tools/cpp:工具链类型, cc_工具链_套件 名称=工具链, 工具链={ %{cpu}::cc编译器-%{toolchain_name}, }, 我使用-crosool\u top在需要时选择此工具链

我希望仅当-crosool\u top与我的一个自定义工具链匹配时,才允许调用我的自定义规则。如何做到这一点?

添加一个只有工具链与目标兼容的新目标,然后使所有使用规则的目标与之兼容

生成文件中的类似内容:

constraint\u settingname=是我的工具链 约束值 name=是我的工具链, 约束设置=:是我的工具链, 然后将“是我的”工具链添加到所有工具链上的“目标兼容”

强制在每次使用规则时使用它的最简单方法是使用。将实际规则重命名为_do_action,这样它是私有的,不能直接从任何生成文件加载,并添加:

def do_actiontarget_兼容=[],**kwargs: _采取行动 target_compatible_with=target_compatible_with+[ //你的工具包:是的,我的工具链, ], **夸尔斯
如果规则存储在do_action.bzl中,然后加载到依赖项目中,该怎么办?我无法在do_action.bzl中直接定义此约束,也无法在从属项目中定义生成文件。请在项目中使用生成文件。对于包含do_action.bzl的包来说,这个可能最有意义。您可以像@my\u workspace\u name//my\u package:yes\u my\u toolchain那样引用它作为绝对引用。