Grupos de execução automática (AEGs, na sigla em inglês)

Os grupos de execução automática selecionam uma plataforma de execução para cada tipo de conjunto de ferramentas. Em outras palavras, um destino pode ter várias plataformas de execução sem definir grupos de execução.

Resumo

Os grupos de execução automática estão intimamente conectados aos conjuntos de ferramentas. Se você estiver usando conjuntos de ferramentas, será necessário defini-los nas ações afetadas (ações que usam um executável ou uma ferramenta de um conjunto de ferramentas) adicionando o parâmetro toolchain. Exemplo:

ctx.actions.run(
    ...,
    executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
    ...,
    toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)

Se a ação não usar uma ferramenta ou um executável de um conjunto de ferramentas e o Blaze não detectar isso (o erro será gerado), defina toolchain = None.

Se você precisar usar vários conjuntos de ferramentas em uma única plataforma de execução (uma ação usa um executável ou ferramentas de dois ou mais), defina exec_groups manualmente. Consulte a seção Quando devo usar um exec_group personalizado?.

Histórico

Antes das AEGs, a plataforma de execução era selecionada no nível da regra. Exemplo:

my_rule = rule(
    _impl,
    toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)

A regra my_rule registra dois tipos de conjunto de ferramentas. Isso significa que a Resolução do conjunto de ferramentas foi usada para encontrar uma plataforma de execução que ofereça suporte aos dois tipos de conjunto de ferramentas. A plataforma de execução selecionada foi usada para cada ação registrada dentro da regra, a menos que especificada de maneira diferente com exec_groups. Em outras palavras, todas as ações dentro da regra tinham uma única plataforma de execução, mesmo que usassem ferramentas de conjuntos de ferramentas diferentes. A plataforma de execução é selecionada para cada destino. Isso resultava em falhas quando não havia uma plataforma de execução compatível com todos os conjuntos de ferramentas.

Estado atual

Com as AEGs, a plataforma de execução é selecionada para cada tipo de conjunto de ferramentas. A função de implementação do exemplo anterior, my_rule, teria esta aparência:

def _impl(ctx):
    ctx.actions.run(
      mnemonic = "First action",
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      toolchain = '//tools:toolchain_type_1',
    )

    ctx.actions.run(
      mnemonic = "Second action",
      executable = ctx.toolchain['//tools:toolchain_type_2'].tool,
      toolchain = '//tools:toolchain_type_2',
    )

Essa regra cria duas ações: a First action, que usa o executável de um //tools:toolchain_type_1, e a Second action, que usa o executável de um //tools:toolchain_type_2. Antes das AEGs, as duas ações eram executadas em uma única plataforma de execução compatível com os dois tipos de conjunto de ferramentas. Com as AEGs, ao adicionar o parâmetro toolchain dentro das ações, cada uma é executada na plataforma de execução que fornece o conjunto de ferramentas. As ações podem ser executadas em diferentes plataformas de execução.

O mesmo funciona com ctx.actions.run_shell, em que o parâmetro toolchain precisa ser adicionado quando tools são de um conjunto de ferramentas.

Diferença entre os grupos de execução personalizados e os grupos de execução automática

Como o nome sugere, as AEGs são grupos de execução criados automaticamente para cada tipo de conjunto de ferramentas registrado em uma regra. Não é necessário especificá-los manualmente, ao contrário dos grupos de execução "clássicos".

Quando devo usar um exec_group personalizado?

Os exec_groups personalizados são necessários somente no caso em que vários conjuntos de ferramentas precisam ser executados em uma única plataforma. Em todos os outros casos, não é necessário definir exec_groups personalizados. Exemplo:

def _impl(ctx):
    ctx.actions.run(
      ...,
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      tools = [ctx.toolchain['//tools:toolchain_type_2'].tool],
      exec_group = 'two_toolchains',
    )
my_rule = rule(
    _impl,
    exec_groups = {
        "two_toolchains": exec_group(
            toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
        ),
    }
)

Migração de AEGs

Internamente, no google3, o Blaze já usa as AEGs. Externamente, para o Bazel, a migração está em andamento. Algumas regras já estão usando esse recurso (por exemplo, regras Java e C++).

Quais versões do Bazel são compatíveis com essa migração?

As AEGs têm suporte total no Bazel 7.

Como ativar as AEGs?

--incompatible_auto_exec_groups: definido como verdadeiro Confira mais informações sobre a flag no problema do GitHub (link em inglês).

Como ativar as AEGs dentro de uma regra específica?

Defina o atributo _use_auto_exec_groups em uma regra.

my_rule = rule(
    _impl,
    attrs = {
      "_use_auto_exec_groups": attr.bool(default = True),
    }
)

Isso ativa as AEGs somente em my_rule, e as ações relacionadas começam a usar a nova lógica ao selecionar a plataforma de execução. A sinalização incompatível foi substituída por esse atributo.

Como desativar as AEGs em caso de erro?

Defina --incompatible_auto_exec_groups como falso para desativar completamente as AEGs no projeto (problema do GitHub da sinalização) ou desative uma regra específica definindo o atributo _use_auto_exec_groups como False (mais detalhes sobre o atributo).

Mensagens de erro ao migrar para AEGs

Não foi possível identificar se as ferramentas são de dependências implícitas ou de um conjunto de ferramentas. Defina o parâmetro do conjunto de ferramentas. Se você não estiver usando um conjunto de ferramentas, defina-o como "Nenhum".

  • Nesse caso, você recebe uma pilha de chamadas antes do erro e pode ver claramente qual ação exata precisa do parâmetro do conjunto de ferramentas. Verifique qual conjunto de ferramentas é usado para a ação e defina-o com o parâmetro do conjunto de ferramentas. Se nenhum conjunto de ferramentas for usado dentro da ação para ferramentas ou executável, defina-o como None.

Ação declarada para o conjunto de ferramentas inexistente '[toolkit_type]'.

  • Isso significa que você definiu o parâmetro do conjunto de ferramentas na ação, mas não o registrou na regra. Registre o conjunto de ferramentas ou defina None dentro da ação.

Material extra

Para mais informações, consulte o documento de design: Grupos de execução automáticos para conjuntos de ferramentas.