构建规则中的 Bazel 环境变量

2024-02-28

我想参考 DirectX SDKBUILD文件。问题是(据我所知)Bazel 仅支持通过--action_env=DXSDK_DIRBazel 的参数,它应该在动作中使用,必须在插件中定义(.bzl file).

有没有更简单的方法通过将环境变量用作 Make 变量来引用环境变量(includes = [ "$(DXSDK_DIR)/Include" ])或者我需要写一个插件吗?


原则上你需要一个cc_library统治谁的hdrs属性全局 DirectX 标头。为此,您需要假装 DX SDK 是源代码树的一部分。 Bazel 为此提供了“存储库规则”。

1. 为 DirectX SDK 创建存储库规则

根据 SDK 的位置是否已知或需要发现,您有两种选择。

A。固定 SDK 位置

如果您不需要读取任何环境变量、运行任何二进制文件或查询注册表来查找 SDK 的位置,则可以使用此方法。如果构建规则的每个人都将 SDK 安装到同一位置,就会出现这种情况。

只需添加一个new_local_repository https://docs.bazel.build/versions/master/be/workspace.html#new_local_repository规则给你的WORKSPACE文件,指向规则的path在SDK的目录下写一个简单的build_file_content for it.

Example:

new_local_repository(
    name = "directx_sdk",
    path = "c:/program files/directx/sdk/includes",
    build_file_contents = """
cc_library(
    name = "sdk",
    hdrs = glob(["**/*.h"]),
    visibility = ["//visibility:public"],
)
""")

该规则创建了@directx_sdk其根包中包含一条规则的存储库,@directx_sdk//:sdk.

b. SDK发现

如果您需要读取环境变量、运行二进制文件或查询注册表以查找 SDK 的位置,则需要遵循此方法。

而不是使用new_local_repository规则,你需要实现你自己的。更多信息和示例在这里。 https://stackoverflow.com/a/43936381/7778502

关键点:

  • 如果您的存储库规则需要读取环境变量,请将它们添加到列表中repository_rule(environ), e.g. repository_rule(..., environ = ["DXSDK_DIR"])

  • 如果您需要运行一些二进制文件来告诉您 SDK 的位置,请使用repository_ctx.execute https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute。您可以使用repository_ctx.which https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#which找到二进制文件PATH.

  • 如果您需要进行注册表查询,请使用repository_ctx.execute https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute with reg.exe /query <args>

2.依赖SDKcc_library

在你的项目中,就像普通的依赖SDK的库一样cc_library:

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

