Visão geral da extensão

Informar um problema Ver código-fonte Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Esta página descreve como estender a linguagem BUILD usando macros e regras.

As extensões do Bazel são arquivos que terminam em .bzl. Use uma instrução de carregamento para importar um símbolo de uma extensão.

Antes de aprender os conceitos mais avançados, faça o seguinte:

Macros e regras

Uma macro é uma função que instancia regras. Há dois tipos de macros: macros simbólicas (novas no Bazel 8) e macros legado. Os dois tipos de macros são definidos de maneira diferente, mas se comportam quase da mesma forma do ponto de vista de um usuário. Uma macro é útil quando um arquivo BUILD está ficando muito repetitivo ou complexo, porque ela permite reutilizar algum código. A função é avaliada assim que o arquivo BUILD é lido. Após a avaliação do arquivo BUILD, o Bazel tem poucas informações sobre macros. Se a macro gerar um genrule, o Bazel vai se comportar quase como se você tivesse declarado esse genrule no arquivo BUILD. A única exceção é que os destinos declarados em uma macro simbólica têm semântica de visibilidade especial: uma macro simbólica pode ocultar os destinos internos do restante do pacote.

Uma regra é mais poderosa do que uma macro. Ele pode acessar os elementos internos do Bazel e ter controle total sobre o que está acontecendo. Por exemplo, ela pode transmitir informações para outras regras.

Se você quiser reutilizar uma lógica simples, comece com uma macro. Recomendamos uma macro simbólica, a menos que você precise oferecer suporte a versões mais antigas do Bazel. Se uma macro se tornar complexa, geralmente é uma boa ideia torná-la uma regra. O suporte a um novo idioma geralmente é feito com uma regra. As regras são para usuários avançados, e a maioria dos usuários nunca precisará escrever uma. Eles só vão carregar e chamar as regras existentes.

Modelo de avaliação

Um build consiste em três fases.

  • Fase de carregamento. Primeiro, carregue e avalie todas as extensões e todos os arquivos BUILD necessários para o build. A execução dos arquivos BUILD simplesmente instancia regras. Sempre que uma regra é chamada, ela é adicionada a um gráfico. É aqui que as macros são avaliadas.

  • Fase de análise. O código das regras é executado (a função implementation delas) e as ações são instanciadas. Uma ação descreve como gerar um conjunto de saídas a partir de um conjunto de entradas, como "run gcc on hello.c and get hello.o". É necessário listar explicitamente quais arquivos serão gerados antes de executar os comandos reais. Em outras palavras, a fase de análise usa o gráfico gerado pela fase de carregamento e gera um gráfico de ação.

  • Fase de execução. As ações são executadas quando pelo menos uma das saídas é necessária. Se um arquivo estiver ausente ou se um comando falhar ao gerar uma saída, o build vai falhar. Os testes também são executados durante essa fase.

O Bazel usa o paralelismo para ler, analisar e avaliar os arquivos .bzl e BUILD. Um arquivo é lido no máximo uma vez por build, e o resultado da avaliação é armazenado em cache e reutilizado. Um arquivo só é avaliado depois que todas as dependências (instruções load()) são resolvidas. Por design, o carregamento de um arquivo .bzl não tem efeitos colaterais visíveis, apenas define valores e funções.

O Bazel tenta ser inteligente: ele usa a análise de dependência para saber quais arquivos precisam ser carregados, quais regras precisam ser analisadas e quais ações precisam ser executadas. Por exemplo, se uma regra gerar ações que você não precisa para o build atual, elas não serão executadas.

Como criar extensões

Os dois links abaixo serão muito úteis ao escrever suas próprias extensões. Mantenha-os ao alcance:

Mais informações

Além das macros e regras, você pode escrever aspectos e regras de repositório.