Regras gerais

Informar um problema Ver código-fonte

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 uma regra.

O alias só funciona para destinos "normais". Em particular, package_group e test_suite não podem ter alias.

A regra de alias tem sua própria declaração de visibilidade. Em todos os outros aspectos, ela se comporta como a regra a que se refere (por exemplo, testonly no alias é ignorada; a testtestness-ness da regra referenciada é usada) com algumas pequenas exceções:

  • Os testes não serão executados se o alias 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.
  • Ao definir grupos de ambiente, os aliases das regras environment não são compatíveis. Eles 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

Name; required

Um nome exclusivo para esse destino.

actual

Label; required

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

Configuração de configuração

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 sinalizações de compilação ou restrições de plataforma) para acionar atributos configuráveis. Consulte selecionar para consumir essa regra e atributos configuráveis para ter uma visão geral do recurso geral.

Exemplos

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

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

O código a seguir corresponde a qualquer build que segmente ARM e aplique 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 código a seguir corresponde a qualquer build que defina sinalização definida pelo usuário --//custom_flags:foo=1 (explicitamente na linha de comando ou implicitamente de arquivos .bazelrc):

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

Veja a seguir qualquer build que segmente uma plataforma com uma arquitetura x86_64 e glibc 2.25, supondo que exista um constraint_value com o rótulo //example:glibc_2_25. Uma plataforma ainda vai fazer a correspondência 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 dentro do build. Por exemplo, se um destino precisar ser criado para uma plataforma diferente da dependência, isso significa que, mesmo quando um config_setting não corresponde às sinalizações de linha de comando de nível superior, ele ainda pode corresponder a alguns destinos de build.

Observações

  • Consulte selecione o que acontece quando vários config_settings correspondem ao estado de configuração atual.
  • Para sinalizações compatíveis com formulários abreviados (por exemplo, --compilation_mode e -c), as definições de values precisam usar o formato completo. Eles correspondem automaticamente às invocações usando qualquer um dos formulários.
  • Se uma sinalização usar vários valores (como --copt=-Da --copt=-Db ou uma sinalização Starlark do tipo lista), values = { "flag": "a" } corresponderá se "a" estiver presente em qualquer lugar na lista.

    values = { "myflag": "a,b" } funciona da mesma forma: 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 sinalizações. Por exemplo, --copt não oferece suporte a vários valores na mesma instância: --copt=a,b produz ["a,b"] enquanto --copt=a --copt=b produz ["a", "b"] (de modo que values = { "copt": "a,b" } corresponde ao primeiro, mas não ao último). 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 da sinalização e teste suas condições com cuidado para conferir as expectativas exatas.

  • Se você precisar definir condições que não são modeladas por sinalizações de compilação integradas, use sinalizações definidas pelo Starlark. Também é possível usar --define, mas isso oferece suporte mais fraco e não é recomendado. Veja mais informações aqui.
  • Evite repetir definições de config_setting idênticas 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 deles precisa ser definido para qualquer config_setting específico.

Argumentos

Atributos
name

Name; required

Um nome exclusivo para esse destino.

constraint_values

List of labels; optional; nonconfigurable

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

No caso em que dois config_settings correspondem no 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

Dictionary: String -> String; optional; nonconfigurable

O mesmo que values, mas especificamente para a sinalização --define.

--define é especial porque a sintaxe dele (--define KEY=VAL) significa que KEY=VAL é um valor de uma perspectiva de sinalização do Bazel.

Isso significa que:

            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. Este atributo resolve esse 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 sintaxe de sinalização normal e pode ser misturado livremente com esse atributo, desde que as chaves do dicionário permaneçam distintas.

flag_values

Dictionary: label -> String; optional; nonconfigurable

O mesmo que values, mas para sinalizações de build definidas pelo usuário.

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

values

Dictionary: String -> String; optional; nonconfigurable

O conjunto de valores de configuração que correspondem a essa regra (expresso como sinalizações de build).

Essa regra herda a configuração do destino configurado que a referencia em uma instrução select. Considera-se "corresponder" a uma invocação do Bazel se, para cada entrada no dicionário, a configuração 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 ... nas regras configuradas pelo destino.

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

Se uma sinalização 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, somente a última instância será usada. Se uma chave faz referência a uma sinalização que pode ser definida várias vezes na linha de comando (por exemplo, bazel build --copt=foo --copt=bar --copt=baz ...), ocorrerá uma correspondência se qualquer uma dessas configurações for correspondente.

