构建规则中的Bazel环境变量

时间:2018-04-25 03:02:43

标签: windows environment-variables bazel build-system

我想在BUILD文件中引用DirectX SDK。问题是(据我所知)Bazel支持仅通过Bazel的--action_env=DXSDK_DIR参数传递环境变量,它意味着在动作中使用,必须在插件(.bzl文件中定义)。

有没有更简单的方法来引用环境变量,将其用作Make变量(includes = [ "$(DXSDK_DIR)/Include" ]),还是需要编写插件?

1 个答案:

答案 0 :(得分:3)

原则上,您需要一个cc_library规则,其hdrs属性会覆盖DirectX标头。为此,您需要假装DX SDK是源树的一部分。 Bazel提供了"存储库规则"为此目的。

1。为DirectX SDK

创建存储库规则

根据SDK的位置是否已知或需要发现,您有两种选择。

一个。修复了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发现

如果您需要阅读环境变量,运行二进制文件或查询注册表以查找SDK的位置,则需要遵循此方法。

您需要实现自己的规则,而不是使用new_local_repository规则。 More info and examples are here.

关键点:

  • 如果您的存储库规则需要读取环境变量,请将它们添加到列表repository_rule(environ),例如repository_rule(..., environ = ["DXSDK_DIR"])

  • 如果您需要运行一些告诉您SDK位置的二进制文件,请使用repository_ctx.execute。您可以使用repository_ctx.whichPATH上找到二进制文件。

  • 如果您需要进行注册表查询,请将repository_ctx.executereg.exe /query <args>一起使用

2。取决于SDK的cc_library

在您的项目中,只需依赖SDK的库,就好像它是普通的cc_library

cc_library(
    name = "render",
    ...
    deps = [
        ...
        "@directx_sdk//:sdk",
    ],
)