构建规则中的 Bazel 环境变量



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

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

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

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

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

a. 固定开发工具包位置

如果不需要读取任何环境变量、运行任何二进制文件或查询注册表来查找 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 的位置,则需要遵循此方法。

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

要点:

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

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

  • 如果需要执行注册表查询,请将repository_ctx.executereg.exe /query <args>一起使用

阿拉伯数字。取决于 SDK 的cc_library

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

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

相关内容

  • 没有找到相关文章

最新更新