Arquivos .bzl

Reportar um problema Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Métodos globais disponíveis em todos os arquivos .bzl.

Membros

analysis_test_transition

transition analysis_test_transition(settings)

Cria uma transição de configuração a ser aplicada às dependências de uma regra de teste de análise. Essa transição só pode ser aplicada em atributos de regras com analysis_test = True. Essas regras são restritas em recursos (por exemplo, o tamanho da árvore de dependência é limitado), portanto, as transições criadas usando essa função são limitadas no escopo potencial em comparação com as transições criadas usando transition().

Essa função foi projetada principalmente para facilitar a biblioteca principal do Analysis Test Framework. Consulte a documentação (ou a implementação) para conferir as práticas recomendadas.

Parâmetros

Parâmetro Descrição
settings dict; obrigatório
Um dicionário com informações sobre as configurações que precisam ser definidas por essa transição. As chaves são rótulos de configurações de build e os valores são os novos valores pós-transição. Todas as outras configurações permanecem inalteradas. Use isso para declarar configurações específicas que um teste de análise precisa definir para ser aprovado.

aspecto

Aspect aspect(implementation, attr_aspects=[], toolchains_aspects=[], attrs={}, required_providers=[], required_aspect_providers=[], provides=[], requires=[], fragments=[], host_fragments=[], toolchains=[], incompatible_use_toolchain_transition=False, doc=None, *, apply_to_generating_rules=False, exec_compatible_with=[], exec_groups=None, subrules=[])

Cria um novo aspecto. O resultado dessa função precisa ser armazenado em um valor global. Consulte a introdução aos aspectos para mais detalhes.

Parâmetros

Parâmetro Descrição
implementation function; required
Uma função Starlark que implementa esse aspecto, com exatamente dois parâmetros: Target (o destino a que o aspecto é aplicado) e ctx (o contexto da regra em que o destino é criado). Os atributos do destino estão disponíveis no campo ctx.rule. Essa função é avaliada durante a fase de análise para cada aplicação de um aspecto a um destino.
attr_aspects Sequência de strings; O padrão é []
Lista de nomes de atributos. O aspecto se propaga com as dependências especificadas nos atributos de um destino com esses nomes. Os valores comuns incluem deps e exports. A lista também pode conter uma única string "*" para propagar todas as dependências de um destino.
toolchains_aspects sequência: o padrão é []
Lista de tipos de toolchain. O aspecto é propagado para os conjuntos de ferramentas de destino que correspondem a esses tipos.
attrs dict; o padrão é {}
Um dicionário que declara todos os atributos do aspecto. Ele mapeia um nome de atributo para um objeto de atributo, como attr.label ou attr.string (consulte o módulo attr). Os atributos de aspecto estão disponíveis para a função de implementação como campos do parâmetro ctx.

Os atributos implícitos que começam com _ precisam ter valores padrão e tipo label ou label_list.

Os atributos explícitos precisam ter o tipo string e usar a restrição values. Os atributos explícitos restringem o uso do aspecto apenas com regras que têm atributos com o mesmo nome, tipo e valores válidos de acordo com a restrição.

Os atributos declarados vão converter None no valor padrão.

required_providers sequência: o padrão é []
. Esse atributo permite que o aspecto limite a propagação apenas para os destinos cujas regras anunciam os provedores obrigatórios. O valor precisa ser uma lista que contenha provedores individuais ou listas de provedores, mas não ambos. Por exemplo, [[FooInfo], [BarInfo], [BazInfo, QuxInfo]] é um valor válido, enquanto [FooInfo, BarInfo, [BazInfo, QuxInfo]] não é.

Uma lista de provedores não aninhada é convertida automaticamente em uma lista que contém uma lista de provedores. Ou seja, [FooInfo, BarInfo] será convertido automaticamente em [[FooInfo, BarInfo]].

Para que algumas regras (por exemplo, some_rule) sejam visíveis para um aspecto, some_rule precisa anunciar todos os provedores de pelo menos uma das listas de provedores obrigatórias. Por exemplo, se o required_providers de um aspecto for [[FooInfo], [BarInfo], [BazInfo, QuxInfo]], esse aspecto poderá acessar os destinos some_rule se e somente se some_rule fornecer FooInfo, ou BarInfo, ou BazInfo e QuxInfo.

required_aspect_providers sequência: o padrão é []
. Esse atributo permite que esse aspecto inspecione outros aspectos. O valor precisa ser uma lista que contenha provedores individuais ou listas de provedores, mas não ambos. Por exemplo, [[FooInfo], [BarInfo], [BazInfo, QuxInfo]] é um valor válido, enquanto [FooInfo, BarInfo, [BazInfo, QuxInfo]] não é.

Uma lista de provedores não aninhada é convertida automaticamente em uma lista que contém uma lista de provedores. Ou seja, [FooInfo, BarInfo] será convertido automaticamente em [[FooInfo, BarInfo]].

Para tornar outro aspecto (por exemplo, other_aspect) visível para esse aspecto, other_aspect precisa fornecer todos os provedores de pelo menos uma das listas. No exemplo de [[FooInfo], [BarInfo], [BazInfo, QuxInfo]], esse aspecto pode ver other_aspect se e somente se other_aspect fornecer FooInfo, ou BarInfo, ou BazInfo e QuxInfo.

provides sequence: o padrão é []
. Uma lista de provedores que a função de implementação precisa retornar.

