原则上你需要一个cc_library
统治谁的hdrs
属性全局 DirectX 标头。为此,您需要假装 DX SDK 是源代码树的一部分。 Bazel 为此提供了“存储库规则”。
1. 为 DirectX SDK 创建存储库规则
根据 SDK 的位置是否已知或需要发现,您有两种选择。
A。固定 SDK 位置
如果您不需要读取任何环境变量、运行任何二进制文件或查询注册表来查找 SDK 的位置,则可以使用此方法。如果构建规则的每个人都将 SDK 安装到同一位置,就会出现这种情况。
只需添加一个new_local_repository https://docs.bazel.build/versions/master/be/workspace.html#new_local_repository规则给你的WORKSPACE
文件,指向规则的path
在SDK的目录下写一个简单的build_file_content
for it.
Example:
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
规则,你需要实现你自己的。更多信息和示例在这里。 https://stackoverflow.com/a/43936381/7778502
关键点:
如果您的存储库规则需要读取环境变量,请将它们添加到列表中repository_rule(environ)
, e.g. repository_rule(..., environ = ["DXSDK_DIR"])
如果您需要运行一些二进制文件来告诉您 SDK 的位置,请使用repository_ctx.execute https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute。您可以使用repository_ctx.which https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#which找到二进制文件PATH
.
如果您需要进行注册表查询,请使用repository_ctx.execute https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute with reg.exe /query <args>
2.依赖SDKcc_library
在你的项目中,就像普通的依赖SDK的库一样cc_library
:
cc_library(
name = "render",
...
deps = [
...
"@directx_sdk//:sdk",
],
)