Detalles de la implementación de la resolución de la cadena de herramientas

Nota: Esta sección está destinada a desarrolladores de Bazel y no es necesaria para los autores de reglas.

Varias clases de SkyFunction implementan el proceso de resolución de la cadena de herramientas:

  1. RegisteredToolchainsFunction y RegisteredExecutionPlatformsFunction encuentran cadenas de herramientas y plataformas de ejecución disponibles, según la configuración actual y el archivo WORKSPACE.

  2. SingleToolchainResolutionFunction resuelve un solo tipo de cadena de herramientas para cada plataforma de ejecución. Es decir, para cada plataforma de ejecución, encuentra la mejor cadena de herramientas registrada según su criterio:

    1. Asegúrate de que la cadena de herramientas y la plataforma de destino sean compatibles. Para ello, verifica el atributo target_compatible_with.
    2. Asegúrate de que la cadena de herramientas y la plataforma de ejecución sean compatibles. Para ello, verifica el atributo exec_compatible_with.
    3. Si quedan varias cadenas de herramientas, elige la de mayor prioridad (la que se registró primero).
  3. ToolchainResolutionFunction llama a SingleToolchainResolutionFunction para cada tipo de cadena de herramientas solicitado y, luego, determina la mejor plataforma de ejecución que puede usar.

    1. Primero, quita cualquier plataforma de ejecución que no tenga una cadena de herramientas válida para cada tipo de cadena de herramientas solicitado.
    2. Si quedan varias plataformas de ejecución, elige la que tenga la prioridad más alta (la que se registró primero).
      1. Si la plataforma de ejecución ya está configurada en la transición de la cadena de herramientas, se seleccionará primero como se describe a continuación.

Como se explica en Cadenas de herramientas y configuraciones, la dependencia de un destino a una cadena de herramientas utiliza una configuración especial que hace que la plataforma de ejecución sea la misma para ambas. A pesar del nombre de transición de la cadena de herramientas, esto no se implementa como una transición de configuración, sino como una subclase especial de ConfiguredTargetKey, llamada ToolchainDependencyConfiguredTargetKey. Además de los otros datos de ConfiguredTargetKey, esta subclase también contiene la etiqueta de la plataforma de ejecución. Cuando ToolchainResolutionFunction considere qué plataforma de ejecución usar, si la plataforma de ejecución forzada de ToolchainDependencyConfiguredTargetKey es válida, se usará incluso si no es la de prioridad más alta.

Nota: Si la plataforma de ejecución forzada no es válida (porque no hay cadenas de herramientas válidas o debido a restricciones de ejecución de la regla o el destino), se usará la plataforma de ejecución válida con la prioridad más alta.