É um erro se a função de implementação omitir qualquer um dos tipos de provedor listados aqui do valor de retorno. No entanto, a função de implementação pode retornar outros provedores não listados aqui.

Cada elemento da lista é um objeto *Info retornado por provider(), exceto que um provedor legado é representado pelo nome da string.Quando um destino da regra é usado como uma dependência para um destino que declara um provedor obrigatório, não é necessário especificar esse provedor aqui. Basta que a função de implementação o retorne. No entanto, é considerada uma prática recomendada especificar o valor, mesmo que isso não seja obrigatório. No entanto, o campo required_providers de um aspecto exige que os provedores sejam especificados aqui.

requires Sequência de aspectos: o padrão é []
. Lista de aspectos que precisam ser propagados antes deste.
fragments Sequência de strings. O padrão é []
. Lista de nomes de fragmentos de configuração que o aspecto exige na configuração de destino.
host_fragments Sequência de strings. O padrão é []
. Lista de nomes de fragmentos de configuração que o aspecto exige na configuração do host.
toolchains sequência: o padrão é []
. Se definido, o conjunto de toolchains que esse aspecto exige. A lista pode conter objetos String, Label ou StarlarkToolchainTypeApi, em qualquer combinação. As cadeias de ferramentas serão encontradas verificando a plataforma atual e fornecidas à implementação do aspecto por meio de ctx.toolchain.
incompatible_use_toolchain_transition bool; o padrão é False
Descontinuado, não está mais em uso e precisa ser removido.
doc string ou None; o padrão é None
Uma descrição do aspecto que pode ser extraído por ferramentas de geração de documentação.
apply_to_generating_rules bool; o padrão é False
Se verdadeiro, o aspecto será aplicado à regra de geração do arquivo de saída quando aplicado a um arquivo de saída.

Por exemplo, suponha que um aspecto se propague transitivamente pelo atributo "deps" e seja aplicado ao destino "alpha". Suponha que "alpha" tenha "deps = [':beta_output']", em que "beta_output" é uma saída declarada de um destino "beta". Suponha que "beta" tenha um destino "charlie" como um dos "deps". Se "apply_to_generating_rules=True" para o aspecto, ele vai se propagar por "alpha", "beta" e "charlie". Se for falso, o aspecto vai se propagar apenas para "alpha".

O padrão é "falso".

exec_compatible_with Sequência de strings. O padrão é []
. Uma lista de restrições na plataforma de execução que se aplicam a todas as instâncias desse aspecto.
exec_groups dict ou None; o padrão é None
Dict do nome do grupo de execução (string) para exec_groups. Se definido, permite que os aspectos executem ações em várias plataformas de execução em uma única instância. Consulte a documentação sobre grupos de execução para mais informações.
subrules Sequência de subregras. O padrão é []
. Experimental: lista de subregras usadas por esse aspecto.

configuration_field

LateBoundDefault configuration_field(fragment, name)

Faz referência a um valor padrão com limite tardio para um atributo do tipo rótulo. Um valor é "limitado tardiamente" se ele exige que a configuração seja criada antes da determinação do valor. Qualquer atributo que use esse valor precisa ser privado.

Exemplo de uso:

Definição de um atributo de regra:

'_foo': attr.label(default=configuration_field(fragment='java', name='toolchain'))

Acesso na implementação de regras:

  def _rule_impl(ctx):
    foo_info = ctx.attr._foo
    ...

Parâmetros

Parâmetro Descrição
fragment string; required
O nome de um fragmento de configuração que contém o valor de vinculação tardia.
name string; obrigatório
O nome do valor a ser extraído do fragmento de configuração.

depset

depset depset(direct=None, order="default", *, transitive=None)

Cria um depset. O parâmetro direct é uma lista de elementos diretos do depset, e o parâmetro transitive é uma lista de depsets cujos elementos se tornam elementos indiretos do depset criado. A ordem em que os elementos são retornados quando o depset é convertido em uma lista é especificada pelo parâmetro order. Consulte a Visão geral dos conjuntos de dependências para mais informações.

Todos os elementos (diretos e indiretos) de um depset precisam ser do mesmo tipo, conforme obtido pela expressão type(x).

Como um conjunto baseado em hash é usado para eliminar duplicatas durante a iteração, todos os elementos de um depset precisam ser hasháveis. No entanto, esse invariante não é verificado de forma consistente em todos os construtores. Use a flag --incompatible_always_check_depset_elements para ativar a verificação consistente. Esse será o comportamento padrão em versões futuras. Consulte Issue 10313.

Além disso, os elementos precisam ser imutáveis, embora essa restrição seja relaxada no futuro.

A ordem do depset criado precisa ser compatível com a ordem dos depsets transitive. O pedido "default" é compatível com qualquer outro pedido, e todos os outros pedidos são compatíveis apenas com eles mesmos.

Parâmetros

Parâmetro Descrição
direct sequência ou None; o padrão é None
Uma lista de elementos diretos de um depset.
order string; O padrão é "default"
A estratégia de travessia para o novo depset. Consulte aqui os valores possíveis.
transitive sequência de depsets ou None; o padrão é None
Uma lista de depsets cujos elementos se tornarão elementos indiretos do depset.

exec_group

exec_group exec_group(toolchains=[], exec_compatible_with=[])

Cria um grupo de execução que pode ser usado para criar ações para uma plataforma de execução específica durante a implementação da regra.

