我阅读了以下有关 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) ”
不幸的是,这不是很清楚,但是“标记为“服从‘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)