将 copts/defines 传播到目标的所有依赖项

2024-02-16

我有一个项目,在一个相当复杂的构建系统中的单个工作空间中涉及多个构建文件。简而言之,我的目标:对于某些特定目标,我希望使用一组额外的属性来构建其所有递归依赖项(copts/defines)与以任​​何其他方式构建这些依赖项目标时相比。我还没有找到一种方法来干净地做到这一点。

例如,目标 G 通常是用copts = []。如果目标 P 取决于目标 G,并且我运行bazel build :P,我希望两个目标都用copts = ["-DMY_DEFINE"],以及目标 G 的所有依赖项等。

The cc_binary.defines https://docs.bazel.build/versions/master/be/c-cpp.html#cc_binary.defines论证在opposite方向:依赖于某个目标 A 的所有目标都将接收目标 A 的所有目标defines.

限制:

  • 更喜欢避免自定义命令行标志,我不控制人们如何调用bazel {build,test}
  • 复制整个依赖目标树是不切实际的

似乎无法设置 a 的值config_setting从 BUILD 文件或目标中,所以看起来select基于的解决方案无法工作。

之前的工作:

  • https://groups.google.com/g/bazel-discuss/c/rZps4nqYqt8/m/YS_pZD6oAQAJ https://groups.google.com/g/bazel-discuss/c/rZps4nqYqt8/m/YS_pZD6oAQAJ- 2017,推荐“并行树”或自定义宏(我们已经有很多,将它们包装在另一个中将具有挑战性)
  • 将 copt 传播到 Bazel 中的所有依赖项 https://stackoverflow.com/questions/64186487/propagate-copts-to-all-dependencies-in-bazel- 我相信这些都依赖于自定义命令行标志

创建一个用户定义的构建设置 https://docs.bazel.build/versions/master/skylark/config.html#user-defined-build-settings不需要命令行标志。如果你设置flag = False,那么实际上无法在命令行上设置。您可以使用用户定义的转换 https://docs.bazel.build/versions/master/skylark/config.html#user-defined-transitions来设置它。

我认为这样的东西可以满足您的需求(将其保存在extra_copts.bzl):

def _extra_copts_impl(ctx):
    context = cc_common.create_compilation_context(
        defines = depset(ctx.build_setting_value)
    )
    return [CcInfo(compilation_context = context)]

extra_copts = rule(
    implementation = _extra_copts_impl,
    build_setting = config.string_list(flag = False),
)

def _use_extra_copts_implementation(ctx):
    return [ctx.attr._copts[CcInfo]]

use_extra_copts = rule(
    implementation = _use_extra_copts_implementation,
    attrs = "_copts": attr.label(default = "//:extra_copts")},
)

def _add_copts_impl(settings, attr):
    return {"//:extra_copts": ["MY_DEFINE"]}

_add_copts = transition(
    implementation = _add_copts_impl,
    inputs = [],
    outputs = ["//:extra_copts"],
)

def _with_extra_copts_implementation(ctx):
    infos = [d[CcInfo] for d in ctx.attr.deps]
    return [cc_common.merge_cc_infos(cc_infos = infos)]

with_extra_copts = rule(
    implementation = _with_extra_copts_implementation,
    attrs = {
        "deps": attr.label_list(cfg = _add_copts),
        "_allowlist_function_transition": attr.label(
            default = "@bazel_tools//tools/allowlists/function_transition_allowlist"
        )
    },
)

然后在BUILD file:

load("//:extra_copts.bzl", "extra_copts", "use_extra_copts", "with_extra_copts")

extra_copts(name = "extra_copts", build_setting_default = [])

use_extra_copts(name = "use_extra_copts")

cc_library(
    name = "G",
    deps = [":use_extra_copts"],
)

with_extra_copts(
    name = "P_deps",
    deps = [":G"],
)

cc_library(
    name = "P",
    deps = [":P_deps"],
)

extra_copts是构建设置。它返回一个CcInfo https://docs.bazel.build/versions/master/skylark/lib/CcInfo.html直接,这意味着使用相同的方法可以直接进行任何其他 C++ 库交换。它的默认值实际上是“空”CcInfo这不会对依赖它的库做任何事情。