Parâmetros

Parâmetro Descrição
toolchains sequência; o padrão é []
O conjunto de toolchains necessário para esse grupo de execução. A lista pode conter objetos String, Label ou StarlarkToolchainTypeApi, em qualquer combinação.
exec_compatible_with Sequência de strings; o padrão é []
Uma lista de restrições na plataforma de execução.

exec_transition

transition exec_transition(implementation, inputs, outputs)

Uma versão especializada de transition() usada para definir a transição de execução. Consulte a documentação (ou a implementação) para conferir as práticas recomendadas. Só pode ser usado nos built-ins do Bazel.

Parâmetros

Parâmetro Descrição
implementation callable; required
inputs sequência de strings; obrigatório
outputs sequência de strings; obrigatório

macro

macro macro(implementation, attrs={}, inherit_attrs=None, finalizer=False, doc=None)

Define uma macro simbólica, que pode ser chamada em arquivos BUILD ou macros (legado ou simbólico) para definir destinos, possivelmente vários.

O valor retornado por macro(...) precisa ser atribuído a uma variável global em um arquivo .bzl. O nome da variável global será o nome do símbolo da macro.

Consulte Macros para conferir um guia completo sobre como usar macros simbólicas.

Parâmetros

Parâmetro Descrição
implementation function; required
A função Starlark que implementa essa macro. Os valores dos atributos da macro são transmitidos para a função de implementação como argumentos de palavras-chave. A função de implementação precisa ter pelo menos dois parâmetros nomeados, name e visibility, e, se a macro herdar atributos (consulte inherit_attrs abaixo), ela precisa ter um parâmetro de palavra-chave residual **kwargs.

Por convenção, a função de implementação precisa ter um parâmetro nomeado para qualquer atributo que a macro precise examinar, modificar ou transmitir para destinos que não sejam "principais", enquanto os atributos herdados em massa que serão transmitidos para o destino "principal" sem alterações são transmitidos como **kwargs.

A função de implementação não pode retornar um valor. Em vez disso, a função de implementação declara as metas chamando regras ou símbolos de macro.

O nome de qualquer destino ou macro simbólico interno declarado por uma macro simbólica (incluindo qualquer função Starlark que a função de implementação da macro chama transitivamente) precisa ser igual a name (chamado de destino "principal") ou começar com name, seguido por um caractere separador ("_", "-" ou ".") e um sufixo de string. Os destinos que violam esse esquema de nomenclatura podem ser declarados, mas não podem ser criados, configurados ou usados como dependência.

Por padrão, os destinos declarados por uma macro simbólica (incluindo qualquer função Starlark que a função de implementação da macro chame transitivamente) são visíveis apenas no pacote que contém o arquivo .bzl que define a macro. Para declarar alvos visíveis externamente, incluindo o autor da chamada da macro simbólica, a função de implementação precisa definir visibility de maneira adequada, normalmente transmitindo visibility = visibility para a regra ou o símbolo da macro que está sendo chamada.

As APIs abaixo não estão disponíveis em uma função de implementação de macro e em qualquer função Starlark que ela chama transitivamente:

attrs dict: o padrão é {}
. Um dicionário dos atributos compatíveis com essa macro, análogo a rule.attrs. As chaves são nomes de atributos, e os valores são objetos de atributos, como attr.label_list(...) (consulte o módulo attr) ou None. Uma entrada None significa que a macro não tem um atributo com esse nome, mesmo que ela o herde por inherit_attrs (consulte abaixo).

O atributo especial name é predeclarado e não precisa ser incluído no dicionário. O nome do atributo visibility é reservado e não pode ser incluído no dicionário.

Atributos com nomes que começam com _ são privados. Eles não podem ser transmitidos no site de chamada da regra. Esses atributos podem receber um valor padrão (como em attr.label(default="//pkg:foo")) para criar uma dependência implícita em um rótulo.

Para limitar o uso de memória, há um limite no número de atributos que podem ser declarados.

inherit_attrs rule; ou macro; ou string; ou None; O padrão é None
Experimental. Esse parâmetro é experimental e pode mudar a qualquer momento. Não dependa dele. Ele pode ser ativado de forma experimental definindo --experimental_enable_macro_inherit_attrs
Um símbolo de regra, símbolo de macro ou o nome de uma lista de atributos comuns integrada (consulte abaixo) da qual a macro precisa herdar atributos.

Se inherit_attrs for definido como a string "common", a macro vai herdar definições de atributo de regra comuns usadas por todas as regras do Starlark.

Se o valor de retorno de rule() ou macro() não foi atribuído a uma variável global em um arquivo .bzl, esse valor não foi registrado como uma regra ou um símbolo de macro e, portanto, não pode ser usado para inherit_attrs.

O mecanismo de herança funciona da seguinte maneira:

  1. Os atributos especiais name e visibility nunca são herdados.
  2. Atributos ocultos (aqueles com nomes que começam com "_") nunca são herdados.
  3. Atributos com nomes já definidos no dicionário attrs nunca são herdados. A entrada em attrs tem precedência. Uma entrada pode ser definida como None para garantir que nenhum atributo com esse nome seja definido na macro.
  4. Todos os outros atributos são herdados da regra ou da macro e são efetivamente mesclados no dict attrs.