构建规则中的 Bazel 环境变量 的相关文章

  • 如何使用Windows批处理命令删除“无扩展名的文件”的所有内容

    我想删除以 FIlE 为扩展名的文件的内容 即没有扩展名 我知道如何删除文本文件的内容 但不知道如何删除以 文件 为扩展名的文件 我会感谢你的努力 提前致谢 Use Del 在批处理文件中删除没有扩展名的文件 use Dir A D 列出所
  • 如何在Windows中收集每个服务名称及其状态?

    我想在不使用任何第三方工具的情况下获取所有 service name 及其状态 迄今为止SC http ss64 com nt sc html命令足以获取其中一个值 例如 sc query findstr SERVICE NAME 但我还需
  • Windows下Kafka托管在Docker中删除主题时出现异常

    我在 Windows 的 Docker 中托管 Kafka 威斯迈斯特 卡夫卡 https hub docker com r wurstmeister kafka 使用 docker 镜像 Kafka 数据存储在本地 Windows 文件夹
  • 在新窗口中打开 SAS 程序

    目前 当您在 Windows 中双击 SAS 文件时 它将在您已打开的现有 SAS 会话中打开它 有没有办法让它在窗口中单击时会启动一个新的 SAS 窗口 据我所知 SAS 是一个所谓的 单实例 应用程序 因此它的默认行为是在现有会话中打开
  • 在 Android SDK 中设置 JAVA_HOME

    我和对方有一些冲突JAVA HOME配置 当我使用以下代码时 System out println System getenv JAVA HOME I get C jdk1 6 0 23这是正确的地方 但是 当我在 Android buil
  • 如何在 PowerShell 中键入 TAB 字符?

    Task 默认情况下 在 Windows 命令提示符中按 TAB 键将输出文件名 而在 PowerShell 中则不会执行任何操作 我希望能够在交互模式下键入 TAB 字符 而不是通过脚本 Research 我在这个网站上和通过谷歌搜索发现
  • Python 可执行文件:py2exe 还是 PyInstaller?

    要创建可执行文件 Windows 我假设我们应该使用其中之一 Py2exe 或 PyInstaller 它们之间有什么区别 Py2exe 和 PyInstaller 都是包装器 但我注意到以下几点差异 Py2exe 与 python2 4
  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • 如何更改选项卡控件的名称

    我在 C WinForms 应用程序中使用选项卡控件 我想更改选项卡的标题 默认情况下它们是 tabPage1 tabPage2 等 一种无需代码即可实现的懒惰方法 选择选项卡控件 Go to properties use F4 to do
  • 以编程方式最小化/恢复窗口,跳过动画效果

    我需要对窗口列表执行多项操作 最小化其中一些 恢复其他 以便立即在两组或多组窗口之间切换 这样做的问题是最小化和恢复窗口时可以看到的动画 整个过程看起来很糟糕 所有这些动画都进进出出 上下移动 但是 我无法禁用这些动画 因为这是针对其他计算
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 将 JSON 导出到环境变量

    如果我有这样的 JSON hello1 world1 testk testv 我想将每个键值对导出为环境变量 如何通过 shell 脚本来做到这一点 例如 当我在终端上写时 echo hello1 world1应该打印其他键值对吗 注意 上
  • 从命令行运行 R 代码 (Windows)

    我在名为 analysis r 的文件中有一些 R 代码 我希望能够从命令行 CMD 运行该文件中的代码 而无需通过 R 终端 并且我还希望能够传递参数并在我的代码中使用这些参数 例如就像下面的伪代码 C gt execute r scri
  • 取消后调用 boost::asio 异步处理程序没有错误

    我的代码在单个线程中使用 boost asio 和 io service 来执行各种套接字操作 所有操作都是异步的 每个处理程序都依赖于boost system error code 特别boost asio error operation
  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • 在 Cygwin 软件包列表中找不到 Openssl

    这里说的是https github com joyent node wiki Building node js on Cygwin Windows https github com joyent node wiki Building nod
  • Vim 在 Mingw 上表现异常

    我在 MinGW 4 6 2 上的 Vim 表现得很奇怪 例如 在插入模式下按 Backspace 会删除字符 但我必须用箭头键移动光标才能删除的字符消失 而且它也会使我退出插入模式 另一个例子 按 Del 删除字符有时会生成奇怪的字符 例
  • 自定义波特率,redux

    我遇到的问题详述如下自定义波特率 https stackoverflow com questions 7714060 custom baud rate SetCommState 波特率 921600 失败 但波特率 115200 成功 尽管
  • 如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?

    更大的问题是一般如何使用实时 ETW 网络堆栈事件 但我特别感兴趣Microsoft Windows NDIS PacketCapture 提供程序 所有其他网络堆栈提供程序都部分工作 但 NDIS PacketCapture NDIS P
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A