with_extra_copts包装一组依赖项,配置为使用不同的CcInfo。这是实际更改值的规则,以创建具有不同标志的 G 的第二个版本。

_add_copts是一个过渡with_extra_copts用于改变的值extra_copts构建设置。它可以检查attr做一些比添加硬编码列表更复杂的事情。

use_extra_copts拉动CcInfo out of extra_copts so a cc_library可以使用它们。

为了避免重写内置的 C++ 规则,它使用包装器规则来拉出 copt 并进行转换。您可能想要创建宏来将包装器规则与相应的 cc_library 捆绑在一起。或者,您可以使用rules_cc 的 my_c_archive https://github.com/bazelbuild/rules_cc/blob/master/examples/my_c_archive/my_c_archive.bzl作为创建自定义规则的起点,这些规则重用内置 C++ 规则的核心实现,同时将构建设置的转换和使用集成到单个规则中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 copts/defines 传播到目标的所有依赖项 的相关文章

  • 【名名的Bazel笔记】自定义工具链实现交叉编译

    文章目录 1 前言2 Non Platform 方式3 Platform 方式3 1 平台3 1 1 概述3 1 2 定义约束和平台3 1 3 通用的约束和平台3 1 4 指定平台构建 3 2 工具链3 3 Platform 43 Tool
  • 如何从单个 java_test() 规则运行 Bazel 中的所有测试?

    我在 Bazel 中添加测试 但我不想为每个测试文件编写测试规则 但是 每个测试规则都需要一个 test class 正在运行的测试类 因此没有简单的方法可以使用单个 java test 规则运行所有测试 有没有一种解决方法可以让我不需要指
  • Bazel 如何构建一个链接预构建外部库的简单应用程序

    Using Bazel2 2 我如何针对外部库进行构建 例如在我的情况下 我想针对 boost 进行构建 为 MS VC 2019 预构建 问题是这在 Bazel 中可能吗 鉴于 boost 库的本地路径是 c boost 1 72 0 其
  • 张量流构建错误

    我在构建 Tensorflow 1 1 0 时遇到此错误 Starting local Bazel server and connecting to it ERROR home bishal cache bazel bazel bishal
  • 如何在 Bazel 中静态链接系统库?

    如何在大多数静态模式下静态链接系统库 linkstatic 1 我尝试使用 Wl Bstatic lboost thread Wl Bdynamic 或 Wl Bstatic lboost thread Wl Bdynamic 但它们都不起
  • 如何使用 Bazel 构建使用 OpenCV 的项目 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用 Bazel 构建使用 OpenCV 库的 C 代码的最佳方法是什么 即 构建规则是什么样的 应该如
  • 无法在 Ubuntu 20.04 上安装 bazel - EXPKEYSIG 无效

    我正在按照以下说明进行操作https docs bazel build versions master install ubuntu html install with installer ubuntu https docs bazel b
  • tools/bazel.rc 如何与外部工作区依赖项一起使用?

    如果我将外部 Bazel 项目作为 WORKSPACE 依赖项拉入 并且该项目有一个 tools bazel rc 添加了一些默认构建选项并定义了一些构建 config 选项 那么它到底是如何工作的 构建这些外部构建目标时是否使用这些默认选
  • 如何在 bazel 中指定 cc_library 的输出工件?

    我想将 foo c 构建为库 然后在生成的 so上执行 readelf 而不是 a 我如何在bazel中编写它 以下 BUILD bazel 文件不起作用 cc library name foo srcs foo c genrule nam
  • bazel是否支持不同平台上的远程执行?

    具体来说 我想从 Mac 主机对 Windows 工作线程运行测试 评论在不同的机器上运行 bazel 远程执行器测试 https stackoverflow com questions 44354378 running bazel rem
  • Bazel 和 Gradle 有什么区别?

    谷歌刚刚开源的 https github com bazelbuild bazel它的构建工具Bazel https bazel build 这个工具和之前有什么区别Gradle https gradle org 它能做什么 Gradle
  • 给定一个张量流模型图,如何找到输入节点和输出节点名称

    我在张量流相机演示中使用自定义模型进行分类 我生成了一个 pb 文件 序列化的 protobuf 文件 我可以显示它包含的巨大图表 将此图转换为优化图 如 中给出https www oreilly com learning tensorfl
  • 如何使用 bazel 中的 make 规则链接库构建

    我已经使用构建了一个 lib so在 bazel 中制定规则 https stackoverflow com questions 58035752 building makefile using bazel 如何将此外部 lib so 链接
  • 如何升级巴泽尔?

    我成功构建了 bazel 0 4 0 然后我尝试将其升级到最新版本巴泽尔 0 5 1 using compile sh compile bazel 0 4 0 output bazel exe 它给了我一个错误 巴泽尔 0 5 0 巴泽尔
  • 沙箱中的 Bazel 和 py_test - 有什么方法可以定义输出?

    我正在运行多个py test 项目数量的配置 由于它们数量众多 默认的沙箱机制似乎很方便 测试不会相互干扰 并且免费并行运行 不过 这是有代价的 据我了解 沙箱将导致 bazel 在临时目录中运行测试 结合py test规则未定义任何out
  • 是否有从 Maven 到 Bazel 的迁移路径?

    现在巴泽尔 http bazel io http bazel io 已经开源了 是否有一个增量过程可以让我逐渐从 Maven 迁移 一个大型存储库 到 Bazel 我在研究巴泽尔 不 据我们所知 没有这样的过程 我希望 我们一直在运行一些从
  • 将自定义文件夹添加到 bazel java 测试中的类路径

    我正在尝试将大型代码库从 Maven 迁移到 bazel 我发现一些测试写入target classes and target test classes并且生产代码将其读取为类路径上的资源 这是因为 maven Surefire fails
  • Bazel远程缓存分析数据

    我正在 jenkins 上的 docker 容器内运行 bazel 通过 bazelisk 此外 我使用远程缓存 在不进行任何更改的后续运行中 我获得 100 的缓存命中 但每次创建新容器时都会运行分析阶段 约 60 秒 有没有办法远程缓存
  • Tensorflow构建量化工具-bazel构建错误

    我正在尝试编译量化脚本 如下所述皮特 沃登的博客 https petewarden com 2016 05 03 how to quantize neural networks with tensorflow 但是 在运行以下 bazel
  • Bazel run - 传递主要参数

    我使用 java image 创建了一个图像 但我想将参数传递给我的主函数 即 String args 当我使用 bazel run name of image 命令时 我该如何做到这一点 bazel run your rule arg1

