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

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

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 cadeias 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 a melhor cadeia de ferramentas registrada para usar com base nos seguintes critérios:

    1. Confira se o conjunto de ferramentas e a plataforma de destino são compatíveis, verificando o atributo target_compatible_with.
    2. Verifique se o conjunto de ferramentas e a plataforma de execução são compatíveis verificando o atributo exec_compatible_with.
    3. Se houver várias cadeias de ferramentas, escolha a de maior prioridade (a que foi registrada primeiro).
  3. 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 uma cadeia de ferramentas válida para cada tipo de cadeia de ferramentas solicitado.
    2. Se houver várias plataformas de execução, escolha a de maior prioridade, ou seja, 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 Toolchains e configurações, a dependência de um destino em uma cadeia de ferramentas usa uma configuração especial que obriga a plataforma de execução a ser a mesma para ambos. Apesar do nome "Transição de conjunto de ferramentas", isso não é implementado como uma transição de configuração, mas 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 de execução forçada do ToolchainDependencyConfiguredTargetKey for válida, ela será usada mesmo que não tenha a maior prioridade.

Observação:se a plataforma de execução forçada não for válida (porque não há toolchains válidos 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.