Quando um atributo não obrigatório é herdado, o valor padrão dele é substituído por None, independentemente do que foi especificado na regra ou macro original. Isso garante que, quando a macro encaminhar o valor do atributo para uma instância da regra ou macro encapsulada, como ao transmitir o **kwargs não modificado, um valor que estava ausente da chamada da macro externa também estará ausente na chamada da regra ou macro interna, já que transmitir None para um atributo é tratado da mesma forma que omitir o atributo. Isso é importante porque omitir um atributo tem uma semântica sutilmente diferente de transmitir o valor padrão aparente. Em particular, os atributos omitidos não são mostrados em alguns formatos de saída bazel query, e os padrões computados só são executados quando o valor é omitido. Se a macro precisar examinar ou modificar um atributo herdado, por exemplo, para adicionar um valor a um atributo tags herdado, é necessário processar o caso None na função de implementação da macro.

Por exemplo, a macro a seguir herda todos os atributos de native.cc_library, exceto cxxopts (que é removido da lista de atributos) e copts, que recebe uma nova definição. Ele também verifica o valor None padrão do atributo tags herdado antes de anexar outra tag.

def _my_cc_library_impl(name, visibility, tags, **kwargs):
    # Append a tag; tags attr was inherited from native.cc_library, and
    # therefore is None unless explicitly set by the caller of my_cc_library()
    my_tags = (tags or []) + ["my_custom_tag"]
    native.cc_library(
        name = name,
        visibility = visibility,
        tags = my_tags,
        **kwargs
    )

my_cc_library = macro(
    implementation = _my_cc_library_impl,
    inherit_attrs = native.cc_library,
    attrs = {
        "cxxopts": None,
        "copts": attr.string_list(default = ["-D_FOO"]),
    },
)

Se inherit_attrs estiver definido, a função de implementação da macro precisa ter um parâmetro de palavra-chave residual **kwargs.

Por convenção, uma macro precisa transmitir os atributos herdados e não substituídos inalterados para a regra "principal" ou o símbolo de macro que a macro está envolvendo. Normalmente, a maioria dos atributos herdados não tem um parâmetro na lista de parâmetros da função de implementação e é simplesmente transmitida por **kwargs. Pode ser conveniente para a função de implementação ter parâmetros explícitos para alguns atributos herdados (mais comumente, tags e testonly) se a macro precisar transmitir esses atributos para destinos "principais" e não "principais", mas se a macro também precisar examinar ou manipular esses atributos, você precisará processar o valor padrão None de atributos herdados não obrigatórios.

finalizer bool; o padrão é False
Indica se essa macro é um finalizador de regras, que é uma macro que, independente da posição em um arquivo BUILD, é avaliada no final do carregamento do pacote, depois que todas as metas não finais foram definidas.

Ao contrário das macros simbólicas comuns, os finalizadores de regras podem chamar native.existing_rule() e native.existing_rules() para consultar o conjunto de alvos de regras não finalizadores definidos no pacote atual. native.existing_rule() e native.existing_rules() não podem acessar os destinos definidos por qualquer finalizador de regra, incluindo este.

doc string ou None; O padrão é None
Uma descrição da macro que pode ser extraída por ferramentas de geração de documentação.

module_extension

unknown module_extension(implementation, *, tag_classes={}, doc=None, environ=[], os_dependent=False, arch_dependent=False)

Cria uma nova extensão de módulo. Armazene-o em um valor global para que ele possa ser exportado e usado em um arquivo MODULE.bazel com use_extension.

Parâmetros

Parâmetro Descrição
implementation callable; required
A função que implementa essa extensão de módulo. Precisa usar um único parâmetro, module_ctx. A função é chamada uma vez no início de um build para determinar o conjunto de repositórios disponíveis.
tag_classes dict; o padrão é {}
Um dicionário para declarar todas as classes de tags usadas pela extensão. Ele mapeia o nome da classe de tag para um objeto tag_class.
doc string ou None; o padrão é None
Uma descrição da extensão do módulo que pode ser extraída por ferramentas de geração de documentação.
environ Sequência de strings. O padrão é []
Fornece uma lista de variáveis de ambiente das quais a extensão do módulo depende. Se uma variável de ambiente nessa lista mudar, a extensão será reavaliada.
os_dependent bool; O padrão é False
Indica se a extensão depende do SO ou não
arch_dependent bool; o padrão é False
Indica se a extensão depende da arquitetura ou não

provider

unknown provider(doc=None, *, fields=None, init=None)

Define um símbolo de provedor. O valor resultante dessa função precisa ser armazenado em um valor global para ser usado em uma implementação de regra ou aspecto. Os provedores podem ser instanciados chamando o valor resultante como uma função ou usados diretamente como uma chave de índice para recuperar uma instância desse provedor de um destino. Exemplo:
MyInfo = provider()
...
def _my_library_impl(ctx):
    ...
    my_info = MyInfo(x = 2, y = 3)
    # my_info.x == 2
    # my_info.y == 3
    ...

Consulte Regras (provedores) para conferir um guia completo sobre como usar provedores.

Retorna um valor Provider que pode ser chamado se init não for especificado.

Se init for especificado, retornará uma tupla de dois elementos: um valor acionável Provider e um valor acionável construtor bruto. Consulte Regras (inicialização personalizada de provedores personalizados) e a discussão sobre o parâmetro init abaixo para saber mais.

Parâmetros

