构建规则中的 Bazel 环境变量

shy*_*cha 5 windows environment-variables build-system bazel

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

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

Lás*_*zló 7

原则上,您需要一个cc_library规则,其hdrs属性与 DirectX 标头相关联。为此,您需要假装 DX SDK 是您的源代码树的一部分。Bazel 为此提供了“存储库规则”。

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

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

一种。固定 SDK 位置

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

只需new_local_repository在您的WORKSPACE文件中添加一条规则,将规则指向pathSDK 的目录并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"],
)
""")
Run Code Online (Sandbox Code Playgroud)

此规则@directx_sdk在其根包中使用一个规则创建存储库,@directx_sdk//:sdk.

湾 SDK发现

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

new_local_repository您需要实现自己的规则,而不是使用规则。更多信息和示例在这里。

关键点:

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

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

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

2. 依赖于 SDK 的 cc_library

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

cc_library(
    name = "render",
    ...
    deps = [
        ...
        "@directx_sdk//:sdk",
    ],
)
Run Code Online (Sandbox Code Playgroud)