Detalhes de implementação da resolução do conjunto de ferramentas

Observação:esta seção é destinada a desenvolvedores do Bazel e não é necessária para autores de regras.

Várias classes SkyFunction implementam o processo de resolução da cadeia de ferramentas:

  1. RegisteredToolchainsFunction e RegisteredExecutionPlatformsFunction encontram as toolchains e plataformas de execução disponíveis com base na configuração atual e no arquivo WORKSPACE.

  2. SingleToolchainResolutionFunction resolve um único tipo de cadeia de ferramentas para cada plataforma de execução. Ou seja, para cada plataforma de execução, ele encontra a melhor cadeia de ferramentas registrada para usar com base nos seguintes critérios:

    1. Verifique se o conjunto de ferramentas e a plataforma de destino são compatíveis conferindo o atributo target_compatible_with.
    2. Verifique se o conjunto de ferramentas e a plataforma de execução são compatíveis conferindo o atributo exec_compatible_with.
    3. Se houver várias toolchains, escolha a de maior prioridade (a que foi registrada primeiro).
  3. ToolchainResolutionFunction faz chamadas SingleToolchainResolutionFunction para cada tipo de cadeia de ferramentas solicitado e determina a melhor plataforma de execução a ser usada.

    1. Primeiro, remova qualquer plataforma de execução que não tenha uma cadeia de ferramentas válida para cada tipo solicitado.
    2. Se houver várias plataformas de execução, escolha a de maior prioridade (a que foi registrada primeiro).
      1. Se a plataforma de execução já estiver definida pela transição da cadeia de ferramentas, ela será selecionada primeiro, conforme descrito abaixo.

Como discutido em Cadeias de ferramentas e configurações, a dependência de um destino para uma cadeia de ferramentas usa uma configuração especial que força a plataforma de execução a ser a mesma para ambos. Apesar do nome "transição de cadeia de ferramentas", isso não é implementado como uma transição de configuração, mas sim como uma subclasse especial de ConfiguredTargetKey, chamada ToolchainDependencyConfiguredTargetKey. Além dos outros dados em ConfiguredTargetKey, essa subclasse também contém o rótulo da plataforma de execução. Quando ToolchainResolutionFunction está considerando qual plataforma de execução usar, se a plataforma forçada de ToolchainDependencyConfiguredTargetKey for válida, ela será usada mesmo que não seja a de maior prioridade.

Observação:se a plataforma de execução forçada não for válida (porque não há cadeias de ferramentas válidas ou devido a restrições de execução da regra ou do destino), a plataforma de execução válida de maior prioridade será usada.