Я прочитал следующее руководство Bazel о переменных make (или пользовательских переменных): https://bazel.build/reference/be/make-variables#custom_variables
«Атрибуты, помеченные как «Подлежит замене «Создать переменную»», могут ссылаться на переменную «Создать» FOO следующим образом:»
my_attr = "prefix $(FOO) suffix"
Мой вопрос: как пометить атрибут как «Подлежит замене «Сделать переменную»»?
В документации об атрибутах правил об этом ничего нет: 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\n», но это «Hello world $(VERSION)\n».
К сожалению, это не очень понятно, но «Атрибуты, помеченные как «Подлежит замене «Создать переменную»» - это просто разговор о документации атрибутов правил. Невозможно настроить атрибут, чтобы он автоматически заменял переменные. Замена переменных выполняется в код реализации правила:
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 и некоторым собственным (т. е. реализованным внутри Bazel на Java) кодом конфигурации платформы. Его особенность заключается в том, что ctx.expand_make_variables
может автоматически искать переменные у platform_common.TemplateVariableInfo
-провайдеров, но только по определенным атрибутам, которые на самом деле невозможно использовать из Starlark (https://github.com/bazelbuild/bazel/blob/3f93d377d036d773fd505a18e084425a00fb94ea/src/main /java/com/google/devtools/build/lib/anaанализ/ConfigurationMakeVariableContext.java#L68-L72)
Возможно, будет полезно поговорить о том, чего вы хотите достичь, на более высоком уровне, поскольку может быть много способов достичь того, что вы ищете.