我想在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.which
在PATH
上查找二进制文件。如果需要执行注册表查询,请将
repository_ctx.execute
与reg.exe /query <args>
一起使用
阿拉伯数字。取决于 SDK 的cc_library
在您的项目中,只需依赖SDK的库,就好像它是一个普通的cc_library
:
cc_library(
name = "render",
...
deps = [
...
"@directx_sdk//:sdk",
],
)