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
- Reinstall the board package via Boards Manager so its bundled tool (e.g. avrdude) is present in the hardware folder
- Correct the tool name in boards.txt/platform.txt to match an existing tool entry in the platform
- 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
- Never hand-copy hardware folders; use Boards Manager for complete packages
- Check hardware/<pkg>/<arch>/tools/ exists and platform.txt declares the tool
- Keep board packages updated after core upgrades
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
- Could not find tool {0} from package {1}
- Board is not selected
- Tool {0} is not available for your operating system.
- Unable to understand proxy settings
- No valid hardware definitions found in folder {0}.
AI-assisted analysis of arduino/Arduino@a0df6e0e83 (2026-09-06).
Data as JSON: /api/errors/54d795d2a29686f6.
Report an issue: GitHub.