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 os autores das regras.

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

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

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

    1. Verifique se o conjunto de ferramentas e a plataforma de destino são compatíveis verificando o atributo target_compatible_with.
    2. Verifique o conjunto de ferramentas e a plataforma de execução verificando o atributo exec_compatible_with.
    3. Se houver vários conjuntos de ferramentas restantes, escolha o que tiver a prioridade mais alta (o que foi registrado primeiro).
  3. O ToolchainResolutionFunction chama SingleToolchainResolutionFunction para cada tipo de conjunto 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 um conjunto de ferramentas válido para cada tipo de conjunto de ferramentas solicitado.
    2. Se houver várias plataformas de execução restantes, escolha a que tiver a prioridade mais alta (a que foi registrada primeiro).
      1. Se a plataforma de execução já estiver definida pela transição do conjunto de ferramentas, ela será selecionada primeiro, conforme descrito abaixo.

Conforme discutido em Conjuntos de ferramentas e configurações, a dependência de um destino para um conjunto de ferramentas usa uma configuração especial que força a plataforma de execução a ser igual para ambos. Apesar do nome "Transição de conjunto de ferramentas", não é implementado como uma transição de configuração, mas como uma subclasse especial de ConfiguredTargetKey, chamada ToolchainDependencyConfiguredTargetKey. Além dos outros dados do ConfiguredTargetKey, essa subclasse também contém o rótulo da plataforma de execução. Quando ToolchainResolutionFunction estiver considerando qual plataforma de execução usar, se a plataforma de execução forçada do 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á conjuntos de ferramentas válidos ou devido a restrições de execução da regra ou destino), a plataforma de execução válida de maior prioridade será usada.