Parâmetro Descrição
doc string ou None; o padrão é None
Uma descrição do provedor que pode ser extraída por ferramentas de geração de documentação.
fields Sequência de strings ou dicionário ou None. O padrão é None
. Se especificado, restringe o conjunto de campos permitidos.
Os valores possíveis são:
  • lista de campos:
    provider(fields = ['a', 'b'])

  • dictionary field name -> documentation:
    provider(
           fields = { 'a' : 'Documentation for a', 'b' : 'Documentation for b' })
Todos os campos são opcionais.
init callable; ou None; O padrão é None
Um callback opcional para pré-processar e validar os valores de campo do provedor durante a instanciação. Se init for especificado, provider() vai retornar uma tupla de dois elementos: o símbolo de provedor normal e um construtor bruto.

Confira uma descrição precisa a seguir. Consulte Regras (inicialização personalizada de provedores) para uma discussão intuitiva e casos de uso.

Deixe P ser o símbolo do provedor criado chamando provider(). Conceitualmente, uma instância de P é gerada chamando uma função de construtor padrão c(*args, **kwargs), que faz o seguinte:

  • Se args não estiver vazio, ocorrerá um erro.
  • Se o parâmetro fields foi especificado quando provider() foi chamado e se kwargs contém uma chave que não estava listada em fields, ocorre um erro.
  • Caso contrário, c retorna uma nova instância que tem, para cada entrada k: v em kwargs, um campo chamado k com o valor v.
No caso em que um callback init não é fornecido, uma chamada para o símbolo P atua como uma chamada para a função de construtor padrão c. Em outras palavras, P(*args, **kwargs) retorna c(*args, **kwargs). Por exemplo,
MyInfo = provider()
m = MyInfo(foo = 1)
vai fazer com que m seja uma instância MyInfo com m.foo == 1.

No entanto, se init for especificado, a chamada P(*args, **kwargs) vai executar as seguintes etapas:

  1. O callback é invocado como init(*args, **kwargs), ou seja, com os mesmos argumentos posicionais e de palavra-chave que foram transmitidos para P.
  2. O valor de retorno de init precisa ser um dicionário, d, com chaves que são strings de nome de campo. Caso contrário, um erro vai ocorrer.
  3. Uma nova instância de P é gerada como se fosse chamando o construtor padrão com as entradas de d como argumentos de palavra-chave, como em c(**d).

Observação: as etapas acima implicam que um erro ocorre se *args ou **kwargs não corresponder à assinatura de init ou se a avaliação do corpo de init falhar (talvez intencionalmente por uma chamada para fail()) ou se o valor de retorno de init não for um dicionário com o esquema esperado.

Dessa forma, o callback init generaliza a construção normal do provedor, permitindo argumentos posicionais e lógica arbitrária para pré-processamento e validação. Não é possível contornar a lista de fields permitidos.

Quando init é especificado, o valor de retorno de provider() se torna uma tupla (P, r), em que r é o construtor bruto. Na verdade, o comportamento de r é exatamente o da função de construtor padrão c discutida acima. Normalmente, r é vinculado a uma variável cujo nome é prefixado com um sublinhado, para que apenas o arquivo .bzl atual tenha acesso direto a ele:

MyInfo, _new_myinfo = provider(init = ...)

repository_rule

callable repository_rule(implementation, *, attrs=None, local=False, environ=[], configure=False, remotable=False, doc=None)

Cria uma nova regra de repositório. Armazene-o em um valor global para que ele possa ser carregado e chamado de uma função de implementação module_extension() ou usado por use_repo_rule().

Parâmetros

Parâmetro Descrição
implementation callable; required
a função que implementa essa regra. Precisa ter um único parâmetro, repository_ctx. A função é chamada durante a fase de carregamento para cada instância da regra.
attrs dict ou None; o padrão é None
Um dicionário para declarar todos os atributos da regra do repositório. Ele mapeia um nome de atributo para um objeto de atributo (consulte o módulo attr). Os atributos que começam com _ são particulares e podem ser usados para adicionar uma dependência implícita de um rótulo a um arquivo. Uma regra de repositório não pode depender de um artefato gerado. O atributo name é adicionado implicitamente e não precisa ser especificado.

Os atributos declarados vão converter None no valor padrão.

local bool; o padrão é False
Indica que essa regra busca tudo do sistema local e precisa ser reavaliada em cada busca.
environ Sequência de strings. O padrão é []
. Descontinuado. Este parâmetro foi suspenso. Migre para repository_ctx.getenv.
Fornece uma lista de variáveis de ambiente das quais essa regra de repositório depende. Se uma variável de ambiente nessa lista mudar, o repositório será buscado novamente.
configure bool; o padrão é False
Indica que o repositório inspeciona o sistema para fins de configuração
remotable bool; o padrão é False
Experimental. Esse parâmetro é experimental e pode mudar a qualquer momento. Não dependa dele. Ele pode ser ativado de forma experimental definindo --experimental_repo_remote_exec
Compatível com execução remota
doc string ou None; O padrão é None
. Uma descrição da regra do repositório que pode ser extraída por ferramentas de geração de documentação.

regra

callable rule(implementation, *, test=unbound, attrs={}, outputs=None, executable=unbound, output_to_genfiles=False, fragments=[], host_fragments=[], _skylark_testable=False, toolchains=[], incompatible_use_toolchain_transition=False, doc=None, provides=[], dependency_resolution_rule=False, exec_compatible_with=[], analysis_test=False, build_setting=None, cfg=None, exec_groups=None, initializer=None, parent=None, extendable=None, subrules=[])

