gpt4 book ai didi

cross-platform - 根据 config_setting 创建不同的规则

转载 作者:行者123 更新时间:2023-12-03 22:41:51 25 4
gpt4 key购买 nike

简介

我正在为具有自定义构建过程的跨平台 API 实现构建系统。对于每个平台,我都有一个构建目标的规则,例如:

build_for_linux = rule(...)
build_for_windows = rule(...)
build_for_mac = rule(...)

输出不是常规的可执行文件,每个规则都有一组完全不同的操作要执行。因此,将它们全部组合成一个通用规则是没有意义的(只是为了比较,您永远不会将 win32exe 和 androids 的 apk 在同一规则中)。

问题

我需要让用户决定他们想要输出的平台。换句话说,我需要找到一种方法来根据输入调用这些函数中的每一个。

当前的(坏的)解决方案

到目前为止,我有一个 config.bzl 文件,其中包含要构建的平台,然后我采用该值并相应地调用正确的规则:

config.bzl:

platform_to_build_to = 'Linux' 

platform_build.bzl:

platform_rules_dict = {
'Linux': build_for_linux,
}

def redirect_to_platform_rule(**args):
build_for_x = platform_rules_dict[platform_to_build_to]
build_for_x (**args)

问题是用户需要编辑我的私有(private)(例如由我创建的).bzl 文件以定义她/他的平台,这使它成为一个糟糕且不直观的解决方案。

问题

config_setting似乎是一个很好的解决方案。问题是你只能使用 select当您知道要调用哪个规则时。这不是这里的情况。

  • 有没有根据config_setting创建规则的方法?
  • 我做得对吗?你有别的想法吗?

抱歉这个问题太长了,我想通过回答所有读者的问题来节省您一些时间。

最佳答案

你是对的,选择用于属性而不是规则。您可以使用别名规则并在其“实际”参数上应用选择来获得您想要的行为。

例如,以下宏创建一个别名规则,该规则在 Mac 上指向 py_binary,在所有其他平台上指向 sh_binary

def sh_or_py_binary(name, **kwargs):
native.sh_binary(
name = name + "_sh",
**kwargs
)
native.py_binary(
name = name + "_py",
**kwargs
)
native.alias(
name = name,
actual = select({
"@bazel_tools//src:darwin": name + "_py",
"//conditions:default": name + "_sh",
}),
)

请注意,这种方法过于简单,因为我们使用相同的参数创建了 sh_binary 和 py_binary,因此参数必须对两者通用,否则 Bazel 的加载阶段将失败。

关于cross-platform - 根据 config_setting 创建不同的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46636232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com