Definições comuns

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

Esta seção define vários termos e conceitos comuns a muitas funções ou regras de build.

Índice

Tokenização do shell Bourne

Alguns atributos de string de certas regras são divididos em várias palavras de acordo com as regras de tokenização do shell Bourne: espaços sem aspas delimitam palavras separadas, e aspas simples e duplas e barras invertidas são usadas para evitar a tokenização.

Os atributos sujeitos a essa tokenização são explicitamente indicados como tal nas definições deste documento.

Os atributos sujeitos à expansão da variável "Make" e à tokenização do shell Bourne geralmente são usados para transmitir opções arbitrárias a compiladores e outras ferramentas. Exemplos desses atributos são cc_library.copts e java_library.javacopts. Juntas, essas substituições permitem que uma única variável de string seja expandida em uma lista de palavras de opção específica da configuração.

Expansão de rótulos

Alguns atributos de string de pouquíssimas regras estão sujeitos à expansão de rótulos: se essas strings contiverem um rótulo válido como uma substring, como //mypkg:target, e esse rótulo for um pré-requisito declarado da regra atual, ele será expandido para o nome do caminho do arquivo representado pelo //mypkg:target target.

Exemplos de atributos incluem genrule.cmd e cc_binary.linkopts. Os detalhes podem variar muito em cada caso, em questões como: se os rótulos relativos são expandidos; como os rótulos que se expandem para vários arquivos são tratados etc. Consulte a documentação do atributo de regra para saber mais detalhes.

Atributos típicos definidos pela maioria das regras de build

Esta seção descreve atributos definidos por muitas regras de build, mas não por todas.

Atributo Descrição
data

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

Arquivos necessários para essa regra no tempo de execução. Pode listar destinos de arquivos ou regras. Geralmente permite qualquer destino.

As saídas e os runfiles padrão das metas no atributo data devem aparecer na área *.runfiles de qualquer executável que seja gerado ou tenha uma dependência de tempo de execução nessa meta. Isso pode incluir arquivos de dados ou binários usados quando os srcs desse destino são executados. Consulte a seção dependências de dados para mais informações sobre como depender e usar arquivos de dados.

As novas regras precisam definir um atributo data se processarem entradas que podem usar outras entradas durante a execução. As funções de implementação das regras também precisam preencher os runfiles do destino com as saídas e os runfiles de qualquer atributo data, bem como os runfiles de qualquer atributo de dependência que forneça código-fonte ou dependências de tempo de execução.

deps

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

Dependências para essa meta. Geralmente, só deve listar destinos de regras de lista. Embora algumas regras permitam que os arquivos sejam listados diretamente em deps, evite isso quando possível.

As regras específicas de idioma geralmente limitam os destinos listados àqueles com provedores específicos.

A semântica precisa do que significa um destino depender de outro usando deps é específica para o tipo de regra, e a documentação específica da regra entra em mais detalhes. Para regras que processam código-fonte, deps geralmente especifica dependências de código usadas pelo código em srcs.

Na maioria das vezes, uma dependência deps é usada para permitir que um módulo use símbolos definidos em outro módulo escrito na mesma linguagem de programação e compilado separadamente. Em muitos casos, também são permitidas dependências entre linguagens. Por exemplo, um destino java_library pode depender de código C++ em um destino cc_library, listando o último no atributo deps. Consulte a definição de dependências para mais informações.

licenses

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

Uma lista de strings de tipo de licença a serem usadas para esse destino específico. Isso faz parte de uma API de licenciamento descontinuada que o Bazel não usa mais. Não use isso.

srcs

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

Arquivos processados ou incluídos por esta regra. Geralmente lista arquivos diretamente, mas pode listar destinos de regras (como filegroup ou genrule) para incluir as saídas padrão.

As regras específicas de idioma geralmente exigem que os arquivos listados tenham extensões de arquivo específicas.

Atributos comuns a todas as regras de build

Esta seção descreve os atributos que são adicionados implicitamente a todas as regras de build.

Atributo Descrição
aspect_hints

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