Cria uma nova regra, que pode ser chamada em um arquivo BUILD ou uma macro para criar destinos.

As regras precisam ser atribuídas a variáveis globais em um arquivo .bzl. O nome da variável global é o nome da regra.

As regras de teste precisam ter um nome que termine em _test, enquanto todas as outras regras não podem ter esse sufixo. Essa restrição se aplica apenas às regras, não aos alvos delas.

Parâmetros

Parâmetro Descrição
implementation function; required
a função Starlark que implementa essa regra precisa ter exatamente um parâmetro: ctx. A função é chamada durante a fase de análise para cada instância da regra. Ele pode acessar os atributos fornecidos pelo usuário. Ele precisa criar ações para gerar todas as saídas declaradas.
test bool; O padrão é unbound
Indica se essa regra é de teste, ou seja, se ela pode ser o assunto de um comando blaze test. Todas as regras de teste são consideradas executáveis automaticamente. Não é necessário (e não é recomendado) definir executable = True explicitamente para uma regra de teste. O padrão é False. Consulte a página de regras para mais informações.
attrs dict: o padrão é {}
. Um dicionário para declarar todos os atributos da regra. Ele mapeia um nome de atributo para um objeto de atributo (consulte o módulo attr). Os atributos que começam com _ são privados e podem ser usados para adicionar uma dependência implícita a um rótulo. O atributo name é adicionado implicitamente e não precisa ser especificado. Os atributos visibility, deprecation, tags, testonly e features são adicionados implicitamente e não podem ser substituídos. A maioria das regras precisa apenas de alguns atributos. Para limitar o uso de memória, há um limite no número de atributos que podem ser declarados.

Os atributos declarados vão converter None no valor padrão.

outputs dict; ou None; ou function; o padrão é None
Descontinuado. Este parâmetro foi descontinuado e será removido em breve. Não dependa dele. Ele está desativado com --incompatible_no_rule_outputs_param. Use essa flag para verificar se o código é compatível com a remoção iminente.
Este parâmetro foi descontinuado. Migrar regras para usar OutputGroupInfo ou attr.output.

Um esquema para definir saídas predeclaradas. Ao contrário dos atributos output e output_list, o usuário não especifica os rótulos desses arquivos. Consulte a página de regras para saber mais sobre saídas predeclaradas.

O valor desse argumento é um dicionário ou uma função de callback que produz um dicionário. O callback funciona de forma semelhante aos atributos de dependência computados: os nomes de parâmetro da função são comparados com os atributos da regra. Por exemplo, se você transmitir outputs = _my_func com a definição def _my_func(srcs, deps): ..., a função terá acesso aos atributos srcs e deps. O dicionário é interpretado da seguinte forma, seja especificado diretamente ou por uma função.

Cada entrada no dicionário cria uma saída predeclarada em que a chave é um identificador e o valor é um modelo de string que determina o rótulo da saída. Na função de implementação da regra, o identificador se torna o nome do campo usado para acessar o File da saída em ctx.outputs. O rótulo da saída tem o mesmo pacote da regra, e a parte após o pacote é produzida substituindo cada marcador de posição do formulário "%{ATTR}" por uma string formada a partir do valor do atributo ATTR:

  • Os atributos do tipo string são substituídos literalmente.
  • Os atributos do tipo rótulo se tornam parte do rótulo após o pacote, menos a extensão do arquivo. Por exemplo, o rótulo "//pkg:a/b.c" se torna "a/b".
  • Os atributos do tipo de saída se tornam parte do rótulo após o pacote, incluindo a extensão do arquivo ("a/b.c" no exemplo acima).
  • Todos os atributos do tipo lista (por exemplo, attr.label_list) usados em marcadores de posição precisam ter exatamente um elemento. A conversão é igual à versão sem lista (attr.label).
  • Outros tipos de atributos podem não aparecer nos marcadores de posição.
  • Os marcadores de posição especiais sem atributo %{dirname} e %{basename} são expandidos para as partes do rótulo da regra, excluindo o pacote. Por exemplo, em "//pkg:a/b.c", o dirname é a e o basename é b.c.

Na prática, o marcador de posição de substituição mais comum é "%{name}". Por exemplo, para um destino chamado "foo", o dicionário de saídas {"bin": "%{name}.exe"} predefine uma saída chamada foo.exe, que pode ser acessada na função de implementação como ctx.outputs.bin.

executable bool; o padrão é unbound
Indica se essa regra é considerada executável, ou seja, se ela pode ser o assunto de um comando blaze run. O padrão é False. Consulte a página de regras para mais informações.
output_to_genfiles bool; o padrão é False
Se verdadeiro, os arquivos serão gerados no diretório genfiles em vez do diretório bin. Não defina essa flag, a menos que você precise dela para compatibilidade com regras atuais (por exemplo, ao gerar arquivos de cabeçalho para C++).
fragments Sequência de strings. O padrão é []
. Lista de nomes de fragmentos de configuração que a regra exige na configuração de destino.
host_fragments Sequência de strings. O padrão é []
. Lista de nomes de fragmentos de configuração necessários para a regra na configuração do host.
_skylark_testable bool; o padrão é False
(Experimental)

Se verdadeiro, essa regra vai expor as ações para inspeção por regras que dependem dela por um provedor Actions. O provedor também está disponível para a regra chamando ctx.created_actions().

