diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributedPlatform.java b/arduino-core/src/cc/arduino/contributions/packages/ContributedPlatform.java index 1063b676a32..52305e66468 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributedPlatform.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributedPlatform.java @@ -80,6 +80,7 @@ public void resolveToolsDependencies(Collection packages) { if (tool == null) { System.err.println("Index error: could not find referenced tool " + dep); } else { + tool.usetUserArchitecture(this.getParentPackage().getName()+"."+this.getArchitecture()); resolvedToolReferences.put(dep, tool); } } diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java b/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java index 28d81771722..370177f0dd9 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributedTool.java @@ -32,6 +32,7 @@ import cc.arduino.contributions.DownloadableContribution; import processing.app.Platform; +import java.util.LinkedList; import java.util.List; public abstract class ContributedTool { @@ -42,6 +43,20 @@ public abstract class ContributedTool { public abstract List getSystems(); + private LinkedList users = null; + public void usetUserArchitecture(String vendorAndArch) { + if (users == null) { + users = new LinkedList<>(); + } + if (!users.contains(vendorAndArch)) { + users.add(vendorAndArch); + } + } + + public List ugetUserArchitectures() { + return users; + } + public DownloadableContribution getDownloadableContribution(Platform platform) { for (HostDependentDownloadableContribution c : getSystems()) { if (c.isCompatible(platform)) diff --git a/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java index 1bc5befe4b4..5e8c58934f3 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java @@ -93,7 +93,8 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String pattern = prefs.get("upload.network_pattern"); if(pattern == null) pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String arch = targetPlatform.getContainerPackage().getId()+"."+targetPlatform.getId(); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, arch, true); uploadResult = executeUploadCommand(cmd); } catch (RunnerException e) { throw e; diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java index aa9ac4c07c6..b620fa1044b 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -110,7 +110,8 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String boolean uploadResult; try { String pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String arch = targetPlatform.getContainerPackage().getId()+"."+targetPlatform.getId(); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, arch, true); uploadResult = executeUploadCommand(cmd); } catch (Exception e) { throw new RunnerException(e); @@ -204,8 +205,10 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String boolean uploadResult; try { + // Architecture field formatted as "arduino.avr" to prepend runtime vars String pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String arch = targetPlatform.getContainerPackage().getId()+"."+targetPlatform.getId(); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, arch, true); uploadResult = executeUploadCommand(cmd); } catch (RunnerException e) { throw e; @@ -341,7 +344,8 @@ private boolean uploadUsingProgrammer(String buildPath, String className) throws // } String pattern = prefs.getOrExcept("program.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String arch = targetPlatform.getContainerPackage().getId()+"."+targetPlatform.getId(); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, arch, true); return executeUploadCommand(cmd); } catch (RunnerException e) { throw e; @@ -404,12 +408,13 @@ public boolean burnBootloader() throws Exception { new LoadVIDPIDSpecificPreferences().load(prefs); String pattern = prefs.getOrExcept("erase.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String arch = targetPlatform.getContainerPackage().getId()+"."+targetPlatform.getId(); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, arch, true); if (!executeUploadCommand(cmd)) return false; pattern = prefs.getOrExcept("bootloader.pattern"); - cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + cmd = StringReplacer.formatAndSplit(pattern, prefs, arch, true); return executeUploadCommand(cmd); } } diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java index 8ddb29cdc5c..6c423fd9b89 100644 --- a/arduino-core/src/processing/app/BaseNoGui.java +++ b/arduino-core/src/processing/app/BaseNoGui.java @@ -862,6 +862,10 @@ public static void createToolPreferences(Collection installedTo } PreferencesData.set(prefix + tool.getName() + ".path", absolutePath); PreferencesData.set(prefix + tool.getName() + "-" + tool.getVersion() + ".path", absolutePath); + for (String userArch : tool.ugetUserArchitectures()) { + PreferencesData.set(prefix + tool.getName() + ".path." + userArch, absolutePath); + PreferencesData.set(prefix + tool.getName() + "-" + tool.getVersion() + ".path." + userArch, absolutePath); + } } } diff --git a/arduino-core/src/processing/app/helpers/StringReplacer.java b/arduino-core/src/processing/app/helpers/StringReplacer.java index fae77155aef..18bb9154efb 100644 --- a/arduino-core/src/processing/app/helpers/StringReplacer.java +++ b/arduino-core/src/processing/app/helpers/StringReplacer.java @@ -29,12 +29,17 @@ public class StringReplacer { public static String[] formatAndSplit(String src, Map dict, boolean recursive) throws Exception { + return formatAndSplit(src, dict, "", recursive); + } + + public static String[] formatAndSplit(String src, Map dict, String arch, + boolean recursive) throws Exception { String res; // Recursive replace with a max depth of 10 levels. for (int i = 0; i < 10; i++) { // Do a replace with dictionary - res = StringReplacer.replaceFromMapping(src, dict); + res = StringReplacer.replaceFromMapping(src, dict, arch); if (!recursive) break; if (res.equals(src)) @@ -85,16 +90,30 @@ public static String[] quotedSplit(String src, String quoteChars, return res.toArray(new String[0]); } + public static String replaceFromMapping(String src, Map map, String arch) { + return replaceFromMapping(src, map, "{", "}", arch); + } + public static String replaceFromMapping(String src, Map map) { - return replaceFromMapping(src, map, "{", "}"); + return replaceFromMapping(src, map, "{", "}", ""); } public static String replaceFromMapping(String src, Map map, String leftDelimiter, - String rightDelimiter) { + String rightDelimiter, + String footer) { for (Map.Entry entry : map.entrySet()) { String keyword = leftDelimiter + entry.getKey() + rightDelimiter; - if (entry.getValue() != null && keyword != null) { + String value = null; + + // if {entry.getKey()+"."+footer} key exists, use it instead + if (map.containsKey(entry.getKey()+"."+footer)) { + value = map.get(entry.getKey()+"."+footer); + } else { + value = entry.getValue(); + } + + if (value != null && keyword != null) { src = src.replace(keyword, entry.getValue()); } }