Uma lista de rótulos arbitrários expostos a aspectos (em especial, aspectos invocados pelas dependências inversas desta regra), mas não à própria implementação da regra. Consulte a documentação para conjuntos de regras específicos da linguagem e saiba mais sobre o efeito de uma dica de aspecto específica.

Pense em uma dica de aspecto como uma alternativa mais completa a uma tag: enquanto uma tag transmite apenas um estado booleano (a tag está presente ou ausente na lista tags), uma dica de aspecto pode transmitir informações estruturadas arbitrárias nos provedores.

Na prática, as dicas de aspecto são usadas para interoperabilidade entre diferentes conjuntos de regras específicos de linguagem. Por exemplo, imagine que você tenha uma meta mylang_binary que precisa depender de uma meta otherlang_library. A lógica específica do MyLang precisa de mais informações sobre o destino OtherLang para usá-lo, mas otherlang_library não fornece essas informações porque não sabe nada sobre MyLang. Uma solução pode ser o conjunto de regras MyLang definir uma regra mylang_hint que pode ser usada para codificar essas informações adicionais. O usuário pode adicionar a dica ao aspect_hints do otherlang_library, e o mylang_binary pode usar um aspecto para coletar as informações adicionais de um provedor específico do MyLang no mylang_hint.

Para um exemplo concreto, consulte swift_interop_hint e swift_overlay em rules_swift.

Práticas recomendadas:

  • Os destinos listados em aspect_hints precisam ser leves e mínimos.
  • A lógica específica do idioma deve considerar apenas dicas de aspectos com provedores relevantes para esse idioma e ignorar todas as outras dicas.
compatible_with

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

A lista de ambientes para os quais esse destino pode ser criado, além dos ambientes padrão compatíveis.

Isso faz parte do sistema de restrições do Bazel, que permite aos usuários declarar quais targets podem e não podem depender uns dos outros. Por exemplo, binários implantáveis externamente não podem depender de bibliotecas com código secreto da empresa. Consulte ConstraintSemantics para mais detalhes.

deprecation

String; não configurável; o padrão é None

Uma mensagem de aviso explicativa associada a essa meta. Normalmente, isso é usado para notificar os usuários de que um destino ficou obsoleto, foi substituído por outra regra, é particular a um pacote ou é considerado prejudicial por algum motivo. É uma boa ideia incluir alguma referência (como uma página da Web, um número de bug ou exemplos de CLs de migração) para que seja fácil descobrir quais mudanças são necessárias para evitar a mensagem. Se houver um novo destino que possa ser usado como substituição, é uma boa ideia migrar todos os usuários do destino antigo.

Esse atributo não afeta a forma como as coisas são criadas, mas pode afetar a saída de diagnóstico de uma ferramenta de build. A ferramenta de build emite um aviso quando uma regra com um atributo deprecation é usada por uma meta em outro pacote.

As dependências intra pacote estão isentas desse aviso. Por exemplo, a criação dos testes de uma regra descontinuada não gera um aviso.

Se um destino descontinuado depender de outro, nenhuma mensagem de aviso será emitida.

Quando as pessoas pararem de usar, o destino poderá ser removido.

exec_compatible_with

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

Uma lista de constraint_values que precisam estar presentes na plataforma de execução do grupo de execução padrão deste destino. Isso é adicionado a qualquer restrição já definida pelo tipo de regra. As restrições são usadas para restringir a lista de plataformas de execução disponíveis. Para mais detalhes, consulte a descrição da resolução do conjunto de ferramentas. e grupos de execução.

exec_group_compatible_with

Dicionário de strings para listas de marcadores; nonconfigurable; o padrão é {}

Um dicionário de nomes de grupos de execução para listas de constraint_values que precisam estar presentes na plataforma de execução para o grupo de execução especificado. Isso é adicional a qualquer restrição já definida na definição do grupo de execução. As restrições são usadas para restringir a lista de plataformas de execução disponíveis. Para mais detalhes, consulte a descrição da resolução do conjunto de ferramentas. e grupos de execução.