Ele só deve ser usado para testar o comportamento no momento da análise das regras do Starlark. Essa flag pode ser removida no futuro.
toolchains sequência: o padrão é []
. Se definido, o conjunto de toolchains necessário para essa regra. A lista pode conter objetos String, Label ou StarlarkToolchainTypeApi, em qualquer combinação. As cadeias de ferramentas serão encontradas verificando a plataforma atual e fornecidas à implementação da regra por meio de ctx.toolchain.
incompatible_use_toolchain_transition bool; o padrão é False
Descontinuado, não está mais em uso e precisa ser removido.
doc string ou None. O padrão é None
. Uma descrição da regra que pode ser extraída por ferramentas de geração de documentação.
provides sequence: o padrão é []
. Uma lista de provedores que a função de implementação precisa retornar.

É um erro se a função de implementação omitir qualquer um dos tipos de provedor listados aqui do valor de retorno. No entanto, a função de implementação pode retornar outros provedores não listados aqui.

Cada elemento da lista é um objeto *Info retornado por provider(), exceto que um provedor legado é representado pelo nome da string.Quando um destino da regra é usado como uma dependência para um destino que declara um provedor obrigatório, não é necessário especificar esse provedor aqui. Basta que a função de implementação o retorne. No entanto, é considerada uma prática recomendada especificar o valor, mesmo que isso não seja obrigatório. No entanto, o campo required_providers de um aspecto exige que os provedores sejam especificados aqui.

dependency_resolution_rule bool; o padrão é False
Se definido, a regra pode ser uma dependência por atributos também marcados como disponíveis em materializadores. Todos os atributos de regras com essa flag definida também precisam ser marcados como disponíveis nos materializadores. Isso serve para que as regras marcadas não dependam de regras não marcadas.
exec_compatible_with Sequência de strings. O padrão é []
. Uma lista de restrições na plataforma de execução que se aplicam a todos os destinos desse tipo de regra.
analysis_test bool; o padrão é False
Se verdadeiro, essa regra é tratada como um teste de análise.

Observação: as regras de teste de análise são definidas principalmente usando a infraestrutura fornecida nas bibliotecas principais do Starlark. Consulte Testes para ver orientações.

Se uma regra for definida como uma regra de teste de análise, ela poderá usar transições de configuração definidas usando analysis_test_transition nos atributos, mas vai aceitar algumas restrições:

  • As metas dessa regra são limitadas no número de dependências transitivas que podem ter.
  • A regra é considerada uma regra de teste (como se test=True estivesse definido). Isso substitui o valor de test.
  • A função de implementação de regras pode não registrar ações. Em vez disso, é necessário registrar um resultado de aprovação/reprovação fornecendo AnalysisTestResultInfo.
build_setting BuildSetting ou None. O padrão é None
. Se definido, descreve o tipo de build setting desta regra. Consulte o módulo config. Se esse valor for definido, um atributo obrigatório chamado "build_setting_default" será adicionado automaticamente a essa regra, com um tipo correspondente ao valor transmitido.
cfg O padrão é None
Se definido, aponta para a transição de configuração que a regra vai aplicar à própria configuração antes da análise.
exec_groups dict ou None; o padrão é None
Dict do nome do grupo de execução (string) para exec_groups. Se definido, permite que as regras executem ações em várias plataformas de execução em um único destino. Consulte a documentação sobre grupos de execução para mais informações.
initializer padrão é None
Experimental: a função Stalark inicializa os atributos da regra.

A função é chamada no momento do carregamento para cada instância da regra. Ele é chamado com name e os valores dos atributos públicos definidos pela regra (não com atributos genéricos, por exemplo, tags).

Ele precisa retornar um dicionário dos nomes dos atributos para os valores desejados. Os atributos que não são retornados não são afetados. O retorno de None como valor resulta no uso do valor padrão especificado na definição do atributo.

Os inicializadores são avaliados antes dos valores padrão especificados em uma definição de atributo. Consequentemente, se um parâmetro na assinatura do inicializador contiver valores padrão, ele vai substituir o padrão da definição do atributo (exceto se retornar None).

Da mesma forma, se um parâmetro na assinatura do inicializador não tiver um padrão, ele se tornará obrigatório. Nesses casos, é recomendável omitir as configurações padrão/obrigatórias de uma definição de atributo.

É recomendável usar **kwargs para atributos que não são processados.

No caso de regras estendidas, todos os inicializadores são chamados de filhos para ancestrais. Cada inicializador recebe apenas os atributos públicos que ele conhece.

parent O padrão é None
Experimental: a regra Stalark que é estendida. Quando definido, os atributos públicos são mesclados, assim como os provedores anunciados. A regra corresponde a executable e test da mãe. Os valores de fragments, toolchains, exec_compatible_with e exec_groups são mesclados. Parâmetros legados ou descontinuados podem não ser definidos. A transição de configuração de entrada cfg do pai é aplicada após a configuração de entrada da regra.
extendable bool; ou Label; ou string; ou None; O padrão é None
Experimental: um rótulo de uma lista de permissões que define quais regras podem estender essa regra. Ele também pode ser definido como verdadeiro/falso para permitir/proibir sempre a extensão. O Bazel sempre permite extensões.
subrules Sequência de subregras; o padrão é []
Experimental: lista de subregras usadas por esta regra.