随机推荐

  • Rplotly - 绘制分组线

    我正在从 ggplot2 迁移到plotly 以便利用它们提供的交互功能 我确实意识到plotly库有一个ggplotly函数 我可以用它来封装本机ggplot命令 但我想学习如何使用本机plotly命令绘制类似的图形 我的问题是我似乎无法
  • 自定义 RES 屏幕和 RES 图标已替换为默认的 Cordova 屏幕和图标

    我正在使用适用于 Apache Cordova 的 Visual Studio 工具 我已经测试了 CLI 6 4 0 不幸的是 RES 屏幕和 RES 图标存在错误 如果我使用 CLI 6 3 1 这个问题就会消失 为了演示它 我从头开始
  • 有没有可以阅读 ePub 书籍的 API? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试为 WP7 创建电子书阅读器 到目前为止 我还没有找到任何 API 来阅读 ePub 书籍 谢谢 扎因 对于基于 DRM fre
  • 列的数据被截断?

    更改 MySql 列的数据类型以存储后Twilio 通话 https www twilio com docs api rest call ids 34 个字符字符串 我尝试使用以下命令手动更改该列中的数据 update calls set
  • 如何在带有 View Holder 的自定义 ListView 中使用 Button OnClick

    我需要一些帮助 我正在使用视图保持器从动态数组适配器显示 我有列表视图 每行包含 标题 文本视图 副标题 TextView 进度条 下载按钮 按钮 我想在单击下载按钮时显示进度栏并隐藏下载按钮 单击第一行的下载按钮时 会显示第一个进度条 但
  • 如何在glmnet中指定日志链接?

    我正在使用 R 中的 glmnet 和 caret 包在广义线性模型上运行弹性网络 我的响应变量是成本 其中成本 gt 0 因此我想为我的 GLM 指定一个带有日志链接的高斯族 然而 glmnet 似乎不允许我指定 link log 如下
  • freeglut 与 glew 的区别?

    我最近开始学习 OpenGL gt 3 3 并且我注意到很多示例和教程都使用 freeglut 和 glew 但根本没有真正解释其中的区别 在谷歌搜索和阅读令人作呕的内容之后 我发现的最好的描述是这样的OpenGL相关工具包和API htt
  • 无法使用本地 hadoop 连接 azure blob 存储

    在尝试连接时本地hadoop与AZURE BLOB存储 即使用作为 HDFS 的 Blob 存储 和 Hadoop 版本 2 7 1 它抛出异常 这里我已经通过设置属性成功形成了本地集群
  • 我可以更新 INT 值 + 1 并返回新值吗?

    MySQL PHP 是否可以在一次查询中增加 INT 值并返回新值 sql mysql query UPDATE table SET number number 1 WHERE id uniqid updated number 或者我需要发
  • SQL Azure 和 Azure 表存储如何比较? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何检查 Ubuntu 上是否正在运行一个我不知道名称的服务

    我不知道该服务的名称 但想通过检查其状态来停止该服务 例如 如果我想检查是否PostgreSQL http en wikipedia org wiki PostgreSQL服务是否正在运行 但我不知道服务的名称 那么如何检查其状态 如果服务
  • 如何在 Swift 中分配/释放不安全指针?

    在 Beta 4 中 我的代码运行良好 var red green blue alpha UnsafePointer
  • 仅当字符串中的第 n 个字符是 R 中的特定字符时才替换它

    我正在将一系列调查导入为 csv 文件并组合成一个数据集 问题在于七个文件之一的某些变量的导入略有不同 数据集很大 我想找到一种方法来编写一个函数来运行给我带来麻烦的数据集 在某些变量中 应该有点的时候却有下划线 并非所有变量都具有相同的格
  • 在我的 Flex 应用程序中获取数据的最佳方式是什么?

    我是 Flex 开发新手 在创建新的移动项目时 它询问我是否要将其连接到某些服务器 并给了我四个选项 ColdFusion PHP Java 和 blazeDS 我一直在 java 工作 而不是 PHP 人员 我会简单地选择Java并忽略了
  • 变量未在 PHP 循环中传递/更新

    所以基本上我正在做的是创建 php 脚本 该脚本打印表格并根据表单中输入的内容更新和计算值 所以我有一个单独的 HTML 文件 其中包含表单 它传递 3 个变量 tempStart tempEnd windSpeed 然后我创建了一个在表的
  • 在 Eclipse 帮助中搜索 RCP 未返回任何结果

    我有一个 RCP 应用程序 并在菜单上启用了帮助 我能够成功调出我创建的帮助 但是 当我输入搜索词时 没有返回结果 需要什么才能从 Eclipse 帮助引擎搜索我的帮助内容 解决方案是使用帮助内容更新插件的版本号以重建索引 我依赖 qual
  • VS2010 构建后事件,替换文件中的字符串。电源外壳?

    在 VS2010 中成功构建后 我需要替换缩小的 js 文件中的简单字符串 因此 我尝试从 构建后事件 窗口运行一个简单的命令行调用 这个例子 来自这里 https blogs technet com b heyscriptingguy a
  • Polymer 中的横向通信

    问题是这样的 任何两个聚合物元素都可能需要通信 没有假设这些元素可能位于 DOM 或影子 DOM 中的位置 这意味着一个事件不能简单地冒泡到另一个元素 实现这一点的好旧方法是让事件冒泡到根节点 然后触发播送根节点上的事件供其他元素监听 然而
  • 如何在sklearn中找到多个节点的最近邻居?

    所以基本上我正在开发一个推荐系统 其中用户可以选择多个电影 节点 并给出与用户选择的所有电影 节点 相似的推荐 为了做到这一点 我需要同时找到这些多个节点的最近邻居 即结果应该接近node1 and node2 我怎样才能做到这一点 X 0
  • 构建规则中的 Bazel 环境变量

    我想参考 DirectX SDKBUILD文件 问题是 据我所知 Bazel 仅支持通过 action env DXSDK DIRBazel 的参数 它应该在动作中使用 必须在插件中定义 bzl file 有没有更简单的方法通过将环境变量用