grupo de arquivos

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. Eles podem ser referenciados em outras regras.

Use filegroup em vez de referenciar diretórios diretamente. Como o sistema de compilação não tem conhecimento completo de todos os arquivos abaixo do diretório, ele pode não ser recriado quando esses arquivos forem alterados. Quando combinado com o glob, o filegroup pode garantir que todos os arquivos sejam conhecidos explicitamente pelo sistema de compilação.

Exemplos

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

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

Ou use uma glob para criar um diretório de dados de teste:

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

Name; required

Um nome exclusivo para esse destino.

srcs

List of labels; optional

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

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

data

List of labels; optional

A lista de arquivos necessários para esta regra no momento da execução.

Os destinos nomeados no atributo data serão adicionados aos runfiles desta regra filegroup. Quando o filegroup for referenciado no atributo data de outra regra, o runfiles dele será adicionado ao runfiles da regra dependente. Consulte a seção de 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; optional

O grupo de saída do qual coletar artefatos de origens. 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, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

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

Para manter a versão consistente, a consulta pode acessar apenas o fechamento transitivo dos destinos especificados no atributo scope. As consultas que violarem essa regra falharão durante a execução se strict não for especificado ou verdadeiro. Se strict for falso, os destinos fora do escopo vão ser ignorados com um aviso. A maneira mais fácil de garantir que isso não aconteça é 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 de 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 destinos fora do fechamento transitivo da consulta para influenciar a saída. Em segundo lugar, porque os arquivos BUILD não são compatíveis com dependências de caracteres curinga (por exemplo, deps=["//a/..."] não é permitido).

A saída do genquery é ordenada usando --order_output=full para aplicar a saída determinística.

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

Name; required

Um nome exclusivo para esse destino.

expression

String; required

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 nesse atributo no arquivo a/BUILD se refere ao destino //:b.
opts

List of strings; optional

As opções que são passadas para o 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 como na linha de comando de bazel query.
scope

List of labels; required

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

Boolean; optional; default is True

Se verdadeiro, os destinos com consultas que escapam do fechamento transitivo dos escopos não serão compilados. Se for falso, Bazel vai imprimir um aviso e pular qualquer caminho de consulta que o leve para fora do escopo, enquanto conclui o restante da consulta.

regra geral

Ver origem da regra
genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exec_tools, 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 regras gerais são regras de compilação genéricas que você pode usar se não houver uma regra específica para a tarefa. Por exemplo, é possível executar uma linha de frente do Bash. No entanto, se você precisar compilar arquivos C++, mantenha as regras cc_* existentes, porque todo o trabalho pesado já foi feito para você.

A regra geral requer um shell para interpretar o argumento de comando. Também é fácil referenciar programas arbitrários disponíveis no PATH. No entanto, isso torna o comando não hermético e pode não ser reproduzível. Se você precisa executar apenas uma ferramenta, use run_binary.

Não use uma regra geral para executar testes. Há exceções especiais para testes e resultados de testes, incluindo políticas de armazenamento em cache e variáveis de ambiente. Geralmente, os testes precisam ser executados após a conclusão da compilação e na arquitetura de destino, enquanto as regras gerais são executadas durante a criação e na arquitetura executiva (os dois podem ser diferentes). Se você precisar de uma regra de teste de uso geral, use sh_test.

Considerações sobre a compilação cruzada

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

As regras gerais são executadas durante a compilação, mas as saídas costumam ser usadas após a criação, para implantação ou teste. Considere o exemplo da compilação de código C para um microcontrolador: o compilador aceita arquivos de origem C e gera um código que é executado em um microcontrolador. Obviamente, o código gerado não pode ser executado na CPU usada para criá-lo, mas o compilador C (se compilado a partir da origem) precisa fazer isso.

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

Para regras gerais, o sistema de compilação garante que as dependências sejam criadas corretamente: srcs são criados (se necessário) para a configuração target, tools são criados para a configuração exec e a saída é considerada para a configuração target. Ele também fornece variáveis "Make" que os comandos de regra geral podem transmitir para as ferramentas correspondentes.

É intencional que a regra geral não defina nenhum atributo deps. Outras regras integradas usam informações meta relacionadas ao idioma transmitidas entre as regras para determinar automaticamente como lidar com regras dependentes, mas esse nível de automação não é possível para regras gerais. As regras gerais funcionam apenas no nível do arquivo e dos arquivos de execução.

