Bazel 进行变量替换

问题描述 投票:0回答:1

我阅读了以下有关 make 变量(或自定义变量)的 bazel 手册: https://bazel.build/reference/be/make-variables#custom_variables

“标记为“服从‘Make 变量’替换”的属性可以引用“Make”变量 FOO,如下所示:”

my_attr = "prefix $(FOO) suffix"

我的问题是:如何将属性标记为“服从‘Makevariable’替换”?

关于规则属性的文档中没有任何内容: https://bazel.build/rules/lib/toplevel/attr

请帮忙

以我的例子

### BUILD.bazel

load("version.bzl", "version_rule")
load("file.bzl", "file")

version_rule(
    name = "version_provider",
    varname = "VERSION",
)

file(
    name = "hello",
    version = ":version_provider",
    output_name = "hello",
    content = "Hello world $(VERSION)\n",
)

### version.bzl

def _version_rule_impl(ctx):
    print("\n------------------- _version_rule_impl\n")
    return [
        platform_common.TemplateVariableInfo({
            'VERSION': '1-2-3-4',
        }),
    ]

version_rule = rule(
    implementation = _version_rule_impl,
    attrs = {
        "varname": attr.string(mandatory = True),
    },
)

### file.bzl

def file(**kwargs):
    _file(out = "{output_name}.txt".format(**kwargs), **kwargs)

def _impl(ctx):
    output = ctx.outputs.out
    ctx.actions.write(output = output, content = ctx.attr.content)

_file = rule(
    implementation = _impl,
    attrs = {
        "version": attr.label(providers=[platform_common.TemplateVariableInfo]),
        "output_name": attr.string(mandatory=True),
        "content": attr.string(),
        "out": attr.output()
    },
)

我预计生成的文件内容将是“Hello world 1-2-3-4 ”但它是“你好世界$(VERSION) ”

bazel rules
1个回答
0
投票

不幸的是,这不是很清楚,但是“标记为“服从‘Makevariable’替换的属性”只是在谈论规则属性的文档。没有配置属性来使其自动替换变量。变量替换已完成在规则实现代码中:

def _impl(ctx):
    output = ctx.outputs.out
    ctx.actions.write(
        output = output,
        content = ctx.expand_make_variables(
            "content",
            ctx.attr.content,
            ctx.attr.version[platform_common.TemplateVariableInfo].variables),
    )

在这种用法中,

platform_common.TemplateVariableInfo
没有什么特别的,我相信它最初是用作一些 Starlark 代码和一些本机(即在 Java 中的 Bazel 内部实现)平台配置代码之间的桥梁。它的特殊之处在于
ctx.expand_make_variables
可以自动搜索来自
platform_common.TemplateVariableInfo
提供者的变量,但只能通过 Starlark 无法真正使用的特定属性(https://github.com/bazelbuild/bazel/blob/3f93d377d036d773fd505a18e084425a00fb94ea/ src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java#L68-L72

© www.soinside.com 2019 - 2024. All rights reserved.