exec_properties

Dicionário de strings. O padrão é {}.

Um dicionário de strings que será adicionado ao exec_properties de uma plataforma selecionada para essa meta. Consulte exec_properties da regra da plataforma.

Se uma chave estiver presente nas propriedades da plataforma e do nível de destino, o valor será extraído do destino.

As chaves podem ter como prefixo o nome de um grupo de execução seguido por um . para serem aplicadas apenas a esse grupo específico.

features

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

Um recurso é uma tag de string que pode ser ativada ou desativada em um destino. O significado de um recurso depende da regra em si.

Esse atributo features é combinado com o atributo features no nível do pacote. Por exemplo, se os recursos ["a", "b"] estiverem ativados no nível do pacote e o atributo features de uma meta contiver ["-a", "c"], os recursos ativados para a regra serão "b" e "c". Confira um exemplo.

package_metadata

Lista de rótulos; nonconfigurable; o padrão é o default_package_metadata do pacote

Uma lista de rótulos que são metadados associados sobre essa meta. Normalmente, os rótulos são regras simples que retornam um provedor de valores constantes. As regras e os aspectos podem usar esses rótulos para realizar uma análise adicional no gráfico de build.

O caso de uso canônico é o de rules_license. Para esse caso de uso, package_metadata e default_package_metadata são usados para anexar informações sobre a licença ou versão de um pacote a destinos. Um aspecto aplicado a um binário de nível superior pode ser usado para coletar esses dados e gerar relatórios de compliance.

restricted_to

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

A lista de ambientes para os quais esse destino pode ser criado, em vez de ambientes compatíveis por padrão.

Isso faz parte do sistema de restrições do Bazel. Consulte compatible_with para mais detalhes.

tags

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

Tags podem ser usadas em qualquer regra. As tags em regras de teste e test_suite são úteis para categorizar os testes. As tags em destinos que não são de teste são usadas para controlar a execução em sandbox de genrules e ações do Starlark e para análise por humanos e/ou ferramentas externas.

O Bazel modifica o comportamento do código de isolamento em sandbox se encontrar as seguintes palavras-chave no atributo tags de qualquer teste ou destino genrule, ou nas chaves de execution_requirements para qualquer ação do Starlark.

  • A palavra-chave no-sandbox faz com que a ação ou o teste nunca sejam em sandbox. Eles ainda podem ser armazenados em cache ou executados remotamente. Use no-cache ou no-remote para evitar um ou ambos.
  • A palavra-chave no-cache faz com que a ação ou o teste nunca seja armazenado em cache (local ou remotamente). Observação: para fins desta tag, o cache de disco é considerado um cache local, enquanto os caches HTTP e gRPC são considerados remotos. Outros caches, como o Skyframe ou o cache de ações persistentes, não são afetados.
  • A palavra-chave no-remote-cache faz com que a ação ou o teste nunca seja armazenado em cache remotamente, mas pode ser armazenado em cache localmente ou executado remotamente. Observação: para fins desta tag, o cache de disco é considerado um cache local, enquanto os caches HTTP e gRPC são considerados remotos. Outros caches, como Skyframe ou o cache de ações persistentes, não são afetados. Se uma combinação de cache de disco local e cache remoto for usada (cache combinado), ela será tratada como um cache remoto e desativada completamente, a menos que --incompatible_remote_results_ignore_disk seja definido. Nesse caso, os componentes locais serão usados.
  • A palavra-chave no-remote-exec faz com que a ação ou o teste nunca seja executado remotamente, mas pode ser armazenado em cache remotamente.
  • A palavra-chave no-remote impede que a ação ou o teste sejam executados ou armazenados em cache remotamente. Isso é equivalente a usar no-remote-cache e no-remote-exec.
  • A palavra-chave no-remote-cache-upload desativa o upload de parte do armazenamento em cache remoto de uma geração. ele não desativa a execução remota.
  • A palavra-chave local impede que a ação ou o teste sejam armazenados em cache remotamente, executados remotamente ou executados no sandbox. Para genrules e testes, marcar a regra com o atributo local = True tem o mesmo efeito.
  • A palavra-chave requires-network permite o acesso à rede externa de dentro do sandbox. Essa tag só tem efeito se o isolamento em sandbox estiver ativado.
  • A palavra-chave block-network bloqueia o acesso à rede externa de dentro do sandbox. Nesse caso, apenas a comunicação com o host local é permitida. Essa tag só tem efeito se o sandbox estiver ativado.
  • O requires-fakeroot executa o teste ou a ação como uid e gid 0 (ou seja, o usuário raiz). Isso só é compatível com o Linux. Essa tag tem precedência sobre a opção de linha de comando --sandbox_fake_username.

