我想在 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/