Casos especiais

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

Ferramentas JDK e C++: para usar uma ferramenta do pacote JDK ou C++, o sistema de compilação oferece um conjunto de variáveis para usar. Consulte Variável"Make" para mais detalhes.

Ambiente de regra geral

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 compilação executa o comando Bash em um ambiente de processo limpo que define apenas as principais variáveis, como PATH, PWD, TMPDIR e algumas outras. Para garantir que as versões sejam reproduzíveis, a maioria das variáveis definidas no ambiente shell do usuário não são transmitidas ao comando da regra. No entanto, o Bazel passa o valor da variável de ambiente PATH do usuário, mas não o Blaze. Qualquer alteração no valor de PATH fará com que o Bazel execute novamente o comando no próximo build.

Um comando de regra geral não pode acessar a rede, exceto para conectar processos que são filhos do próprio comando, mas isso não é obrigatório no momento.

O sistema de compilação exclui automaticamente todos os arquivos de saída existentes, mas cria os diretórios pai necessários antes de executar uma regra geral. Ele também remove todos os arquivos de saída em caso de falha.

Consultoria geral

  • As ferramentas executadas por uma regra precisam ser determinísticas e herméticas. Eles não devem gravar carimbos de data/hora na saída e usar ordens estáveis para conjuntos e mapas, além de gravar apenas caminhos de arquivo relativos na saída, sem caminhos absolutos. Se você não seguir essa regra, um comportamento de compilação inesperado será gerado (o Bazel não reconstruirá uma regra geral, e isso não afetará a performance do cache).
  • Use $(location) extensivamente para saídas, ferramentas e fontes. Devido à segregação de arquivos de saída para diferentes configurações, as regras gerais não podem depender de caminhos codificados e/ou absolutos.
  • Escreva uma macro Starlark comum caso outras regras iguais ou muito semelhantes sejam usadas em vários lugares. Se a regra geral for complexa, considere implementá-la em um script ou como uma regra 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 regra geral.
  • Não grave mensagens informativas em stdout ou stderr. Embora seja útil para depuração, isso pode facilmente se tornar ruído. Uma regra geral bem-sucedida deve ser silenciosa. Por outro lado, uma regra geral com falha precisa emitir mensagens de erro adequadas.
  • $$ 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 na estrutura de diretórios/links simbólicos criado por genrules, e a verificação de dependência dos diretórios não é coerente.
  • Ao fazer referência à regra de regra em outras regras, você pode usar o rótulo da regra de regra ou os rótulos de arquivos de saída individuais. Às vezes, uma abordagem é mais legível e outras faz referência a saídas por nome no srcs de uma regra de consumo para evitar a seleção não intencional de outras saídas da regra, mas pode ser tediosa se a regra gerar 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 regra geral.

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. Observe que o uso de $(SRCS) em vez de diretivas $(location) explícitas também funcionaria. 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

Name; required

Um nome exclusivo para esse destino.


É possível mencionar essa regra por nome na seção srcs ou deps de outras regras BUILD. Se a regra gerar arquivos de origem, use o atributo srcs.
srcs

List of labels; optional

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

Esses atributos não são adequados para listar ferramentas executadas pelo cmd. Em vez disso, use o atributo tools.

O sistema de compilação garante que esses pré-requisitos sejam criados antes de executar o comando genrule. Eles são criados usando a mesma configuração que a 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). Como alternativa, o caminho de um //x:y de destino individual //x:y pode ser recebido usando $(location //x:y) ou usando $<, desde que seja a única entrada em srcs.

outs

List of filenames; required; nonconfigurable

Uma lista de arquivos gerados por essa regra.

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

Se a sinalização executable estiver definida, outs precisará conter exatamente um rótulo.

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

cmd

String; optional

O comando a ser executado. Sujeito à substituição de $(location) e variável"Make".
  1. A primeira substituição de $(location) é aplicada, substituindo todas as ocorrências de $(location label) e $(locations label) (e construções semelhantes usando as variáveis relacionadas execpath, execpaths, rootpath e rootpaths).
  2. Em seguida, as variáveis"Make" são expandidas. Observe que as variáveis predefinidas $(JAVA), $(JAVAC) e $(JAVABASE) se expandem na configuração exec. Dessa forma, as invocações Java executadas como parte de uma etapa de build podem carregar bibliotecas compartilhadas e outras dependências corretamente.
  3. Por fim, o comando resultante é executado usando o shell Bash. Se o código de saída dele for diferente de zero, o comando vai ser considerado com falha.
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), o genrule vai gravar o comando em um script e executá-lo. Isso se aplica a todos os atributos cmd (cmd, cmd_bash, cmd_ps, cmd_bat).

