我想在BUILD
文件中引用DirectX SDK。问题是(据我所知)Bazel支持仅通过Bazel的--action_env=DXSDK_DIR
参数传递环境变量,它意味着在动作中使用,必须在插件(.bzl
文件中定义)。
有没有更简单的方法来引用环境变量,将其用作Make变量(includes = [ "$(DXSDK_DIR)/Include" ]
),还是需要编写插件?
答案 0 :(得分:3)
原则上,您需要一个cc_library
规则,其hdrs
属性会覆盖DirectX标头。为此,您需要假装DX SDK是源树的一部分。 Bazel提供了"存储库规则"为此目的。
根据SDK的位置是否已知或需要发现,您有两种选择。
如果您不需要读取任何环境变量,运行任何二进制文件或查询注册表以查找SDK的位置,则可以使用此方法。如果构建规则的每个人都将SDK安装到同一位置,则会出现这种情况。
只需在WORKSPACE
文件中添加new_local_repository
规则,将规则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
。
如果您需要阅读环境变量,运行二进制文件或查询注册表以查找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>
一起使用
cc_library
在您的项目中,只需依赖SDK的库,就好像它是普通的cc_library
:
cc_library(
name = "render",
...
deps = [
...
"@directx_sdk//:sdk",
],
)