Regras gerais

Informar um problema Ver fonte Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Regras

alias

Ver origem da regra
alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

A regra alias cria outro nome para se referir a uma regra.

A criação de alias funciona apenas para destinos "regulares". Em especial, package_group e test_suite não podem ter alias.

O uso de alias pode ser útil em repositórios grandes, em que renomear um destino exigiria fazer mudanças em muitos arquivos. Você também pode usar a regra de alias para armazenar uma chamada de função select se quiser reutilizar essa lógica para vários destinos.

A regra de alias tem a própria declaração de visibilidade. Em todos os outros aspectos, ele se comporta como a regra a que se refere (por exemplo, testonly no alias é ignorado; o testonly da regra referenciada é usado em vez disso) com algumas pequenas exceções:

  • Os testes não são executados se o alias deles for mencionado na linha de comando. Para definir um alias que execute o teste referenciado, use uma regra test_suite com um único destino no atributo tests dela.
  • Ao definir grupos de ambiente, os aliases para regras environment não são compatíveis. Elas também não são compatíveis com a opção de linha de comando --target_environment.

Exemplos

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.

actual

Rótulo; obrigatório

O destino a que este alias se refere. Não precisa ser uma regra, também pode ser um arquivo de entrada.

config_setting

Ver origem da regra
config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

Corresponde a um estado de configuração esperado (expresso como flags de build ou restrições de plataforma) para acionar atributos configuráveis. Consulte select para saber como usar essa regra e Atributos configuráveis para uma visão geral do recurso geral.

Exemplos

O seguinte corresponde a qualquer build que defina --compilation_mode=opt ou -c opt (explicitamente na linha de comando ou implicitamente nos arquivos .bazelrc):

  config_setting(
      name = "simple",
      values = {"compilation_mode": "opt"}
  )
  

O exemplo a seguir corresponde a qualquer build que tenha como destino o ARM e aplica a definição personalizada FOO=bar (por exemplo, bazel build --cpu=arm --define FOO=bar ...):

  config_setting(
      name = "two_conditions",
      values = {
          "cpu": "arm",
          "define": "FOO=bar"
      }
  )
  

O seguinte corresponde a qualquer build que defina a flag definida pelo usuário --//custom_flags:foo=1 (explicitamente na linha de comando ou implicitamente nos arquivos .bazelrc):

  config_setting(
      name = "my_custom_flag_is_set",
      flag_values = { "//custom_flags:foo": "1" },
  )
  

O exemplo a seguir corresponde a qualquer build que tenha como destino uma plataforma com arquitetura x86_64 e glibc versão 2.25, supondo a existência de um constraint_value com o rótulo //example:glibc_2_25. Uma plataforma ainda vai corresponder se definir outros valores de restrição além desses dois.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
Em todos esses casos, é possível que a configuração mude no build. Por exemplo, se um destino precisar ser criado para uma plataforma diferente da sua dependência. Isso significa que, mesmo quando um config_setting não corresponde às flags de linha de comando de nível superior, ele ainda pode corresponder a alguns destinos de build.

Observações

  • Consulte select para saber o que acontece quando vários config_settings correspondem ao estado de configuração atual.
  • Para flags que aceitam formas abreviadas (por exemplo, --compilation_mode x -c), as definições de values precisam usar a forma completa. Elas correspondem automaticamente a invocações usando qualquer um dos formatos.
  • Se uma flag aceitar vários valores (como --copt=-Da --copt=-Db ou uma flag do Starlark do tipo lista), values = { "flag": "a" } vai corresponder se "a" estiver presente em qualquer lugar na lista real.

    values = { "myflag": "a,b" } funciona da mesma forma: isso corresponde a --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b e --myflag=c,b,a. A semântica exata varia entre as flags. Por exemplo, --copt não aceita vários valores na mesma instância: --copt=a,b produz ["a,b"], enquanto --copt=a --copt=b produz ["a", "b"]. Portanto, values = { "copt": "a,b" } corresponde ao primeiro, mas não ao segundo. Mas --ios_multi_cpus (para regras da Apple) faz: -ios_multi_cpus=a,b e ios_multi_cpus=a --ios_multi_cpus=b produzem ["a", "b"]. Verifique as definições de flag e teste suas condições com cuidado para verificar as expectativas exatas.

  • Se você precisar definir condições que não são modeladas por flags de build integradas, use flags definidas pelo Starlark. Também é possível usar --define, mas isso oferece suporte mais fraco e não é recomendado. Consulte este link para mais informações.
  • Evite repetir definições idênticas de config_setting em pacotes diferentes. Em vez disso, faça referência a um config_setting comum definido em um pacote canônico.
  • values, define_values e constraint_values podem ser usados em qualquer combinação no mesmo config_setting, mas pelo menos um precisa ser definido para qualquer config_setting.

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.