As tags em testes geralmente são usadas para anotar a função de um teste no seu processo de depuração e lançamento. Normalmente, as tags são mais úteis para testes em C++ e Python, que não têm capacidade de anotação de tempo de execução. O uso de tags e elementos de tamanho oferece flexibilidade na montagem de conjuntos de testes com base na política de check-in do codebase.

O Bazel modifica o comportamento de execução do teste se encontrar as seguintes palavras-chave no atributo tags da regra de teste:

  • exclusive vai forçar a execução do teste no modo "exclusivo", garantindo que nenhum outro teste esteja em execução ao mesmo tempo. Esses testes serão executados em série depois que toda a atividade de build e os testes não exclusivos forem concluídos. A execução remota é desativada para esses testes porque o Bazel não tem controle sobre o que está sendo executado em uma máquina remota.
  • exclusive-if-local vai forçar a execução do teste no modo "exclusivo" se ele for executado localmente, mas vai executar o teste em paralelo se ele for executado remotamente.
  • A palavra-chave manual exclui o destino da expansão de caracteres curinga do padrão de destino (..., :*, :all etc.) e regras test_suite que não listam o teste explicitamente ao calcular o conjunto de destinos de nível superior para build/execução dos comandos build, test e coverage. Isso não afeta o caractere curinga de destino nem a expansão do conjunto de testes em outros contextos, incluindo o comando query. manual não significa que um destino não deva ser criado/executado automaticamente por sistemas de build/teste contínuos. Por exemplo, pode ser interessante excluir um destino de bazel test ... porque ele exige flags específicas do Bazel, mas ainda incluí-lo em execuções de pré-envio ou teste contínuo configuradas corretamente.
  • A palavra-chave external força a execução incondicional do teste, independente do valor de --cache_test_results.
Consulte Convenções de tags na Enciclopédia de testes para mais convenções sobre tags anexadas a destinos de teste.
target_compatible_with

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

