windows - 构建规则中的 Bazel 环境变量

标签 windows environment-variables bazel build-system

我想在 BUILD 文件中引用一个 DirectX SDK。问题是(据我所知)Bazel 仅支持通过 Bazel 的 --action_env=DXSDK_DIR 参数传递环境变量,它旨在用于操作,必须在插件中定义(.bzl 文件)。

有没有更简单的方法来引用环境变量,将其用作 Make 变量 (includes = [ "$(DXSDK_DIR)/Include"]) 还是我需要编写一个插件?

最佳答案

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

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

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

一个。固定SDK位置

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

只需添加一个 new_local_repository 统治你的WORKSPACE文件,指向规则的path在 SDK 的目录中并编写一个简单的 build_file_content

例子:

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规则,您需要实现自己的规则。 More info and examples are here.

要点:

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

  • 如果您需要运行一些二进制文件来告诉您 SDK 的位置,请使用 repository_ctx.execute .您可以使用 repository_ctx.which PATH 上查找二进制文件.

  • 如果您需要进行注册表查询,请使用 repository_ctx.execute reg.exe /query <args>

2。依赖SDK的cc_library

在你的项目中,只依赖SDK的库,就好像它是一个普通的cc_library :

cc_library(
    name = "render",
    ...
    deps = [
        ...
        "@directx_sdk//:sdk",
    ],
)

关于windows - 构建规则中的 Bazel 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50013431/

相关文章:

windows - 以编程方式创建 Windows session

c# - 无法强制 WebBrowser 控件使用当前版本的 IE 呈现

python - 我们可以在调用时设置 AWS python lambda 的环境变量吗

html - 如何在href标签中传递变量?

c - Bazel:使用宏从列表生成构建规则

java - 如何使用 tomcat 在 Windows IIS 中托管 spring 项目?

linux - 从 Windows 和 Eclipse 连接到 gitolite 服务器

c++ - Bazel:将编译标志添加到默认 C++ 工具链

node.js - 如何动态更改在 Docker 容器中运行的 React 应用程序中的 API URL,而无需重建?

java - Bazel 卡在 java 二进制文件上