cmd_bash

String; optional

O comando Bash a ser executado.

Este atributo tem prioridade mais alta que cmd. O comando é expandido e executado exatamente da mesma forma que o atributo cmd.

cmd_bat

String; optional

O comando em lote a ser executado no Windows.

Esse atributo tem prioridade mais alta que cmd e cmd_bash. O comando é executado da mesma maneira que o atributo cmd, com as seguintes diferenças:

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

String; optional

O comando do PowerShell para executar no Windows.

Esse atributo tem prioridade mais alta que cmd, cmd_bash e cmd_bat. O comando é executado da mesma maneira que o 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 propensão a erros, executamos os seguintes comandos para configurar o ambiente antes de executar o comando Powershell na regra.

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

List of labels; optional

Obsoleto. Use tools.

Havia um período em que exec_tools e tools se comportaram de maneira diferente, mas agora são equivalentes, e a equipe do Blaze vai migrar todos os usos de exec_tools para tools.

executable

Boolean; optional; nonconfigurable; default is False

Declare a saída como executável.

Definir essa sinalização como "True" significa que a saída é um arquivo executável e pode ser executada usando o comando run. A regra geral precisa produzir exatamente uma saída nesse caso. Se ele for definido, o run vai tentar executar o arquivo independentemente do conteúdo.

Não há suporte para a declaração de dependências de dados para o executável gerado.

local

Boolean; optional; default is False

Se definida como verdadeira, essa opção forçará essa genrule a ser executada usando a estratégia "local", o que significa que não haverá execução remota, sandbox ou workers persistentes.

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

message

String; optional

Uma mensagem de progresso.

Uma mensagem de progresso vai ser exibida quando esta etapa do build for executada. Por padrão, a mensagem é "Gerando output" (ou gerando uma saída igualmente uniforme), mas é possível fornecer uma mais específica. Use esse atributo em vez de echo ou outras instruções de impressão no comando cmd, já que isso permite que a ferramenta de build controle a exibição ou não dessas mensagens de progresso.

output_licenses

Licence type; optional

Consulte common attributes .
output_to_bindir

Boolean; optional; nonconfigurable; default is False

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

tools

List of labels; optional

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

O sistema de compilação garante que esses pré-requisitos sejam criados antes da execução do 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 //x:y de destino individual tools pode ser recebido usando $(location //x:y).

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

conjunto de testes

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

Uma test_suite define um conjunto de testes que são considerados "úteis" para as pessoas. 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 temporariamente pelo destino //some/test:suite (chamados de "expansão de test_suite"). Em seguida, o Blaze cria e testa esses destinos.

Exemplos

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

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

Um conjunto de testes que executa um conjunto específico de testes:

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

Um conjunto 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

Name; required

Um nome exclusivo para esse destino.

tags

List of strings; optional; nonconfigurable

Lista de tags de texto, como "pequeno", "banco de dados" ou "-instável". As tags podem ser qualquer string válida.

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

Opcionalmente, para tornar as tags positivas mais explícitas, as tags também podem começar com o caractere "+", que não será avaliado como parte do texto da tag. Isso apenas facilita a leitura das diferenças positivas e negativas.

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

A palavra-chave da tag manual é tratada de maneira diferente da mostrada acima pela "expansão de test_suite", realizada pelo comando blaze test em invocações envolvendo padrões de destino de caracteres curinga. Lá, os destinos test_suite marcados como "manuais" são filtrados, e não expandidos. Esse comportamento é consistente com a forma como blaze build e blaze test lidam com padrões de destino de caracteres curinga em geral. Observe que isso é explicitamente diferente do comportamento de blaze query 'tests(E)', já que os pacotes são sempre expandidos pela função de consulta tests, independentemente da tag manual.

O size do 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), será necessário criar três regras test_suite: uma para todos os testes pequenos, uma para todos os testes médios e outra que inclui as duas anteriores.

tests

List of labels; optional; nonconfigurable

Uma lista de conjuntos de teste e destinos de teste de qualquer linguagem.

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

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