【问题标题】:Bazel environment variables in build rules构建规则中的 Bazel 环境变量
【发布时间】:2018-10-05 09:48:26
【问题描述】:

我想引用 BUILD 文件中的 DirectX SDK。问题是(据我了解)Bazel 仅支持通过 Bazel 的 --action_env=DXSDK_DIR 参数传递环境变量,并且它旨在用于必须在插件中定义的操作(.bzl 文件)。

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

【问题讨论】:

    标签: windows environment-variables bazel build-system


    【解决方案1】:

    原则上,您需要一个 cc_library 规则,其 hdrs 属性会覆盖 DirectX 标头。为此,您需要假装 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.whichPATH 上查找二进制文件。

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

    2。依赖SDK的cc_library

    在你的项目中,像普通的cc_library一样依赖SDK的库即可:

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

    【讨论】:

    • "如果您的存储库规则需要读取环境变量,请将它们添加到列表中"。您是否碰巧知道如何在自定义实现中做到这一点?找不到从repository_ctx访问环境变量的方法
    • this link之后找到了我自己的问题的答案:你可以使用ctx.os.environ
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2019-02-25
    • 2020-10-02
    • 2022-12-06
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多