select

unknown select(x, no_match_error='')

select() é a função auxiliar que torna um atributo de regra configurável. Consulte a enciclopédia de builds para mais detalhes.

Parâmetros

Parâmetro Descrição
x dict: obrigatório
Um dicionário que mapeia condições de configuração para valores. Cada chave é um rótulo ou uma string de rótulo que identifica uma instância de config_setting ou constraint_value. Consulte a documentação sobre macros para saber quando usar um rótulo em vez de uma string.
no_match_error string; o padrão é ''
Erro personalizado opcional para informar se nenhuma condição corresponder.

subregra

Subrule subrule(implementation, attrs={}, toolchains=[], fragments=[], subrules=[])

Cria uma nova instância de uma subregra. O resultado dessa função precisa ser armazenado em uma variável global antes de ser usado.

Parâmetros

Parâmetro Descrição
implementation function; required
A função Starlark que implementa essa subregrinha
attrs dict: o padrão é {}
. Um dicionário para declarar todos os atributos (privados) da subregra.

As subregras só podem ter atributos particulares do tipo rótulo (ou seja, rótulo ou lista de rótulos). Os valores resolvidos correspondentes a esses rótulos são transmitidos automaticamente pelo Bazel para a função de implementação da subregrinha como argumentos nomeados. Portanto, a função de implementação é necessária para aceitar parâmetros nomeados que correspondem aos nomes dos atributos. Os tipos desses valores serão:

  • FilesToRunProvider para atributos de rótulo com executable=True
  • File para atributos de rótulo com allow_single_file=True
  • Target para todos os outros atributos de rótulo
  • [Target] para todos os atributos de lista de rótulos
toolchains sequência: o padrão é []
. Se definido, o conjunto de toolchains necessário para essa subregra. A lista pode conter objetos String, Label ou StarlarkToolchainTypeApi, em qualquer combinação. As cadeias de ferramentas serão encontradas verificando a plataforma atual e fornecidas à implementação da subregra por meio de ctx.toolchains. As AEGs precisam ser ativadas nas regras de consumo se esse parâmetro estiver definido. Caso você ainda não tenha migrado para os AEGs, consulte https://bazel.build/extending/auto-exec-groups#migration-aegs.
fragments Sequência de strings. O padrão é []
. Lista de nomes de fragmentos de configuração que a subregra requer na configuração de destino.
subrules Sequência de subregras: o padrão é []
Lista de outras subregras necessárias para essa subregra.

tag_class

tag_class tag_class(attrs={}, *, doc=None)

Cria um novo objeto tag_class, que define um esquema de atributo para uma classe de tags, que são objetos de dados que podem ser usados por uma extensão de módulo.

Parâmetros

Parâmetro Descrição
attrs dict; o padrão é {}
Um dicionário para declarar todos os atributos dessa classe de tag. Ele mapeia um nome de atributo para um objeto de atributo (consulte o módulo attr).

Ao contrário de rule(), aspect() e repository_rule(), os atributos declarados não convertem None no valor padrão. Para que o padrão seja usado, o atributo precisa ser omitido totalmente pelo autor da chamada.

doc string ou None; o padrão é None
Uma descrição da classe de tags que pode ser extraída por ferramentas de geração de documentação.

visibilidade

None visibility(value)

Define a visibilidade de carregamento do módulo .bzl que está sendo inicializado.

A visibilidade de carregamento de um módulo determina se outros arquivos BUILD e .bzl podem carregá-lo ou não. Isso é diferente da visibilidade de destino do arquivo de origem .bzl, que determina se o arquivo pode aparecer como uma dependência de outros destinos. A visibilidade de carregamento funciona no nível dos pacotes: para carregar um módulo, o arquivo que faz o carregamento precisa estar em um pacote que tenha recebido visibilidade para o módulo. Um módulo sempre pode ser carregado no próprio pacote, independentemente da visibilidade.

visibility() só pode ser chamado uma vez por arquivo .bzl e apenas no nível superior, não dentro de uma função. O estilo preferido é colocar essa chamada logo abaixo das instruções load() e de qualquer lógica breve necessária para determinar o argumento.

Se a flag --check_bzl_visibility estiver definida como falsa, as violações de visibilidade de carregamento vão emitir avisos, mas não vão falhar no build.

Parâmetros

Parâmetro Descrição
value required
Uma lista de strings de especificação de pacote ou uma única string de especificação de pacote.

As especificações de pacote seguem o mesmo formato de package_group, exceto que especificações de pacote negativas não são permitidas. Ou seja, uma especificação pode ter as seguintes formas:

  • "//foo": o pacote //foo
  • "//foo/...": o pacote //foo e todos os subpacotes dele.
  • "public" ou "private": todos os pacotes ou nenhum, respectivamente

A sintaxe "@" não é permitida. Todas as especificações são interpretadas em relação ao repositório do módulo atual.

Se value for uma lista de strings, o conjunto de pacotes que receberão visibilidade para esse módulo será a união dos pacotes representados por cada especificação. Uma lista vazia tem o mesmo efeito que private. Se value for uma única string, ela será tratada como a lista singleton [value].

As flags --incompatible_package_group_has_public_syntax e --incompatible_fix_package_group_reporoot_syntax não têm efeito nesse argumento. Os valores "public" e "private" estão sempre disponíveis, e "//..." é sempre interpretado como "todos os pacotes no repositório atual".