Uma lista de constraint_values que precisam estar presentes na plataforma de destino para que esse destino seja considerado compatível. Isso é adicionado a qualquer restrição já definida pelo tipo de regra. Se a plataforma de destino não atender a todas as restrições listadas, ela será considerada incompatível. Destinos incompatíveis são ignorados para criação e teste quando o padrão de destino é expandido (por exemplo, //..., :all). Quando especificados explicitamente na linha de comando, os destinos incompatíveis fazem com que o Bazel imprima um erro e cause uma falha de build ou teste.

Os destinos que dependem transitivamente de destinos incompatíveis também são considerados incompatíveis. Eles também são ignorados para criação e testes.

Uma lista vazia (que é o padrão) significa que o destino é compatível com todas as plataformas.

Todas as regras, exceto as regras do Workspace, são compatíveis com esse atributo. Para algumas regras, esse atributo não tem efeito. Por exemplo, especificar target_compatible_with para um cc_toolchain não é útil.

Consulte a página Plataformas para mais informações sobre a rejeição de destino incompatível.

testonly

Booleano; não configurável; o padrão é False exceto para destinos de teste e pacote de testes

Se True, somente destinos testonly (como testes) poderão depender desse destino.

Da mesma forma, uma regra que não seja testonly não pode depender de nenhuma regra que seja testonly.

Os testes (regras *_test) e os conjuntos de testes (regras test_suite) são testonly por padrão.

Esse atributo significa que o destino não deve estar contido em binários lançados para produção.

Como o testonly é aplicado no momento da criação, não no momento da execução, e se propaga de forma viral pela árvore de dependências, ele precisa ser usado com cuidado. Por exemplo, stubs e fakes que são úteis para testes de unidade também podem ser úteis para testes de integração envolvendo os mesmos binários que serão lançados para produção e, portanto, provavelmente não devem ser marcados como testonly. Por outro lado, regras que são perigosas até mesmo para vincular, talvez porque substituam incondicionalmente o comportamento normal, devem ser marcadas como testonly.

toolchains

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

O conjunto de destinos que podem acessar as Variáveis de criação. Esses destinos são instâncias de regras que fornecem TemplateVariableInfo ou destinos especiais para tipos de cadeia de ferramentas integrados ao Bazel. Dentre eles:

  • @bazel_tools//tools/cpp:toolchain_type
  • @rules_java//toolchains:current_java_runtime

Isso é diferente do conceito de resolução de cadeia de ferramentas usado por implementações de regras para configuração dependente da plataforma. Não é possível usar esse atributo para determinar qual cc_toolchain ou java_toolchain específico um destino vai usar.

visibility

Lista de marcadores; não configuráveis; o padrão varia

O atributo visibility controla se o destino pode ser dependente de destinos em outros locais. Consulte a documentação sobre visibilidade.

Para destinos declarados diretamente em um arquivo BUILD ou em macros legadas chamadas de um arquivo BUILD, o valor padrão é o default_visibility do pacote, se especificado, ou ["//visibility:private"]. Para destinos declarados em uma ou mais macros simbólicas, o valor padrão é sempre apenas ["//visibility:private"], o que o torna utilizável apenas no pacote que contém o código da macro.

Atributos comuns a todas as regras de teste (*_test)

Esta seção descreve atributos comuns a todas as regras de teste.

Atributo Descrição
args

Lista de strings sujeita à substituição $(location) e "Criar variável" e à tokenização do shell Bourne. O padrão é [].

Argumentos de linha de comando que o Bazel transmite ao destino quando ele é executado com bazel test.

Esses argumentos são transmitidos antes de qualquer valor --test_arg especificado na linha de comando bazel test.

env

Dicionário de strings. Os valores estão sujeitos à substituição de $(location) e "Criar variável". O padrão é {}.

Especifica variáveis de ambiente adicionais a serem definidas quando o teste é executado por bazel test.

Esse atributo só se aplica a regras nativas, como cc_test, py_test e sh_test. Ela não se aplica a regras de teste definidas em Starlark. Para suas próprias regras do Starlark, adicione um atributo "env" e use-o para preencher um provedor RunEnvironmentInfo.

Provedor TestEnvironment.

env_inherit

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

Especifica variáveis de ambiente adicionais a serem herdadas do ambiente externo quando o teste é executado por bazel test.

Esse atributo só se aplica a regras nativas, como cc_test, py_test e sh_test. Ela não se aplica a regras de teste definidas em Starlark.

size

String "enormous", "large", "medium" ou "small"; não configurável; o padrão é "medium"

Especifica a "intensidade" de um destino de teste: quanto tempo/recursos ele precisa para ser executado.

Os testes de unidade são considerados "pequenos", os de integração "médios" e os completos "grandes" ou "enormes". O Bazel usa o tamanho para determinar um tempo limite padrão, que pode ser substituído usando o atributo timeout. O tempo limite é para todos os testes no destino BUILD, não para cada teste individual. Quando o teste é executado localmente, o size também é usado para fins de programação: o Bazel tenta respeitar --local_{ram,cpu}_resources e não sobrecarregar a máquina local executando muitos testes pesados ao mesmo tempo.

Os tamanhos de teste correspondem aos seguintes tempos limite padrão e usos máximos presumidos de recursos locais:

Tamanho RAM (em MB) CPU (em núcleos de CPU) Tempo limite padrão
pequeno 20 1 curto (1 minuto)
média 100 1 moderada (5 minutos)
grande 300 1 longo (15 minutos)
enorme 800 1 eterno (60 minutos)

A variável de ambiente TEST_SIZE será definida como o valor desse atributo ao gerar o teste.

timeout

String "short", "moderate", "long" ou "eternal"; não configurável; o padrão é derivado do atributo size do teste

Quanto tempo o teste deve ser executado antes de retornar.

Embora o atributo de tamanho de um teste controle a estimativa de recursos, o tempo limite de um teste pode ser definido de forma independente. Se não for especificado explicitamente, o tempo limite será baseado no tamanho do teste. O tempo limite do teste pode ser substituído com a flag --test_timeout, por exemplo, para execução em determinadas condições que são conhecidas por serem lentas. Os valores de tempo limite de teste correspondem aos seguintes períodos:

Valor de tempo limite Período
short 1 minuto
moderada 5 minutos
long 15 minutos
eterno 60 minutos

Para outros horários, o tempo limite do teste pode ser substituído pela flag --test_timeout do Bazel, por exemplo, para execução manual em condições que são conhecidas por serem lentas. Os valores de --test_timeout estão em segundos. Por exemplo, --test_timeout=120 define o tempo limite do teste como dois minutos.

A variável de ambiente TEST_TIMEOUT será definida como o tempo limite do teste (em segundos) ao gerar o teste.

flaky

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

Marca o teste como instável.

Se definido, executa o teste até três vezes, marcando-o como falha apenas se ele falhar todas as vezes. Por padrão, esse atributo é definido como "False" e o teste é executado apenas uma vez. O uso desse atributo geralmente não é recomendado. Os testes precisam ser aprovados de maneira confiável quando as declarações são mantidas.

shard_count

Número inteiro não negativo menor ou igual a 50. O padrão é -1.

Especifica o número de fragmentos paralelos a serem usados para executar o teste.

Se definido, esse valor vai substituir qualquer heurística usada para determinar o número de fragmentos paralelos com que executar o teste. Em algumas regras de teste, esse parâmetro pode ser necessário para ativar o sharding. Consulte também --test_sharding_strategy.

Se o sharding de teste estiver ativado, a variável de ambiente TEST_TOTAL_SHARDS será definida com esse valor ao gerar o teste.

A fragmentação exige que o executor de testes seja compatível com o protocolo de fragmentação de testes. Caso contrário, provavelmente todos os testes serão executados em todos os fragmentos, o que não é o ideal.

Consulte Test Sharding na Enciclopédia de testes para mais detalhes sobre o sharding.

local

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

Força a execução do teste localmente, sem isolamento em sandbox.

Definir como "True" é equivalente a fornecer "local" como uma tag (tags=["local"]).

Atributos comuns a todas as regras binárias (*_binary)

Esta seção descreve atributos comuns a todas as regras binárias.

Atributo Descrição
args

Lista de strings, sujeita à substituição $(location) e "Make variable" e à tokenização do shell Bourne; não configurável; o padrão é [].

Argumentos de linha de comando que o Bazel vai transmitir ao destino quando ele for executado pelo comando run ou como um teste. Esses argumentos são transmitidos antes dos especificados na linha de comando bazel run ou bazel test.

OBSERVAÇÃO: os argumentos não são transmitidos quando você executa o destino fora do Bazel. Por exemplo, ao executar manualmente o binário em bazel-bin/.

env

Dicionário de strings. Os valores estão sujeitos à substituição de $(location) e "Criar variável". O padrão é {}.

Especifica outras variáveis de ambiente a serem definidas quando o destino é executado por bazel run.

Esse atributo só se aplica a regras nativas, como cc_binary, py_binary e sh_binary. Ela não se aplica a regras executáveis definidas em Starlark. Para suas próprias regras do Starlark, adicione um atributo "env" e use-o para preencher um provedor RunEnvironmentInfo.

OBSERVAÇÃO: as variáveis de ambiente não são definidas quando você executa o destino fora do Bazel (por exemplo, executando manualmente o binário em bazel-bin/).

output_licenses

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

As licenças dos arquivos de saída gerados por esse binário. Isso faz parte de uma API de licenciamento descontinuada que o Bazel não usa mais. Não use isso.

Atributos configuráveis

A maioria dos atributos é "configurável", ou seja, os valores podem mudar quando o destino é criado de maneiras diferentes. Especificamente, os atributos configuráveis podem variar de acordo com as flags transmitidas à linha de comando do Bazel ou com a dependência downstream que está solicitando o destino. Isso pode ser usado, por exemplo, para personalizar o destino de várias plataformas ou modos de compilação.

O exemplo a seguir declara diferentes fontes para diferentes arquiteturas de destino. Executar bazel build :multiplatform_lib --cpu x86 vai criar o destino usando x86_impl.cc, enquanto substituir --cpu arm vai fazer com que ele use arm_impl.cc.

cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)

