gpt4 book ai didi

windows - 构建规则中的 Bazel 环境变量

转载 作者:可可西里 更新时间:2023-11-01 10:02:46 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com