- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一遍又一遍地阅读 Bazel 文档,以至于没有什么新鲜的地方,但我似乎无法掌握如何为 native 以外的变体设置配置和变体,例如--cpu
和--compilation_mode
。
为了解释我对配置和变体的含义,请考虑这个包含配置行、变体点列和变体单元格的表格(制作此表格,希望它至少具有抽象意义):
从 Bazel 用户的角度来看:
-DVARIANT_POINT_CONNECTED_ETH
用于以太网连接,-DVARIANT_POINT_CONNECTED_USB
用于 USB 连接bazel build//my/target --//:configuration=debughw
select()
最佳答案
您正在寻找 platforms . Build settings (你首先发现的)对于独立的配置部分更好,在这种情况下,将它们设置为任何排列都是有用的,而平台则将所有部分捆绑在一起。然后,生成的设置和约束可用于驱动编译器标志并将目标限制为特定配置。
对于你的例子,我认为这样的事情是有道理的:
constraint_setting(name = "has_x")
constraint_value(
name = "x_v1",
constraint_setting = ":has_x",
)
constraint_value(
name = "x_v2",
constraint_setting = ":has_x",
)
constraint_value(
name = "x_none",
constraint_setting = ":has_x",
)
constraint_setting(name = "interface")
constraint_value(
name = "interface_usb",
constraint_setting = ":interface",
)
constraint_value(
name = "interface_ethernet",
constraint_setting = ":interface",
)
constraint_value(
name = "interface_uart",
constraint_setting = ":interface",
)
constraint_setting(name = "failure_reporting")
constraint_value(
name = "fail_fast",
constraint_setting = ":failure_reporting",
)
constraint_value(
name = "fail_bugreport",
constraint_setting = ":failure_reporting",
)
platform(
name = "customer_1",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
":x_v1",
":interface_ethernet",
":fail_fast",
],
)
platform(
name = "customer_2",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
":x_v1",
":interface_usb",
":fail_fast",
],
)
platform(
name = "customer_3",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
":x_none",
":interface_usb",
":fail_bugreport",
],
)
platform(
name = "debug_hw",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
":x_none",
":interface_uart",
":fail_fast",
],
)
请注意每个平台如何为每个约束指定设置。给定的编译器命令(由 configured target 创建)将只使用一个平台。此外,即使输出相同,每个文件也会针对每个平台单独编译。平台旨在限制实际构建约束的哪些排列。如果要删除重复约束,platform.parents让你构建一个 inheritance tree的平台,您不能同时使用两个平台。
target_compatible_with属性将目标限制为特定的约束值。默认情况下,每个目标都被认为与所有平台兼容。如果您使用 target_compatible_with
来限制这一点,那么不兼容的目标将在您尝试显式构建它们或只是 skipped 时产生错误。如果包含在通配符中。对于您的用例,此目标将为任何平台构建:
cc_library(
name = "generic_linked_list",
<etc>
)
但是这个只会为 customer_1
和 customer_2
构建:
cc_library(
name = "hardware_x_driver",
target_compatible_with = [":x_v1", ":x_v2"],
<etc>
)
cc_library(
name = "ethernet_driver",
# Or you could have a separate constraint for "has ethernet hardware",
# to use for some platforms which have the hardware but don't use it
# as the primary interface.
target_compatible_with = [":interface_ethernet"],
<etc>
)
为不同的平台使用不同的编译器标志、依赖项或大多数其他规则属性是通过 select 完成的。 . Select可以直接读取constraint_value
。所以你可以这样写:
cc_library(
name = "selected_connection",
copts = select({
":interface_usb": [ "-DVARIANT_POINT_CONNECTED_USB" ],
":interface_ethernet": ["-DVARIANT_POINT_CONNECTED_ETH" ],
":interface_uart": ["-DVARIANT_POINT_CONNECTED_UART" ],
}),
deps = select({
":interface_ethernet": [ ":ethernet_driver" ],
"//conditions:default": [],
}),
<etc>
)
请注意,如果您希望定义传播到相关目标,请使用 cc_library.defines而不是 copts
。此外,使用 cc_library.local_defines将提供相同的非继承语义,并且还与为此使用不同命令行标志的编译器兼容。
指定平台的最简单方法是使用 --platforms .在这种情况下,使用类似 --platforms=//:customer_1
的内容进行构建。您可以直接在命令行上指定它或将其放入 .bazelrc config section像这样:
build:customer_1 --platforms=//some/long/and/annoying/package:customer_1
您将与 --config=customer_1
一起使用。
关于bazel - 如何在 Bazel 中进行配置和变体处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69580604/
我正在创建一个连接到 firebase 的应用程序。但我面临一些问题。当同步我的 gradle 文件时,我收到此警告 WARNING: API 'variant.getMergeResources()
想知道是否有任何方法可以将变体分配给自定义 radio 输入?我想为 2 天、3 天和标准运输设置不同费率的分级运输。我可以使用变体来做到这一点,但下拉菜单对我不起作用。我想要日期信息和日期选择器,以
我是 Haskell 的新手。鉴于 Haskell 的整个前提是函数将始终返回相同的值,我希望有某种方式,例如在编译时计算常量的斐波那契值,就像我可以在 C++ 中使用模板元编程一样,但我不知道该怎么
我是 OCaml 的新手,但过去两天一直在工作,以便更好地了解如何使用它。我最近做了很多事情,但有些事情阻碍了我前进。 我正在尝试在 OCaml 中实现 evaexpr。使用这种语言非常容易,你会说:
我有一个使用一些typedef的std::variant的代码库。 最初,它们是不同的类型,但现在它们像下面的示例一样重叠 typedef int TA; typedef int TB; std::v
鉴于此: data Foo = Bar { name :: String } | Baz { nickname :: String } 函数 name 和 nickname 似乎都是 Foo -> S
嘿,我猜这可能相当微不足道,但我很难找到答案或弄清楚它。 我正在尝试创建一个带有任意间距的彩色方 block 网格。这本身很容易做到,特别是因为我只需要九个正方形。但是虽然我看着我完成的代码,我不禁觉
我有 woocommerce 设置,其中包含产品和这些产品的变体。当我更改变化时(例如,产品的尺寸(340克或900克),我希望它在页面上动态更新价格,以便人们可以看到两种尺寸之间的价格差异。目前,我
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
在我的一节课上,我被问到这是一个脑筋急转弯,但我无法弄明白(这不是家庭作业问题,只是其中一位助教给我们的一个脑筋急转弯让我们思考)。 给你一根杆,上面有 n 个要切割的点,例如 [1,5,11],以及
关于 CRP如果我想实现它的细微变化(使用模板模板参数),我会得到一个编译错误: template class Derived> class Base { public: void Call
我正在创建一个 woocommerce 主题,并且我有产品变体,即显示在产品详细信息页面上的尺寸,但问题是我想通过使用产品 ID 在我的自定义 php 页面中获取所有变体,任何人都可以帮助我。 提前致
我正在使用 Ionic 开发移动应用程序,我必须与 Twitter API 连接。 所以我使用 ng-cordova 和 $cordovaAuth .但是当我这样做时: $cordovaOauth.t
这里的网站有一个音乐播放器http://www.numberonedesigns.com/ubermusic.com/ ...当点击下一个按钮并随机突出显示时,它不会正确随机化。它总是返回到播放列表中
我有列 sql 变体,其含义如下:100, 150, D1我正在尝试根据特定逻辑将列中的所有数字转换为字母(例如 D1)以防万一。但是 150 有空格并且 CASE WHEN 不起作用。 这是我正在使
有没有一种快速方法可以用从匹配模式派生的数据替换所有出现的某些模式? 例如,如果我想将字符串中出现的所有数字替换为用 0 填充到固定长度的相同数字。 在本例中,如果长度为 4,则 ab3cd5 将变为
我目前正在寻找生成具有特定位数的数字列表,我的代码当前如下: | Python 2.7 | import itertools inp = raw_input('Number of digits to
我正在对类型系统进行研究。对于这项工作,我正在研究流行语言中变体、结构子类型、通用多态性和存在多态性的用法。像 heskell、ocaml 这样的功能性语言提供了这样的功能。但我想知道像 C++ 这样
这是 variant.hpp 文件中的相关代码(可在此处找到 http://www.boost.org/doc/libs/1_49_0/boost/variant/variant.hpp) templ
您好,我有两个具有多对多关系的表和一个联结表。简而言之,具有不同属性的产品也随之增加了价格。为了更清楚地说明我是产品和属性表。 +-------------+------------+--------
我是一名优秀的程序员,十分优秀!