constraint_values

Lista de marcadores; não configuráveis; o padrão é []

O conjunto mínimo de constraint_values que a plataforma de destino precisa especificar para corresponder a este config_setting. A plataforma de execução não é considerada aqui. Todos os valores de restrição adicionais que a plataforma tiver serão ignorados. Consulte Atributos de build configuráveis para mais detalhes.

No caso em que dois config_settings correspondem ao mesmo select, esse atributo não é considerado para determinar se um dos config_settings é uma especialização do outro. Em outras palavras, um config_setting não pode corresponder a uma plataforma mais do que a outra.

define_values

Dicionário: String -> String; não configurável; o padrão é {}

Igual a values, mas especificamente para a flag --define.

--define é especial porque a sintaxe dele (--define KEY=VAL) significa que KEY=VAL é um valor da perspectiva de uma flag do Bazel.

Isso significa:

            config_setting(
                name = "a_and_b",
                values = {
                    "define": "a=1",
                    "define": "b=2",
                })
          

não funciona porque a mesma chave (define) aparece duas vezes no dicionário. Esse atributo resolve o problema:

            config_setting(
                name = "a_and_b",
                define_values = {
                    "a": "1",
                    "b": "2",
                })
          

corresponde corretamente a bazel build //foo --define a=1 --define b=2.

--define ainda pode aparecer em values com a sintaxe normal de flags e pode ser misturado livremente com esse atributo, desde que as chaves do dicionário permaneçam distintas.

flag_values

Dicionário: label -> String; nonconfigurable; o padrão é {}

O mesmo que values, mas para flags de build definidos pelo usuário.

Esse é um atributo distinto porque as flags definidas pelo usuário são referenciadas como rótulos, enquanto as flags integradas são referenciadas como strings arbitrárias.

values

Dicionário: String -> String; não configurável; o padrão é {}

O conjunto de valores de configuração que correspondem a essa regra (expressos como flags de build).

Essa regra herda a configuração do destino configurado que a referencia em uma instrução select. Uma invocação do Bazel é considerada uma "correspondência" se, para cada entrada no dicionário, a configuração dela corresponder ao valor esperado da entrada. Por exemplo, values = {"compilation_mode": "opt"} corresponde às invocações bazel build --compilation_mode=opt ... e bazel build -c opt ... em regras configuradas para destino.

Para facilitar, os valores de configuração são especificados como flags de build (sem o "--" anterior), mas lembre-se de que os dois não são iguais. Isso acontece porque os destinos podem ser criados em várias configurações no mesmo build. Por exemplo, o "cpu" de uma configuração de execução corresponde ao valor de --host_cpu, não --cpu. Assim, diferentes instâncias do mesmo config_setting podem corresponder à mesma invocação de maneira diferente, dependendo da configuração da regra que as usa.

Se uma flag não for definida explicitamente na linha de comando, o valor padrão dela será usado. Se uma chave aparecer várias vezes no dicionário, apenas a última instância será usada. Se uma chave fizer referência a uma flag que pode ser definida várias vezes na linha de comando (por exemplo, bazel build --copt=foo --copt=bar --copt=baz ...), uma correspondência vai ocorrer se qualquer uma dessas configurações for igual.

filegroup

Ver origem da regra
filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

Use filegroup para dar um nome conveniente a uma coleção de destinos. que podem ser referenciadas em outras regras.

