Saltar a contenido

Toolchain

Machine.toolchain, también incluido en la instantánea, informa los compiladores de C, C++ y CUDA y los sistemas de compilación encontrados en el PATH del host, para que una herramienta conozca la capacidad real de compilación de la máquina sin tener que invocarlos por su cuenta.

from mainboard import Machine

toolchain = Machine().toolchain
for tool in toolchain.tools:
    print(tool.name, tool.version, tool.path)

Solo se conservan las herramientas que están realmente en el PATH, por lo que la lista refleja lo que el host puede ejecutar de verdad. Cada herramienta mantiene el orden en que fue registrada, agrupada por categoría.

En la instantánea

El campo toolchain de Machine().model_dump_json() lista cada herramienta disponible:

{
  "tools": [
    {
      "name": "gcc",
      "category": "c-compiler",
      "path": "/usr/bin/gcc",
      "version": "13.2.0",
      "available": true
    },
    {
      "name": "clang",
      "category": "c-compiler",
      "path": "/usr/bin/clang",
      "version": "21.0.0",
      "available": true
    },
    {
      "name": "nvcc",
      "category": "cuda-compiler",
      "path": "/usr/local/cuda/bin/nvcc",
      "version": "13.0",
      "available": true
    },
    {
      "name": "cmake",
      "category": "build-system",
      "path": "/usr/bin/cmake",
      "version": "3.28.3",
      "available": true
    },
    {
      "name": "ninja",
      "category": "build-system",
      "path": "/usr/bin/ninja",
      "version": "1.11.1",
      "available": true
    }
  ]
}

version es null cuando la herramienta está presente pero su salida de versión no se puede interpretar.

DetectedTool

Cada entrada en tools es un DetectedTool, el resultado estructurado de un sondeo.

campo tipo significado
name str nombre visible de la herramienta, p. ej. gcc o cmake
category ToolCategory grupo de toolchain al que pertenece la herramienta
path str \| None ruta absoluta al binario resuelto, None cuando no está en el PATH
version str \| None cadena de versión interpretada, None cuando está ausente o no se puede leer
available bool si el binario se encontró en el PATH

ToolCategory

ToolCategory es un StrEnum que clasifica cada herramienta en grupos.

miembro valor
C_COMPILER c-compiler
CXX_COMPILER cxx-compiler
CUDA_COMPILER cuda-compiler
BUILD_SYSTEM build-system

Toolchain.by_category reagrupa las herramientas disponibles en estos grupos.

from mainboard import Machine, ToolCategory

toolchain = Machine().toolchain
cuda = toolchain.by_category.get(ToolCategory.CUDA_COMPILER, ())
print([tool.name for tool in cuda])

Cómo se sondea

El descubrimiento está orientado a datos. Un ToolProbe es una receta inmutable para encontrar una herramienta, y la tupla TOOL_PROBES a nivel de módulo es el registro que ejecuta Toolchain.probe().

campo tipo significado
name str nombre visible que se reporta en el DetectedTool
category ToolCategory grupo de toolchain al que pertenece la herramienta
binaries tuple[str, ...] nombres de ejecutables candidatos, probados en orden hasta que uno esté en el PATH
version_args tuple[str, ...] argumentos que hacen que el binario imprima su versión, por defecto ("--version",)
pattern re.Pattern[str] regex cuyo primer grupo captura la versión de la salida del comando

Para cada sondeo, gana el primer binario encontrado en el PATH. Su salida de versión se captura y el primer grupo del pattern se convierte en version. El registro por defecto cubre gcc, clang, g++, clang++, nvcc, cmake, ninja, make y meson.

Extender el registro

Agregar una herramienta es una línea. Añade un ToolProbe a TOOL_PROBES y se descubre en el siguiente sondeo, sin ningún cambio en la lógica de descubrimiento.

from mainboard.models.toolchain import TOOL_PROBES, ToolProbe
from mainboard import ToolCategory

bazel = ToolProbe("bazel", ToolCategory.BUILD_SYSTEM, ("bazel",))
probes = (*TOOL_PROBES, bazel)

from mainboard import Toolchain

toolchain = Toolchain.probe(probes)

Una herramienta con un comando de versión no estándar define version_args y pattern.

import re
from mainboard.models.toolchain import ToolProbe
from mainboard import ToolCategory

icx = ToolProbe(
    "icx",
    ToolCategory.C_COMPILER,
    ("icx",),
    version_args=("--version",),
    pattern=re.compile(r"(\d+\.\d+\.\d+)"),
)

Una familia de herramientas completamente nueva es un miembro de ToolCategory más sus sondeos, así que el modelo crece agregando código en lugar de editar el bucle de sondeo.