コンテンツにスキップ

Toolchain

Machine.toolchain は、スナップショットにも含まれており、ホストの PATH 上にある C、C++、CUDA コンパイラとビルドシステムを報告します。これにより、ツールは自分でコマンドを実行することなく、マシンの実際のビルド能力を知ることができます。

from mainboard import Machine

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

実際に PATH 上にあるツールだけが保持されるため、リストはホストが本当に実行できるものを反映します。各ツールは登録順を保ち、カテゴリごとにグループ化されます。

スナップショット内

Machine().model_dump_json()toolchain フィールドは、利用可能なすべてのツールを列挙します。

{
  "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
    }
  ]
}

ツールが存在していてもバージョン出力を解析できない場合、versionnull になります。

DetectedTool

tools の各エントリは、1 回の探査の構造化された結果である DetectedTool です。

フィールド 意味
name str ツールの表示名、例 gcccmake
category ToolCategory ツールが属するツールチェーングループ
path str \| None 解決されたバイナリの絶対パス、PATH 上にない場合は None
version str \| None 解析されたバージョン文字列、存在しないか解析不能な場合は None
available bool バイナリが PATH 上で見つかったかどうか

ToolCategory

ToolCategory は各ツールをグループに分類する StrEnum です。

メンバー
C_COMPILER c-compiler
CXX_COMPILER cxx-compiler
CUDA_COMPILER cuda-compiler
BUILD_SYSTEM build-system

Toolchain.by_category は、利用可能なツールをこれらのグループに再編成します。

from mainboard import Machine, ToolCategory

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

探査の仕組み

検出はデータ駆動です。ToolProbe は 1 つのツールを見つけるための不変のレシピであり、モジュールレベルの TOOL_PROBES タプルが Toolchain.probe() の実行するレジストリです。

フィールド 意味
name str DetectedTool に報告される表示名
category ToolCategory ツールが属するツールチェーングループ
binaries tuple[str, ...] 候補となる実行ファイル名。PATH 上に見つかるまで順に試行される
version_args tuple[str, ...] バイナリにバージョンを出力させる引数、デフォルトは ("--version",)
pattern re.Pattern[str] コマンド出力からバージョンを最初のグループで捕捉する正規表現

各探査では、PATH 上で最初に見つかったバイナリが採用されます。そのバージョン出力が取得され、pattern の最初のグループが version になります。デフォルトのレジストリは gcc、clang、g++、clang++、nvcc、cmake、ninja、make、meson をカバーします。

レジストリの拡張

ツールの追加は 1 行です。TOOL_PROBESToolProbe を追加するだけで、検出ロジックを変更することなく次の探査で検出されます。

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)

標準的でないバージョンコマンドを持つツールは、version_argspattern を設定します。

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+)"),
)

まったく新しいツールのファミリーは、1 つの ToolCategory メンバーとその探査だけで構成されます。したがってモデルは、探査ループを編集するのではなく、コードを追加することで成長します。