Recomendamos usar filegroup em vez de referenciar diretórios diretamente. O último não é confiável porque o sistema de build não tem conhecimento completo de todos os arquivos abaixo do diretório. Portanto, ele pode não fazer rebuild quando esses arquivos mudam. Quando combinado com glob, filegroup pode garantir que todos os arquivos sejam explicitamente conhecidos pelo sistema de build.

Exemplos

Para criar um filegroup com dois arquivos de origem, faça o seguinte:

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)

Ou use um glob para rastrear um diretório testdata:

filegroup(
    name = "exported_testdata",
    srcs = glob([
        "testdata/*.dat",
        "testdata/logs/**/*.log",
    ]),
)

Para usar essas definições, faça referência ao filegroup com um rótulo de qualquer regra:

cc_library(
    name = "my_library",
    srcs = ["foo.cc"],
    data = [
        "//my_package:exported_testdata",
        "//my_package:mygroup",
    ],
)

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.

srcs

Lista de rótulos. O padrão é [].

A lista de destinos que são membros do grupo de arquivos.

É comum usar o resultado de uma expressão glob para o valor do atributo srcs.

data

Lista de rótulos. O padrão é [].

A lista de arquivos necessários para essa regra no tempo de execução.

Os destinos nomeados no atributo data serão adicionados ao runfiles desta regra filegroup. Quando o filegroup é referenciado no atributo data de outra regra, o runfiles dele é adicionado ao runfiles da regra dependente. Consulte a seção dependências de dados e a documentação geral de data para mais informações sobre como depender e usar arquivos de dados.

output_group

String; o padrão é ""

O grupo de saída de onde coletar artefatos de fontes. Se esse atributo for especificado, os artefatos do grupo de saída especificado das dependências serão exportados em vez do grupo de saída padrão.

Um "grupo de saída" é uma categoria de artefatos de saída de um destino, especificada na implementação dessa regra.

genquery

