AlexsJones/llmfit · error · FileNotFoundError

No compiled binary found. Checked: {c} Run 'make build' fi

Error message

No compiled binary found. Checked:
  {c}
Run 'make build' first.

What it means

Raised by LlmfitBinaryBuildHook._find_local_binary() during an editable install (uv sync / uv run / pip install -e). Editable builds do not use a --target directory; the hook checks target/debug/llmfit (from `make build` / `cargo build`) and then target/release/llmfit (from `make release`). If neither file exists it raises FileNotFoundError with both checked paths and the hint to run 'make build'.

Source

Thrown at llmfit-python/hatch_build.py:133

            )
        return bin_path

    @staticmethod
    def _find_local_binary(llmfit_root: Path) -> Path:
        """Find the locally compiled binary in default Cargo output locations.

        Checks ``target/debug/`` first (from ``make build``), then
        ``target/release/`` (from ``make release``).
        """
        binary_name = "llmfit.exe" if sys.platform == "win32" else "llmfit"
        candidates = [
            llmfit_root / "target" / "debug" / binary_name,
            llmfit_root / "target" / "release" / binary_name,
        ]
        for candidate in candidates:
            if candidate.is_file():
                return candidate
        raise FileNotFoundError(
            "No compiled binary found. Checked:\n"
            + "\n".join(f"  {c}" for c in candidates)
            + "\nRun 'make build' first.",
        )

    @staticmethod
    def _check_binary_version(bin_path: Path, expected_version: str) -> None:
        """Run the binary with ``--version`` and verify it matches the expected version.

        Raises ``RuntimeError`` on a mismatch — this indicates a stale build.
        """
        result = subprocess.run(
            [str(bin_path), "--version"],
            capture_output=True,
            check=True,
            text=True,
            timeout=5,
        )

View on GitHub (pinned to acc7e40c3a)

Solutions

  1. Run `make build` (or `cargo build`) in the repository root, then retry the editable install
  2. If you want the optimized binary for daily use, run `make release` instead — the release binary is also accepted
  3. Verify the artifact exists: `ls target/debug/llmfit target/release/llmfit` — one of them must be present (llmfit.exe on Windows)

Example fix

# before
uv sync
# => FileNotFoundError: No compiled binary found. Checked: target/debug/llmfit, target/release/llmfit

# after
make build
uv sync
Defensive patterns

Strategy: validation

Validate before calling

import sys
from pathlib import Path
name = "llmfit.exe" if sys.platform == "win32" else "llmfit"
candidates = [Path("target/debug") / name, Path("target/release") / name]
if not any(c.is_file() for c in candidates):
    raise SystemExit("no local binary — run `make build` (or `cargo build`) before `uv sync`/editable install")

Try / catch

try:
    bin_path = hook._find_local_binary(root)
except FileNotFoundError as e:
    raise SystemExit(f"run `make build` first, then retry: {e}")

Prevention

When it happens

Trigger: Cloning the repo and running `uv sync` or `uv run --project llmfit-python pytest` before any `cargo build`; after `cargo clean`; or after a fresh checkout in CI where the Rust build step was skipped or failed earlier in the pipeline.

Common situations: New contributor onboarding (installing the Python wrapper before building Rust); CI cache eviction of target/; switching branches after a cargo clean; `make build` failed silently in a previous step and the job continued.

Related errors


AI-assisted analysis of AlexsJones/llmfit@acc7e40c3a (2026-08-17). Data as JSON: /api/errors/dcbe65be1e37838b. Report an issue: GitHub.