slint-ui/slint · error

not found, needed by

Error message

${tool} not found, needed by: ${features}

What it means

check_tools in scripts/build-demo-images.py verifies that the flash/converter tool required by each selected board kind (from the CONVERTERS mapping) is available via shutil.which. If one or more tools are missing, it warns '<tool> not found, needed by: <features>' for each and aborts the whole run with a non-zero exit before building anything. This is a deliberate pre-flight gate so builds fail early with an actionable message.

Solutions

  1. Install the named tool and ensure it is on PATH (verify with which <tool>)
  2. Re-run with --only <features> to select only boards whose tools you have
  3. Fix PATH in the script's environment (CI: add tool install step)
  4. Check CONVERTERS mapping matches the tool name actually installed

Example fix

# before
python3 scripts/build-demo-images.py
# aborting: install the missing tools, or narrow the run with --only
# after
python3 scripts/build-demo-images.py --only esp32-s3-team-industrial-solution-board
Defensive patterns

Strategy: validation

Validate before calling

import shutil
missing = [t for t in set(CONVERTERS.values()) if t and not shutil.which(t)]
if missing:
    raise SystemExit(f"missing tools: {missing}; install them or use --only")

Prevention

When it happens

Trigger: Running scripts/build-demo-images.py (without --only narrowing) on a machine where a required tool such as a probe/flasher or image converter for a selected board kind is not installed or not on PATH.

Common situations: Fresh CI container or new dev machine missing the vendor flashing tools; tool installed via a version manager whose bin dir is not on PATH in the script's environment; requesting boards whose converter was never installed because only one target was needed.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of slint-ui/slint@bb937076de (2026-09-16). Data as JSON: /api/errors/e004e8c25665db7e. Report an issue: GitHub.

Appendix: source

Thrown at scripts/build-demo-images.py:212

        env["PATH"] = os.pathsep.join(
            entry for entry in env["PATH"].split(os.pathsep) if entry != uv_bin
        )
    return env


def check_tools(boards: list[Board]) -> None:
    """Abort before any build if a conversion tool the selected boards need is missing.

    The shell version warned here and then died mid-run, after minutes of cargo builds.
    """
    needed: dict[str, list[str]] = {}
    for board in boards:
        tool = CONVERTERS[board.kind]
        if tool and not shutil.which(tool):
            needed.setdefault(tool, []).append(board.feature)
    if needed:
        for tool, features in needed.items():
            warn(f"{tool} not found, needed by: {', '.join(features)}")
        sys.exit("aborting: install the missing tools, or narrow the run with --only")


def build_board(board: Board, out: Path) -> None:
    log(f"printerdemo_mcu: {board.feature} ({board.kind} / {board.target})")
    cargo = ["cargo"]
    env = build_env()
    if board.kind == "esp":
        cargo += ["+esp"]
    elif board.kind == "stm":
        # STM keeps Slint's textures in external OSPI flash (.slint_assets); otherwise
        # rodata overflows the internal flash. Only the stm32* boards define it.
        env = build_env(SLINT_ASSET_SECTION=".slint_assets")
    cargo += [
        "build",
        "--manifest-path",
        "demos/Cargo.toml",
        "-p",

View on GitHub (pinned to bb937076de)