Ver origem da regra
genquery(name, deps, data, compatible_with, compressed_output, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

O genquery() executa uma consulta especificada na linguagem de consulta do Blaze e despeja o resultado em um arquivo.

Para manter a consistência do build, a consulta só pode visitar o fechamento transitivo das metas especificadas no atributo scope. As consultas que violarem essa regra vão falhar durante a execução se strict não for especificado ou for verdadeiro. Se strict for falso, os destinos fora do escopo serão ignorados com um aviso. A maneira mais fácil de evitar isso é mencionar os mesmos rótulos no escopo e na expressão de consulta.

A única diferença entre as consultas permitidas aqui e na linha de comando é que as consultas que contêm especificações de destino com caracteres curinga (por exemplo, //pkg:* ou //pkg:all) não são permitidas aqui. Os motivos são dois: primeiro, porque genquery precisa especificar um escopo para evitar que destinos fora do fechamento transitivo da consulta influenciem a saída. Segundo, porque os arquivos BUILD não são compatíveis com dependências curinga (por exemplo, deps=["//a/..."] não é permitido).

A saída do genquery é ordenada lexicograficamente para impor uma saída determinística, com exceção de --output=graph|minrank|maxrank ou quando somepath é usado como a função de nível superior.

O nome do arquivo de saída é o nome da regra.

Exemplos

Este exemplo grava a lista de rótulos no fechamento transitivo do destino especificado em um arquivo.

genquery(
    name = "kiwi-deps",
    expression = "deps(//kiwi:kiwi_lib)",
    scope = ["//kiwi:kiwi_lib"],
)

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.

compressed_output

Booleano; o padrão é False

Se True, a saída da consulta será gravada no formato de arquivo GZIP. Essa configuração pode ser usada para evitar picos no uso de memória do Bazel quando a saída da consulta for grande. O Bazel já comprime internamente saídas de consultas maiores que 220 bytes, independente do valor dessa configuração. Portanto, definir como True pode não reduzir o heap retido. No entanto, ele permite que o Bazel pule a descompactação ao gravar o arquivo de saída, o que pode exigir muita memória.
expression

String; obrigatório

A consulta a ser executada. Ao contrário da linha de comando e de outros lugares nos arquivos BUILD, os rótulos aqui são resolvidos em relação ao diretório raiz do espaço de trabalho. Por exemplo, o rótulo :b neste atributo no arquivo a/BUILD vai se referir ao destino //:b.
opts

Lista de strings. O padrão é [].

As opções transmitidas ao mecanismo de consulta. Elas correspondem às opções de linha de comando que podem ser transmitidas para bazel query. Algumas opções de consulta não são permitidas aqui: --keep_going, --query_file, --universe_scope, --order_results e --order_output. As opções não especificadas aqui terão os valores padrão, assim como na linha de comando de bazel query.
scope

Lista de marcadores; obrigatório

O escopo da consulta. A consulta não pode tocar em destinos fora do fechamento transitivo desses destinos.
strict

Booleano; o padrão é True

Se for "true", os destinos cujas consultas escapam do fechamento transitivo dos escopos não serão criados. Se for "false", o Bazel vai imprimir um aviso e ignorar qualquer caminho de consulta que o tenha levado para fora do escopo, concluindo o restante da consulta.

genrule

Ver origem da regra
genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)

Um genrule gera um ou mais arquivos usando um comando Bash definido pelo usuário.

As genrules são regras de build genéricas que podem ser usadas se não houver uma regra específica para a tarefa. Por exemplo, é possível executar um comando de uma linha do Bash. No entanto, se você precisar compilar arquivos C++, siga as regras cc_* atuais, porque todo o trabalho pesado já foi feito para você.

A genrule exige um shell para interpretar o argumento de comando. Também é fácil referenciar programas arbitrários disponíveis no PATH, mas isso torna o comando não hermético e pode não ser reproduzível. Se você só precisar executar uma ferramenta, use run_binary em vez disso.

Não use uma genrule para executar testes. Há dispensas especiais para testes e resultados de testes, incluindo políticas de cache e variáveis de ambiente. Os testes geralmente precisam ser executados depois que o build é concluído e na arquitetura de destino, enquanto as genrules são executadas durante o build e na arquitetura de execução (os dois podem ser diferentes). Se você precisar de uma regra de teste de uso geral, use sh_test.

Considerações sobre compilação cruzada

Consulte o manual do usuário para mais informações sobre compilação cruzada.

Embora as genrules sejam executadas durante um build, as saídas delas são usadas com frequência após o build, para implantação ou teste. Considere o exemplo de compilação de código C para um microcontrolador: o compilador aceita arquivos de origem C e gera código que é executado em um microcontrolador. O código gerado não pode ser executado na CPU usada para criá-lo, mas o compilador C (se compilado da origem) precisa ser.

O sistema de build usa a configuração de execução para descrever as máquinas em que o build é executado e a configuração de destino para descrever as máquinas em que a saída do build deve ser executada. Ele oferece opções para configurar cada um deles e separa os arquivos correspondentes em diretórios diferentes para evitar conflitos.

Para genrules, o sistema de build garante que as dependências sejam criadas adequadamente: srcs são criados (se necessário) para a configuração de destino, tools são criados para a configuração de exec, e a saída é considerada para a configuração de destino. Ela também fornece variáveis "Make" que os comandos genrule podem transmitir às ferramentas correspondentes.

É intencional que a genrule não defina nenhum atributo deps: outras regras integradas usam metainformações dependentes de linguagem transmitidas entre as regras para determinar automaticamente como processar regras dependentes, mas esse nível de automação não é possível para genrules. As genrules funcionam puramente no nível de arquivo e runfiles.

Casos especiais

Compilação exec-exec: em alguns casos, o sistema de build precisa executar genrules para que a saída também possa ser executada durante o build. Por exemplo, se uma genrule criar um compilador personalizado que será usado por outra genrule, a primeira precisará produzir a saída para a configuração de execução, porque é lá que o compilador será executado na outra genrule. Nesse caso, o sistema de build faz a coisa certa automaticamente: ele cria o srcs e o outs da primeira genrule para a configuração de execução em vez da configuração de destino. Consulte o manual do usuário para mais informações.

Ferramentas do JDK e C++: para usar uma ferramenta do JDK ou do conjunto de compiladores C++, o sistema de build fornece um conjunto de variáveis para uso. Consulte a variável"Make" para mais detalhes.

Ambiente Genrule

O comando genrule é executado por um shell Bash configurado para falhar quando um comando ou um pipeline falha, usando set -e -o pipefail.

A ferramenta de build executa o comando Bash em um ambiente de processo higienizado que define apenas variáveis principais, como PATH, PWD, TMPDIR e algumas outras. Para garantir que os builds sejam reproduzíveis, a maioria das variáveis definidas no ambiente de shell do usuário não é transmitida para o comando da genrule. No entanto, o Bazel (mas não o Blaze) transmite o valor da variável de ambiente PATH do usuário. Qualquer mudança no valor de PATH fará com que o Bazel execute novamente o comando no próximo build.

Um comando genrule não pode acessar a rede, exceto para conectar processos que são filhos do próprio comando, embora isso não seja aplicado no momento.

O sistema de build exclui automaticamente todos os arquivos de saída existentes, mas cria os diretórios principais necessários antes de executar uma genrule. Ele também remove todos os arquivos de saída em caso de falha.

Recomendações gerais

  • Verifique se as ferramentas executadas por uma genrule são determinísticas e herméticas. Eles não devem gravar carimbos de data/hora na saída e precisam usar ordenação estável para conjuntos e mapas, além de gravar apenas caminhos de arquivo relativos na saída, não caminhos absolutos. Não seguir essa regra vai resultar em um comportamento inesperado de build (o Bazel não vai recompilar uma genrule que você achava que seria) e vai prejudicar o desempenho do cache.
  • Use $(location) extensivamente para saídas, ferramentas e fontes. Devido à segregação de arquivos de saída para diferentes configurações, as genrules não podem depender de caminhos absolutos e/ou codificados.
  • Escreva uma macro Starlark comum caso as mesmas genrules ou genrules muito semelhantes sejam usadas em vários lugares. Se a genrule for complexa, considere implementá-la em um script ou como uma regra do Starlark. Isso melhora a legibilidade e a capacidade de teste.
  • Verifique se o código de saída indica corretamente o sucesso ou a falha da genrule.
  • Não grave mensagens informativas em stdout ou stderr. Embora seja útil para depuração, isso pode facilmente se tornar ruído. Uma genrule bem-sucedida não deve gerar saída. Por outro lado, uma genrule com falha precisa emitir boas mensagens de erro.
  • $$ evaluates to a $, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such as ls $(dirname $x), one must escape it thus: ls $$(dirname $$x).
  • Evite criar links simbólicos e diretórios. O Bazel não copia a estrutura de diretório/symlink criada por genrules, e a verificação de dependência de diretórios não é confiável.
  • Ao referenciar a genrule em outras regras, você pode usar o rótulo da genrule ou os rótulos de arquivos de saída individuais. Às vezes, uma abordagem é mais legível, às vezes a outra: referenciar saídas por nome no srcs de uma regra de consumo evita capturar sem querer outras saídas da genrule, mas pode ser tedioso se a genrule produzir muitas saídas.

Exemplos

Este exemplo gera foo.h. Não há fontes porque o comando não recebe nenhuma entrada. O "binário" executado pelo comando é um script perl no mesmo pacote que a genrule.

genrule(
    name = "foo",
    srcs = [],
    outs = ["foo.h"],
    cmd = "./$(location create_foo.pl) > \"$@\"",
    tools = ["create_foo.pl"],
)

O exemplo a seguir mostra como usar um filegroup e as saídas de outro genrule. Usar $(SRCS) em vez de diretivas $(location) explícitas também funciona. Este exemplo usa o último para fins de demonstração.

genrule(
    name = "concat_all_files",
    srcs = [
        "//some:files",  # a filegroup with multiple files in it ==> $(locations)
        "//other:gen",   # a genrule with a single output ==> $(location)
    ],
    outs = ["concatenated.txt"],
    cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.


Você pode se referir a essa regra pelo nome na seção srcs ou deps de outras regras de BUILD. Se a regra gerar arquivos de origem, use o atributo srcs.
srcs

Lista de rótulos. O padrão é [].

Uma lista de entradas para essa regra, como arquivos de origem a serem processados.

Esse atributo não é adequado para listar ferramentas executadas pelo cmd. Use o atributo tools.

O sistema de build garante que esses pré-requisitos sejam criados antes de executar o comando genrule. Eles são criados usando a mesma configuração da solicitação de build original. Os nomes dos arquivos desses pré-requisitos estão disponíveis para o comando como uma lista separada por espaços em $(SRCS). Outra opção é usar o caminho de um destino srcs individual //x:y com $(location //x:y) ou $<, desde que seja a única entrada em srcs.

outs

Lista de nomes de arquivos; não configurável; obrigatório

Uma lista de arquivos gerados por essa regra.

Os arquivos de saída não podem cruzar os limites do pacote. Os nomes dos arquivos de saída são interpretados como relativos ao pacote.

Se a flag executable estiver definida, outs precisará conter exatamente um rótulo.

O comando genrule deve criar cada arquivo de saída em um local predeterminado. O local está disponível em cmd usando variáveis "Make" específicas de genrule ($@, $(OUTS), $(@D) ou $(RULEDIR)) ou usando a substituição $(location).

cmd

String; o padrão é ""

O comando a ser executado. Sujeito à substituição de $(location) e da variável"Make".
  1. Primeiro, a substituição de $(location) é aplicada, substituindo todas as ocorrências de $(location label) e de $(locations label) (e construções semelhantes usando variáveis relacionadas execpath, execpaths, rootpath e rootpaths).
  2. Em seguida, as variáveis"Make" são expandidas. As variáveis predefinidas $(JAVA), $(JAVAC) e $(JAVABASE) são expandidas na configuração exec. Assim, as invocações Java executadas como parte de uma etapa de build podem carregar corretamente bibliotecas compartilhadas e outras dependências.
  3. Por fim, o comando resultante é executado usando o shell Bash. Se o código de saída for diferente de zero, o comando será considerado como falho.
Este é o substituto de cmd_bash, cmd_ps e cmd_bat, se nenhum deles for aplicável.

Se o comprimento da linha de comando exceder o limite da plataforma (64K no Linux/macOS, 8K no Windows), a genrule vai gravar o comando em um script e executar esse script para contornar o problema. Isso se aplica a todos os atributos cmd (cmd, cmd_bash, cmd_ps, cmd_bat).

cmd_bash

String; o padrão é ""

O comando Bash a ser executado.

Esse atributo tem prioridade maior que cmd. O comando é expandido e executado da mesma forma que o atributo cmd.

cmd_bat

String; o padrão é ""

O comando do Batch a ser executado no Windows.

Esse atributo tem prioridade maior que cmd e cmd_bash. O comando é executado de maneira semelhante ao atributo cmd, com as seguintes diferenças:

  • Esse atributo só se aplica ao Windows.
  • O comando é executado com cmd.exe /c e os seguintes argumentos padrão:
    • /S: remove as aspas inicial e final e executa todo o resto como está.
    • /E:ON: ativa o conjunto de comandos estendido.
    • /V:ON: ativar a expansão de variáveis atrasada
    • /D: ignora as entradas de registro do AutoRun.
  • Depois da substituição de $(location) e da variável"Make", os caminhos serão expandidos para o estilo do Windows (com barra invertida).
cmd_ps

String; o padrão é ""

O comando do PowerShell a ser executado no Windows.

Esse atributo tem prioridade maior que cmd, cmd_bash e cmd_bat. O comando é executado de maneira semelhante ao atributo cmd, com as seguintes diferenças:

  • Esse atributo só se aplica ao Windows.
  • O comando é executado com powershell.exe /c.

Para facilitar o uso do PowerShell e reduzir a probabilidade de erros, executamos os seguintes comandos para configurar o ambiente antes de executar o comando do PowerShell na genrule.

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned: permite a execução de scripts não assinados.
  • $errorActionPreference='Stop': se houver vários comandos separados por ;, a ação será encerrada imediatamente se um cmdlet do PowerShell falhar, mas isso NÃO funciona para comandos externos.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8': muda a codificação padrão de utf-16 para utf-8.
executable

Booleano; não configurável; o padrão é False

Declare que a saída é executável.

Definir essa flag como "True" significa que a saída é um arquivo executável e pode ser executada usando o comando run. A genrule precisa produzir exatamente uma saída nesse caso. Se esse atributo for definido, run vai tentar executar o arquivo, seja qual for o conteúdo dele.

Não é possível declarar dependências de dados para o executável gerado.

local

Booleano; o padrão é False

Se definida como "True", essa opção força a execução do genrule usando a estratégia "local", o que significa que não há execução remota, sandbox ou trabalhadores persistentes.

Isso equivale a fornecer "local" como uma tag (tags=["local"]).

message

String; o padrão é ""

Uma mensagem de progresso.

Uma mensagem de progresso que será impressa à medida que esta etapa de build for executada. Por padrão, a mensagem é "Gerando saída" (ou algo igualmente sem graça), mas você pode fornecer uma mensagem mais específica. Use esse atributo em vez de echo ou outras instruções de impressão no comando cmd, porque isso permite que a ferramenta de build controle se essas mensagens de progresso são impressas ou não.

output_licenses

Tipo de licença. O padrão é ["none"].

Consulte common attributes .
output_to_bindir

Booleano; não configurável; o padrão é False

Se definido como "True", essa opção fará com que os arquivos de saída sejam gravados no diretório bin em vez do diretório genfiles.

tools

Lista de rótulos. O padrão é [].

Uma lista de dependências de ferramenta para essa regra. Consulte a definição de dependências para mais informações.

O sistema de build garante que esses pré-requisitos sejam criados antes de executar o comando genrule. Eles são criados usando a configuração exec, já que essas ferramentas são executadas como parte do build. O caminho de um destino //x:y de tools individual pode ser obtido usando $(location //x:y).

Qualquer *_binary ou ferramenta a ser executada por cmd precisa aparecer nesta lista, não em srcs, para garantir que sejam criados na configuração correta.

starlark_doc_extract

Ver origem da regra
starlark_doc_extract(name, deps, src, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, render_main_repo_name, restricted_to, symbol_names, tags, target_compatible_with, testonly, visibility)

O starlark_doc_extract() extrai a documentação de regras, funções (incluindo macros), aspectos e provedores definidos ou reexportados em um determinado arquivo .bzl ou .scl. A saída dessa regra é um proto binário ModuleInfo, conforme definido em stardoc_output.proto na árvore de origem do Bazel.

Metas de saída implícitas

  • name.binaryproto (a saída padrão): um proto binário A ModuleInfo.
  • name.textproto (criado apenas se solicitado explicitamente): a versão proto de texto de name.binaryproto.

Aviso: não há garantia de que o formato de saída dessa regra seja estável. Ele é destinado principalmente ao uso interno pelo Stardoc.

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.

deps

Lista de rótulos. O padrão é [].

Uma lista de destinos que envolvem os arquivos Starlark load()-ados por src. Esses destinos devem, em uso normal, ser destinos bzl_library, mas a regra starlark_doc_extract não exige isso e aceita qualquer destino que forneça arquivos Starlark em DefaultInfo.

Os arquivos Starlark encapsulados precisam estar na árvore de origem. O Bazel não pode load() arquivos gerados.

src

Rótulo; obrigatório

Um arquivo Starlark de onde extrair a documentação.

Esse precisa ser um arquivo na árvore de origem. O Bazel não pode load() arquivos gerados.

render_main_repo_name

Booleano; o padrão é False

Se for verdadeiro, renderize os rótulos no repositório principal na documentação emitida com um componente de repositório (em outras palavras, //foo:bar.bzl será emitido como @main_repo_name//foo:bar.bzl).

O nome a ser usado para o repositório principal é obtido de module(name = ...) no arquivo MODULE.bazel do repositório principal (se o Bzlmod estiver ativado) ou de workspace(name = ...) no arquivo WORKSPACE do repositório principal.

Esse atributo precisa ser definido como False ao gerar documentação para arquivos Starlark que devem ser usados apenas no mesmo repositório e como True ao gerar documentação para arquivos Starlark que devem ser usados em outros repositórios.

symbol_names

Lista de strings. O padrão é [].

Uma lista opcional de nomes qualificados de funções, regras, provedores ou aspectos exportados (ou structs em que eles estão aninhados) para extrair a documentação. Aqui, um nome qualificado significa o nome em que uma entidade é disponibilizada para um usuário do módulo, incluindo todas as structs em que a entidade está aninhada para namespace.

starlark_doc_extract emite documentação para uma entidade se e somente se

  1. cada componente do nome qualificado da entidade é público (ou seja, o primeiro caractere de cada componente do nome qualificado é alfabético, não "_"); e
    1. ou a lista symbol_names está vazia (que é o caso padrão), ou
    2. o nome qualificado da entidade ou de uma struct em que a entidade está aninhada está na lista symbol_names.

test_suite

Ver origem da regra
test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)

Um test_suite define um conjunto de testes considerados "úteis" para humanos. Isso permite que os projetos definam conjuntos de testes, como "testes que você precisa executar antes do check-in", "testes de estresse do nosso projeto" ou "todos os testes pequenos". O comando blaze test respeita esse tipo de organização: para uma invocação como blaze test //some/test:suite, o Blaze primeiro enumera todos os destinos de teste incluídos de forma transitiva pelo destino //some/test:suite (chamamos isso de "expansão test_suite"), depois o Blaze cria e testa esses destinos.

Exemplos

Um conjunto de testes para executar todos os testes pequenos no pacote atual.

test_suite(
    name = "small_tests",
    tags = ["small"],
)

Um pacote de testes que executa um conjunto especificado de testes:

test_suite(
    name = "smoke_tests",
    tests = [
        "system_unittest",
        "public_api_unittest",
    ],
)

Um pacote de testes para executar todos os testes no pacote atual que não são instáveis.

test_suite(
    name = "non_flaky_test",
    tags = ["-flaky"],
)

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.

tags

Lista de strings; não configurável; o padrão é []

Lista de tags de texto, como "small", "database" ou "-flaky". As tags podem ser qualquer string válida.

As tags que começam com um caractere "-" são consideradas negativas. O caractere "-" anterior não é considerado parte da tag. Portanto, uma tag de conjunto "-small" corresponde ao tamanho "small" de um teste. Todas as outras tags são consideradas positivas.

Como opção, para tornar as tags positivas mais explícitas, elas também podem começar com o caractere "+", que não será avaliado como parte do texto da tag. Ela apenas facilita a leitura da distinção entre positivo e negativo.

Somente as regras de teste que correspondem a todas as tags positivas e a nenhuma das tags negativas serão incluídas no conjunto de testes. Isso não significa que a verificação de erros para dependências em testes filtrados seja ignorada. As dependências em testes ignorados ainda precisam ser válidas (por exemplo, não bloqueadas por restrições de visibilidade).

A palavra-chave da tag manual é tratada de maneira diferente do que acima pela "expansão de test_suite" realizada pelo comando blaze test em invocações que envolvem padrões de destino de caracteres curinga. Lá, as segmentações test_suite marcadas como "manual" são filtradas e, portanto, não são expandidas. Esse comportamento é consistente com a forma como blaze build e blaze test lidam com padrões de destino de caractere curinga em geral. Isso é explicitamente diferente de como blaze query 'tests(E)' se comporta, já que as suítes são sempre expandidas pela função de consulta tests, independente da tag manual.

O size de um teste é considerado uma tag para fins de filtragem.

Se você precisar de um test_suite que contenha testes com tags mutuamente exclusivas (por exemplo, todos os testes pequenos e médios), crie três regras de test_suite: uma para todos os testes pequenos, uma para todos os testes médios e uma que inclua as duas anteriores.

tests

Lista de marcadores; não configuráveis; o padrão é []

Uma lista de pacotes de testes e destinos de teste de qualquer linguagem.

Qualquer *_test é aceito aqui, independente do idioma. No entanto, nenhum destino de *_binary é aceito, mesmo que execute um teste. A filtragem pelo tags especificado só é feita para testes listados diretamente nesse atributo. Se esse atributo contiver test_suites, os testes dentro deles não serão filtrados por esse test_suite (eles já são considerados filtrados).

Se o atributo tests não for especificado ou estiver vazio, a regra vai incluir por padrão todas as regras de teste no arquivo BUILD atual que não estão marcadas como manual. Essas regras ainda estão sujeitas à filtragem de tag.