Pular para conteúdo

Toolchain

Machine.toolchain, também presente no snapshot, informa os compiladores C, C++ e CUDA e os build systems encontrados no PATH do host, para que uma ferramenta conheça a real capacidade de build da máquina sem precisar invocá-los por conta própria.

from mainboard import Machine

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

Só são mantidas as ferramentas que estão de fato no PATH, então a lista reflete o que o host pode realmente executar. Cada ferramenta mantém a ordem em que foi registrada, agrupada por categoria.

No snapshot

O campo toolchain de Machine().model_dump_json() lista cada ferramenta disponível:

{
  "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 é null quando a ferramenta está presente mas a saída da versão não pode ser interpretada.

DetectedTool

Cada entrada em tools é um DetectedTool, o resultado estruturado de uma sondagem.

campo tipo significado
name str nome de exibição da ferramenta, ex. gcc ou cmake
category ToolCategory grupo de toolchain ao qual a ferramenta pertence
path str \| None caminho absoluto do binário resolvido, None quando não está no PATH
version str \| None string de versão interpretada, None quando ausente ou ilegível
available bool se o binário foi encontrado no PATH

ToolCategory

ToolCategory é um StrEnum que separa cada ferramenta em grupos.

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

Toolchain.by_category reagrupa as ferramentas disponíveis nesses grupos.

from mainboard import Machine, ToolCategory

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

Como é sondado

A descoberta é orientada a dados. Um ToolProbe é uma receita imutável para encontrar uma ferramenta, e a tupla TOOL_PROBES no nível do módulo é o registro que Toolchain.probe() executa.

campo tipo significado
name str nome de exibição reportado no DetectedTool
category ToolCategory grupo de toolchain ao qual a ferramenta pertence
binaries tuple[str, ...] nomes de executáveis candidatos, testados em ordem até um estar no PATH
version_args tuple[str, ...] argumentos que fazem o binário imprimir sua versão, padrão ("--version",)
pattern re.Pattern[str] regex cujo primeiro grupo captura a versão na saída do comando

Para cada sondagem, vence o primeiro binário encontrado no PATH. A saída da versão é capturada e o primeiro grupo do pattern vira version. O registro padrão cobre gcc, clang, g++, clang++, nvcc, cmake, ninja, make e meson.

Estendendo o registro

Adicionar uma ferramenta é uma linha. Acrescente um ToolProbe a TOOL_PROBES e ele é descoberto na próxima sondagem, sem nenhuma mudança na lógica de descoberta.

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)

Uma ferramenta com um comando de versão fora do padrão define version_args e 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+)"),
)

Uma família inteiramente nova de ferramentas é um membro de ToolCategory mais suas sondagens, então o modelo cresce adicionando código em vez de editar o loop de sondagem.