arduino/Arduino · error · RunnerException

Could not find tool {0}

Error message

Could not find tool {0}

What it means

After checking any 'package:tool' qualified reference, burnBootloader resolves the plain tool name against the current target platform. If the platform defines no such tool (empty PreferencesMap), this RunnerException is thrown. The tool needed to burn the bootloader is simply not available for the selected board's platform.

Source

Thrown at arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java:358

    if (boardPreferences != null) {
      prefs.putAll(boardPreferences);
    }
    prefs.putAll(programmerPrefs);

    // Create configuration for bootloader tool
    PreferencesMap toolPrefs = new PreferencesMap();
    String tool = prefs.getOrExcept("bootloader.tool");
    if (tool.contains(":")) {
      String[] split = tool.split(":", 2);
      TargetPlatform platform = BaseNoGui.getCurrentTargetPlatformFromPackage(split[0]);
      tool = split[1];
      toolPrefs.putAll(platform.getTool(tool));
      if (toolPrefs.size() == 0)
        throw new RunnerException(I18n.format(tr("Could not find tool {0} from package {1}"), tool, split[0]));
    }
    toolPrefs.putAll(targetPlatform.getTool(tool));
    if (toolPrefs.size() == 0)
      throw new RunnerException(I18n.format(tr("Could not find tool {0}"), tool));

    // Merge tool with global configuration
    prefs.putAll(toolPrefs);
    if (verbose) {
      prefs.put("erase.verbose", prefs.getOrExcept("erase.params.verbose"));
      prefs.put("bootloader.verbose", prefs.getOrExcept("bootloader.params.verbose"));
    } else {
      prefs.put("erase.verbose", prefs.getOrExcept("erase.params.quiet"));
      prefs.put("bootloader.verbose", prefs.getOrExcept("bootloader.params.quiet"));
    }

    new LoadVIDPIDSpecificPreferences().load(prefs);

    if (!runCommand("erase.pattern", prefs))
      return false;

    return runCommand("bootloader.pattern", prefs);
  }

View on GitHub (pinned to a0df6e0e83)

Solutions

  1. Reinstall the board package via Boards Manager so its bundled tool (e.g. avrdude) is present in the hardware folder
  2. Correct the tool name in boards.txt/platform.txt to match an existing tool entry in the platform
  3. Check the hardware folder (e.g. hardware/arduino/avr/tools/) actually contains the tool and platform.txt declares it

Example fix

// platform.txt missing tool entry
// after adding proper tool definition and reference:
name=Arduino AVR Boards
compiler.path={runtime.tools.avrdude.path}/bin/avrdude
tool=avrdude
Defensive patterns

Strategy: validation

Validate before calling

String tool = prefs.get("bootloader.tool");
boolean available = targetPlatform.getTool(tool) != null && targetPlatform.getTool(tool).size() > 0;
if (!available) throw new IllegalStateException("Tool " + tool + " missing from platform; reinstall the board package");

Try / catch

try { uploader.burnBootloader(); } catch (RunnerException e) { if (e.getMessage().startsWith("Could not find tool")) { reinstallBoardPackage(); } else { throw e; } }

Prevention

When it happens

Trigger: burnBootloader with a tool preference naming a tool that is not defined in the current target platform's platform.txt (e.g. a custom tool name, or the platform is missing the bundled upload tool).

Common situations: Manually installed/hand-copied hardware folders missing the tools directory; upgraded core where the tool was renamed (e.g. avrdude version dirs) leaving a stale tool reference; broken or partial download of a board package.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


AI-assisted analysis of arduino/Arduino@a0df6e0e83 (2026-09-06). Data as JSON: /api/errors/54d795d2a29686f6. Report an issue: GitHub.