A função select() escolhe entre diferentes valores alternativos para um atributo configurável com base em quais critérios de config_setting ou constraint_value a configuração da meta atende.

O Bazel avalia atributos configuráveis após o processamento de macros e antes das regras de processamento (tecnicamente, entre as fases de carregamento e análise). Qualquer processamento antes da avaliação de select() não sabe qual ramificação o select() escolhe. Por exemplo, as macros não podem mudar o comportamento com base na ramificação escolhida, e bazel query só pode fazer estimativas conservadoras sobre as dependências configuráveis de um destino. Consulte estas perguntas frequentes para saber mais sobre como usar select() com regras e macros.

Os atributos marcados como nonconfigurable na documentação não podem usar esse recurso. Normalmente, um atributo não é configurável porque o Bazel precisa saber internamente o valor dele antes de determinar como resolver um select().

Consulte Atributos de build configuráveis para uma visão geral detalhada.

Metas de saída implícitas

As saídas implícitas em C++ estão descontinuadas. Evite usar em outros idiomas, se possível. Ainda não temos um caminho de descontinuação, mas eles também serão descontinuados.

Ao definir uma regra de build em um arquivo BUILD, você está declarando explicitamente um novo destino de regra nomeado em um pacote. Muitas funções de regra de build também implicam um ou mais destinos de arquivo de saída, cujo conteúdo e significado são específicos da regra. Por exemplo, quando você declara explicitamente uma regra java_binary(name='foo', ...), também está implicitamente declarando um destino de arquivo de saída foo_deploy.jar como membro do mesmo pacote. (Esse destino específico é um arquivo Java independente adequado para implantação.)