随机推荐

  • iOS 应用程序如何安装在设备上

    我有兴趣了解 iOS 应用程序如何安装在设备上的技术细节 我来解释一下我的情况 我的应用程序的 ipa 和 plist 在服务器上 我制作了一个使用 itms services 指向 plist 文件的下载网页 我尝试在我朋友的 iPhon
  • 石英 2D 中的“斜角”形状

    我熟悉 Quartz 2D 绘图的一些基础知识 例如绘制基本形状和渐变等 但我不确定如何绘制具有 斜角 外观的形状 如下所示 斜角圆 http www shaggyfrog com junk beveled circle jpg http
  • HttpContext.Current.Session 为空

    我有一个网站 在类库内有一个自定义缓存对象 所有项目都运行 NET 3 5 我想将此类转换为使用会话状态而不是缓存 以便在应用程序回收时保留状态服务器中的状态 但是 当我访问 Global asax 文件中的方法时 此代码会引发异常 Htt
  • javax.validation.NotBlank 缺少验证器

    我要求在公共 api 模块 多模块项目 中我不能使用任何类型的 hibernate 验证注释 所以我确实使用了 javax validation 中的一个 这是可以接受的 当我想验证包含 NotBlank 注释的域对象 我使用 vaadin
  • vertica-python 复制本地时出错

    我用这个代码 复制本地 在Python上垂直7 1 conn info host 192 168 1 1 port 5433 user dbadmin password xxxxxx database db connection verti
  • 如何使用 Koa 提供静态文件?

    我想在我的项目中实现通用链接 并且需要通过 Koa 提供 json 这是一个名为苹果应用程序站点关联 我的文件位于 assets apple app site association apple app site association f
  • 最小化窗口驱动程序selenium excel vba

    我已经搜索了很多方法来最小化 excel vba 的 selenium 中的驱动程序窗口 我已经找到了 Java 和 python 的方法并尝试采用它们 但我所有的尝试都失败了 我刚刚找到了一种使用最大化窗口的方法 bot Window M
  • 导入头文件的问题

    我正在将 Objective C 项目导入到我的 swift 项目中 我已经创建了桥接头并在 构建设置 下设置了路径 我已将搜索路径设置为头文件和库 问题是找不到我的头文件 当我构建时 找不到导入中的第二行 import VuforiaOb
  • 开发通用 Android 应用程序(手机和平板电脑)

    我正在开发一个通用的 Android 应用程序 我需要检查该应用程序是否在平板电脑或手机中运行 有什么方法可以做到吗 您可以检查Android 版 Google I O 应用程序 http code google com p iosched
  • 为什么 select2-removing 事件在带有allowClear的select2中没有触发?

    我想在我的中挂钩一个事件select2 http ivaynberg github io select2 documentation一旦它被清除 select2 初始化为allowClear true 然而事件 select on sele
  • Ionic 应用程序适用于 ios,但不适用于 Android

    我的应用程序可以在 ios 设备上与 ionicserve ionicview 和 ionicbuildios 配合使用 我的应用程序也可以在 Android 上的 ionic 视图中正常工作 但是 当我运行 ionic run andro
  • 在heroku上运行loaddata而不将数据文件添加到存储库

    我需要运行一个manage py loaddata命令将一些数据导入到我的heroku实例的数据库中 而heroku的ethereal文件系统在这方面出现了一些问题 我真的不想将数据文件添加到我的heroku存储库中 并在每次我想运行loa
  • Java:d​​ouble:如何始终显示两位小数

    我在项目中使用双精度值 并且我希望始终显示前两位小数 即使它们为零 我使用此函数进行舍入 如果我打印的值是 3 47233322 它 正确地 打印 3 47 但是 例如 当我打印值 2 时 它会打印 2 0 public static do
  • 在 Servlet 中使用 CDI 注入

    我正在尝试 Inject a SessionScoped将 bean 放入过滤器 WebFilter public class IdentityFilter implements Filter Serializable Inject pri
  • 未找到 Java 类的消息正文编写器

    我刚开始使用 JAX RS 并编写了一个输出 json 对象的示例应用程序 但我有一个例外 这是我的代码 Path hello public class HelloWorldService GET Path query artist id
  • 那么我在这里谈论的是 SOA 吗?

    对于政府合同 我们将建议建立一个交通监控架构 我们将有以下组件 摄像机设置在感兴趣区域周围 摄像机将了解它们的位置和方向以及观看参数 GIS地图服务器 可以查询街道 建筑物等 一种算法接收原始视频和街道位置信息并输出汽车位置 另一种算法接收
  • 检查字符串是否包含列表中的元素的更智能方法 - python

    List top brands包含品牌列表 例如 top brands Coca Cola Apple Victoria s Secret items is a pandas DataFrame结构如下图所示 我的任务是填写brand na
  • Visual Studio 2008 类视图缺少类

    我刚刚将一个大型项目从旧版本的 Visual C 移植到 VS2008 并注意到类视图缺少一些我的类 查看解决方案视图 声明这些类的头文件存在 因此我希望在类视图中看到它们 排除某些类的任何原因 或者有什么方法可以刷新类视图以包含解决方案中
  • shiny,DT,styleColorBar 正值和负值的颜色不同?

    我已阅读 DT pdf 文档并进行了搜索 但 DT 包似乎不支持不同的颜色 我怎样才能达到下面图片链接所示的效果 谢谢 示例 正值和负值使用不同的颜色 https asymmetryobservations files wordpress
  • 将 copts/defines 传播到目标的所有依赖项

    我有一个项目 在一个相当复杂的构建系统中的单个工作空间中涉及多个构建文件 简而言之 我的目标 对于某些特定目标 我希望使用一组额外的属性来构建其所有递归依赖项 copts defines 与以任 何其他方式构建这些依赖项目标时相比 我还没有