arduino/Arduino · error · RunnerException

Could not find tool {0} from package {1}

Error message

Could not find tool {0} from package {1}

What it means

When the burn-bootloader tool preference specifies a tool qualified with a package name ('package:tool'), burnBootloader resolves it against that package's target platform. If the platform defines no tool with that name (platform.getTool returns an empty PreferencesMap), this RunnerException is thrown. It means the referenced tool does not exist in the named package.

Source

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

    // Build configuration for the current programmer
    PreferencesMap prefs = PreferencesData.getMap();
    PreferencesMap boardPreferences = BaseNoGui.getBoardPreferences();
    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))

View on GitHub (pinned to a0df6e0e83)

Solutions

  1. Install the missing tool/package via Boards Manager (or place the tool under the package's tools/ directory) so platform.getTool finds it
  2. Fix the tool reference in boards.txt/platform.txt so 'package:tool' matches a tool actually defined in that package's platform.txt (check exact tool name and version)
  3. Fall back to an unqualified tool name present in the current target platform

Example fix

// boards.txt before
tool=arduino:avrdud
// after
tool=arduino:avrdude
Defensive patterns

Strategy: validation

Validate before calling

String toolPref = prefs.get("bootloader.tool");
if (toolPref != null && toolPref.contains(":")) {
  String pkg = toolPref.split(":", 2)[0];
  if (BaseNoGui.getCurrentTargetPlatformFromPackage(pkg) == null) throw new IllegalStateException("Package " + pkg + " not installed; install it via Boards Manager");
}

Try / catch

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

Prevention

When it happens

Trigger: The bootloader/tool preference in boards.txt or platform.txt uses a 'package:tool' reference (e.g. 'arduino:avrdude') whose package's platform does not define that tool, typically because the package is not installed or the tool name is misspelled.

Common situations: Third-party board definitions referencing an 'arduino:avrdude'-style tool while only a differently named tool version exists; board package installed without its required tool dependency; renaming of tools across IDE/core versions.

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/d7955cd5ca653174. Report an issue: GitHub.