Os destinos de saída implícitos são membros de primeira classe do gráfico de destino global. Assim como outras metas, elas são criadas sob demanda, seja quando especificadas no comando de build de nível superior ou quando são pré-requisitos necessários para outras metas de build. Eles podem ser referenciados como dependências em arquivos BUILD e observados na saída de ferramentas de análise, como bazel query.

Para cada tipo de regra de build, a documentação contém uma seção especial que detalha os nomes e conteúdos de todas as saídas implícitas decorrentes de uma declaração desse tipo de regra.

Uma distinção importante, mas um pouco sutil, entre os dois namespaces usados pelo sistema de build: rótulos identificam destinos, que podem ser regras ou arquivos. Os destinos de arquivo podem ser divididos em destinos de arquivo de origem (ou entrada) e derivados (ou saída). Essas são as coisas que você pode mencionar em arquivos BUILD, criar na linha de comando ou examinar usando bazel query; esse é o namespace de destino. Cada destino de arquivo corresponde a um arquivo real no disco (o "namespace do sistema de arquivos"), e cada destino de regra pode corresponder a zero, um ou mais arquivos reais no disco. Pode haver arquivos no disco sem um destino correspondente. Por exemplo, arquivos de objeto .o produzidos durante a compilação em C++ não podem ser referenciados em arquivos BUILD ou na linha de comando. Dessa forma, a ferramenta de build pode ocultar determinados detalhes de implementação de como ela faz o trabalho. Isso é explicado com mais detalhes na Referência de conceitos do BUILD.