1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-02-26 20:54:22 +01:00

IDE: various refactoring to make sam hardware compiling.

This commit is contained in:
Cristian Maglie 2011-09-23 04:47:41 +02:00
parent 02c76ff87b
commit 3681035869
5 changed files with 214 additions and 254 deletions

View File

@ -1841,7 +1841,7 @@ public class Editor extends JFrame implements RunnerListener {
public void run() {
try {
sketch.prepare();
String appletClassName = sketch.build(false);
sketch.build(false);
statusNotice("Done compiling.");
} catch (Exception e) {
statusError(e);
@ -1856,7 +1856,7 @@ public class Editor extends JFrame implements RunnerListener {
public void run() {
try {
sketch.prepare();
String appletClassName = sketch.build(true);
sketch.build(true);
statusNotice("Done compiling.");
} catch (Exception e) {
statusError(e);

View File

@ -32,15 +32,11 @@ import processing.app.preproc.*;
import processing.core.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.text.MessageFormat;
import java.util.*;
import java.util.zip.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
/**
@ -1512,17 +1508,50 @@ public class Sketch {
// run the preprocessor
String primaryClassName = preprocess(buildPath);
Map<String, String> config = new HashMap<String, String>();
mergeMapsAndRemoveNulls(Preferences.getMap(), config);
Map<String, String> boardPrefs = Base.getBoardPreferences();
// Check for null platform, and use system default if not found
String platform = boardPrefs.get("platform");
if (platform == null)
mergeMapsAndRemoveNulls(Base.getPlatformPreferences(), config);
else
mergeMapsAndRemoveNulls(Base.getPlatformPreferences(platform), config);
mergeMapsAndRemoveNulls(boardPrefs, config);
String toolchainPath = config.get("compiler.path");
if (toolchainPath == null) {
toolchainPath = Base.getAvrBasePath();
} else {
// Put in the system path in the compiler path if available
String basePath = System.getProperty("user.dir");
if (Base.isMacOS())
basePath += "/Arduino.app/Contents/Resources/Java";
Object[] args = { basePath };
toolchainPath = new MessageFormat(toolchainPath).format(args);
}
config.put("compiler.path", toolchainPath);
// compile the program. errors will happen as a RunnerException
// that will bubble up to whomever called build().
Compiler compiler = new Compiler();
Compiler compiler = new Compiler(config);
if (compiler.compile(this, buildPath, primaryClassName, verbose)) {
size(buildPath, primaryClassName);
size(buildPath, primaryClassName, config);
return primaryClassName;
}
return null;
}
private void mergeMapsAndRemoveNulls(Map<String, String> src,
Map<String, String> dst) {
for (String k : src.keySet()) {
String v = src.get(k);
if (v == null)
v = "";
dst.put(k, v);
}
}
protected boolean exportApplet(boolean usingProgrammer) throws Exception {
return exportApplet(tempBuildFolder.getAbsolutePath(), usingProgrammer);
}
@ -1574,13 +1603,14 @@ public class Sketch {
}
protected void size(String buildPath, String suggestedClassName)
throws RunnerException {
protected void size(String buildPath, String suggestedClassName,
Map<String, String> prefs) throws RunnerException {
long size = 0;
String maxsizeString = Base.getBoardPreferences().get("upload.maximum_size");
if (maxsizeString == null) return;
String maxsizeString = prefs.get("upload.maximum_size");
if (maxsizeString == null)
return;
long maxsize = Integer.parseInt(maxsizeString);
Sizer sizer = new Sizer(buildPath, suggestedClassName);
Sizer sizer = new Sizer(buildPath, suggestedClassName, prefs);
try {
size = sizer.computeSize();
System.out.println("Binary sketch size: " + size + " bytes (of a " +

View File

@ -28,14 +28,10 @@ import java.io.FilenameFilter;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import processing.app.Base;
import processing.app.Preferences;
import processing.app.Sketch;
import processing.app.SketchCode;
import processing.core.PApplet;
@ -62,15 +58,15 @@ public class Compiler implements MessageConsumer {
Map<String, String> configPreferences;
Map<String, String> boardPreferences;
Map<String, String> platformPreferences;
String avrBasePath;
List<File> objectFiles;
public Compiler() {
public Compiler(Map<String, String> preferences) {
// Merge all the preferences file in the correct order of precedence
// into a new map.
configPreferences = preferences;
avrBasePath = configPreferences.get("compiler.path");
}
/**
@ -95,40 +91,8 @@ public class Compiler implements MessageConsumer {
this.verbose = verbose;
objectFiles = new ArrayList<File>();
// the pms object isn't used for anything but storage
// MessageStream pms = new MessageStream(this);
Map<String, String> boardPreferences = Base.getBoardPreferences();
// System.out.println("-> compiler.java is doing stuff");
// Check for null platform, and use system default if not found
platform = boardPreferences.get("platform");
if (platform == null)
platformPreferences = new HashMap(Base.getPlatformPreferences());
else
platformPreferences = new HashMap(Base.getPlatformPreferences(platform));
System.out.println("-> compiler.java is doing stuff");
// Put all the global preference configuration into one Master
// configpreferences
configPreferences = mergePreferences(Preferences.getMap(),
platformPreferences, boardPreferences);
avrBasePath = configPreferences.get("compiler.path");
if (avrBasePath == null) {
avrBasePath = Base.getAvrBasePath();
// System.out.println("avrBasePath: " + avrBasePath);
} else {
// System.out.println("avrBasePath:exists: " + avrBasePath);
// Put in the system path in the compiler path if available
String basePath = System.getProperty("user.dir");
if (Base.isMacOS()) {
// logger.debug("basePath: " + basePath);
basePath += "/Arduino.app/Contents/Resources/Java";
}
Object[] Args = { basePath };
avrBasePath = new MessageFormat(avrBasePath).format(Args);
// System.out.println("avrBasePath:new: " + avrBasePath);
}
board = configPreferences.get("board");
if (board == "")
board = "_UNKNOWN";
@ -148,7 +112,6 @@ public class Compiler implements MessageConsumer {
target = Base.getTarget();
coreFolder = new File(new File(target.getFolder(), "cores"), core);
corePath = coreFolder.getAbsolutePath();
systemPath = new File(target.getFolder(), "system").getAbsolutePath();
} else {
target = Base.targetsTable.get(core.substring(0, core.indexOf(':')));
@ -501,20 +464,24 @@ public class Compiler implements MessageConsumer {
String objectName,
Map<String, String> configPreferences) {
System.out.println("getCommandCompilerS: start");
String baseCommandString = configPreferences.get("recipe.cpp.o.pattern");
MessageFormat compileFormat = new MessageFormat(baseCommandString);
String recipe = configPreferences.get("recipe.cpp.o.pattern");
MessageFormat compileFormat = new MessageFormat(recipe);
// getIncludes to String
String includes = preparePaths(includePaths);
Object[] Args = { avrBasePath, configPreferences.get("compiler.cpp.cmd"),
configPreferences.get("compiler.S.flags"),
configPreferences.get("compiler.cpudef"),
configPreferences.get("build.mcu"),
configPreferences.get("build.f_cpu"),
configPreferences.get("software"), Base.REVISION, includes, sourceName,
objectName };
String args[] = new String[11];
args[0] = avrBasePath;
args[1] = configPreferences.get("compiler.cpp.cmd");
args[2] = configPreferences.get("compiler.S.flags");
args[3] = configPreferences.get("compiler.cpudef");
args[4] = configPreferences.get("build.mcu");
args[5] = configPreferences.get("build.f_cpu");
args[6] = configPreferences.get("software");
args[7] = "" + Base.REVISION;
args[8] = preparePaths(includePaths);
args[9] = sourceName;
args[10] = objectName;
String command = compileFormat.format(Args);
String command = compileFormat.format(args);
String[] commandArray = command.split("\\|");
return commandArray;
}
@ -553,21 +520,21 @@ public class Compiler implements MessageConsumer {
// getIncludes to String
String includes = preparePaths(includePaths);
Object[] Args = { avrBasePath, // 0
configPreferences.get("compiler.c.cmd"), // 1
configPreferences.get("compiler.c.flags"), // 2
configPreferences.get("compiler.cpudef"), // 3
configPreferences.get("build.mcu"), // 4
configPreferences.get("build.f_cpu"), // 5
configPreferences.get("software"), // 6
Base.REVISION, // 7
includes, // 8
sourceName, // 9
objectName, // 10
configPreferences.get("build.extra_flags") // 11
};
String[] args = new String[12];
args[0] = avrBasePath;
args[1] = configPreferences.get("compiler.c.cmd");
args[2] = configPreferences.get("compiler.c.flags");
args[3] = configPreferences.get("compiler.cpudef");
args[4] = configPreferences.get("build.mcu");
args[5] = configPreferences.get("build.f_cpu");
args[6] = configPreferences.get("software");
args[7] = "" + Base.REVISION;
args[8] = includes;
args[9] = sourceName;
args[10] = objectName;
args[11] = configPreferences.get("build.extra_flags");
String command = compileFormat.format(Args);
String command = compileFormat.format(args);
String[] commandArray = command.split("\\|");
return commandArray;
}
@ -607,21 +574,21 @@ public class Compiler implements MessageConsumer {
// getIncludes to String
String includes = preparePaths(includePaths);
Object[] Args = { avrBasePath, // 0
configPreferences.get("compiler.cpp.cmd"), // 1
configPreferences.get("compiler.cpp.flags"), // 2
configPreferences.get("compiler.cpudef"), // 3
configPreferences.get("build.mcu"), // 4
configPreferences.get("build.f_cpu"), // 5
configPreferences.get("software"), // 6
Base.REVISION, // 7
includes, // 8
sourceName, // 9
objectName, // 10
configPreferences.get("build.extra_flags") // 11
};
String[] args = new String[12];
args[0] = avrBasePath;
args[1] = configPreferences.get("compiler.cpp.cmd");
args[2] = configPreferences.get("compiler.cpp.flags");
args[3] = configPreferences.get("compiler.cpudef");
args[4] = configPreferences.get("build.mcu");
args[5] = configPreferences.get("build.f_cpu");
args[6] = configPreferences.get("software");
args[7] = "" + Base.REVISION;
args[8] = includes;
args[9] = sourceName;
args[10] = objectName;
args[11] = configPreferences.get("build.extra_flags");
String command = compileFormat.format(Args);
String command = compileFormat.format(args);
String[] commandArray = command.split("\\|");
// System.out.println("command:" + command);
@ -658,7 +625,7 @@ public class Compiler implements MessageConsumer {
static public ArrayList<File> findFilesInPath(String path, String extension,
boolean recurse) {
System.out.println("findFilesInPath: " + path);
// System.out.println("findFilesInPath: " + path);
return findFilesInFolder(new File(path), extension, recurse);
}
@ -690,11 +657,10 @@ public class Compiler implements MessageConsumer {
List<String> includePaths,
Map<String, String> configPreferences)
throws RunnerException {
System.out.println("compileSketch: start");
System.out.println("includePaths: ");
for (int i = 0; i < includePaths.size(); i++) {
System.out.println("-I" + (String) includePaths.get(i));
}
// System.out.println("compileSketch: start");
// System.out.println("includePaths: ");
// for (int i = 0; i < includePaths.size(); i++)
// System.out.println("-I" + (String) includePaths.get(i));
// logger.debug("compileSketch: start");
objectFiles.addAll(compileFiles(avrBasePath, buildPath, includePaths,
@ -732,7 +698,7 @@ public class Compiler implements MessageConsumer {
false),
findFilesInFolder(libraryFolder, "cpp",
false),
boardPreferences));
configPreferences));
outputFolder = new File(outputFolder, "utility");
createFolder(outputFolder);
objectFiles.addAll(compileFiles(avrBasePath, outputFolder
@ -742,7 +708,7 @@ public class Compiler implements MessageConsumer {
false),
findFilesInFolder(utilityFolder, "cpp",
false),
boardPreferences));
configPreferences));
// other libraries should not see this library's utility/ folder
includePaths.remove(includePaths.size() - 1);
}
@ -762,7 +728,6 @@ public class Compiler implements MessageConsumer {
// for (int i = 0; i < includePaths.size(); i++)
// System.out.println("-I" + includePaths.get(i));
String commandString = "";
// System.out.println("corePath: " + corePath);
List<String> srcDirs = new ArrayList<String>();
srcDirs.add(corePath);
@ -771,32 +736,29 @@ public class Compiler implements MessageConsumer {
srcDirs.addAll(variantExtraSrc);
List<File> objects = new ArrayList<File>();
for (String dir : srcDirs) {
for (String dir : srcDirs)
objects.addAll(compileFiles(avrBasePath, buildPath, includePaths,
findFilesInPath(dir, "S", false),
findFilesInPath(dir, "c", false),
findFilesInPath(dir, "cpp", false),
configPreferences));
}
for (File file : objects) {
// List commandAR = new ArrayList(baseCommandAR);
// commandAR = commandAR + file.getAbsolutePath();
Object[] Args = { avrBasePath, // 0
configPreferences.get("compiler.ar.cmd"), // 1
configPreferences.get("compiler.ar.flags"), // 2
// corePath,
buildPath + File.separator, "core.a", // 3
// objectName
file.getAbsolutePath() // 4
};
String[] args = new String[6];
args[0] = avrBasePath;
args[1] = configPreferences.get("compiler.ar.cmd");
args[2] = configPreferences.get("compiler.ar.flags");
args[3] = buildPath + File.separator;
args[4] = "core.a";
args[5] = file.getAbsolutePath();
// System.out.println("compileCore(...) substitute");
String baseCommandString = configPreferences.get("recipe.ar.pattern");
MessageFormat compileFormat = new MessageFormat(baseCommandString);
commandString = compileFormat.format(Args);
String commandString = compileFormat.format(args);
String[] commandArray = commandString.split("\\|");
execAsynchronously(commandArray);
@ -808,32 +770,31 @@ public class Compiler implements MessageConsumer {
List<String> includePaths, String pinsPath,
Map<String, String> configPreferences)
throws RunnerException {
System.out.println("compileLink: start");
String baseCommandString = configPreferences
.get("recipe.c.combine.pattern");
String commandString = "";
MessageFormat compileFormat = new MessageFormat(baseCommandString);
String objectFileList = "";
// System.out.println("compileLink: start");
String recipe = configPreferences.get("recipe.c.combine.pattern");
MessageFormat compileFormat = new MessageFormat(recipe);
for (File file : objectFiles) {
String objectFileList = "";
for (File file : objectFiles)
objectFileList = objectFileList + file.getAbsolutePath() + "|";
}
System.out.println("objectFileList: " + objectFileList);
Object[] Args = { avrBasePath, // 0
configPreferences.get("compiler.c.elf.cmd"), // 1
configPreferences.get("compiler.c.elf.flags"), // 2
configPreferences.get("compiler.cpudef"), // 3
configPreferences.get("build.mcu"), // 4
buildPath + File.separator, // 5
primaryClassName, // 6
objectFileList, // 7
buildPath + File.separator + "core.a", // 8
buildPath, // 9
corePath, // 10
pinsPath + File.separator + configPreferences.get("build.ldscript") // 11
};
commandString = compileFormat.format(Args);
String args[] = new String[12];
args[0] = avrBasePath;
args[1] = configPreferences.get("compiler.c.elf.cmd");
args[2] = configPreferences.get("compiler.c.elf.flags");
args[3] = configPreferences.get("compiler.cpudef");
args[4] = configPreferences.get("build.mcu");
args[5] = buildPath + File.separator;
args[6] = primaryClassName;
args[7] = objectFileList;
args[8] = buildPath + File.separator + "core.a";
args[9] = buildPath;
args[10] = corePath;
args[11] = pinsPath + File.separator
+ configPreferences.get("build.ldscript");
String commandString = compileFormat.format(args);
String[] commandArray = commandString.split("\\|");
execAsynchronously(commandArray);
}
@ -843,18 +804,19 @@ public class Compiler implements MessageConsumer {
List<String> includePaths,
Map<String, String> configPreferences) throws RunnerException {
// logger.debug("compileEep: start");
String baseCommandString = configPreferences
.get("recipe.objcopy.eep.pattern");
String commandString = "";
MessageFormat compileFormat = new MessageFormat(baseCommandString);
String objectFileList = "";
String recipe = configPreferences.get("recipe.objcopy.eep.pattern");
if (recipe.trim().isEmpty())
return;
MessageFormat compileFormat = new MessageFormat(recipe);
Object[] Args = { avrBasePath,
configPreferences.get("compiler.objcopy.cmd"),
configPreferences.get("compiler.objcopy.eep.flags"),
buildPath + File.separator + primaryClassName,
buildPath + File.separator + primaryClassName };
commandString = compileFormat.format(Args);
String[] args = new String[5];
args[0] = avrBasePath;
args[1] = configPreferences.get("compiler.objcopy.cmd");
args[2] = configPreferences.get("compiler.objcopy.eep.flags");
args[3] = buildPath + File.separator + primaryClassName;
args[4] = buildPath + File.separator + primaryClassName;
String commandString = compileFormat.format(args);
String[] commandArray = commandString.split("\\|");
execAsynchronously(commandArray);
}
@ -864,71 +826,21 @@ public class Compiler implements MessageConsumer {
List<String> includePaths,
Map<String, String> configPreferences) throws RunnerException {
// logger.debug("compileHex: start");
String baseCommandString = configPreferences
.get("recipe.objcopy.hex.pattern");
String commandString = "";
MessageFormat compileFormat = new MessageFormat(baseCommandString);
String objectFileList = "";
String recipe = configPreferences.get("recipe.objcopy.hex.pattern");
MessageFormat compileFormat = new MessageFormat(recipe);
Object[] Args = { avrBasePath,
configPreferences.get("compiler.elf2hex.cmd"),
configPreferences.get("compiler.elf2hex.flags"),
buildPath + File.separator + primaryClassName,
buildPath + File.separator + primaryClassName };
commandString = compileFormat.format(Args);
String[] args = new String[5];
args[0] = avrBasePath;
args[1] = configPreferences.get("compiler.elf2hex.cmd");
args[2] = configPreferences.get("compiler.elf2hex.flags");
args[3] = buildPath + File.separator + primaryClassName;
args[4] = buildPath + File.separator + primaryClassName;
String commandString = compileFormat.format(args);
String[] commandArray = commandString.split("\\|");
execAsynchronously(commandArray);
}
// merge all the preferences file in the correct order of precedence
HashMap mergePreferences(Map Preferences, Map platformPreferences,
Map boardPreferences) {
HashMap _map = new HashMap();
Iterator iterator = Preferences.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry pair = (Map.Entry) iterator.next();
if (pair.getValue() == null) {
_map.put(pair.getKey(), "");
} else {
_map.put(pair.getKey(), pair.getValue());
}
}
// logger.debug("Done: Preferences");
iterator = platformPreferences.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry pair = (Map.Entry) iterator.next();
if (pair.getValue() == null) {
_map.put(pair.getKey(), "");
} else {
_map.put(pair.getKey(), pair.getValue());
}
// System.out.println(pair.getKey() + " = " + pair.getValue());
}
// System.out.println("Done: platformPreferences");
iterator = boardPreferences.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry pair = (Map.Entry) iterator.next();
if (pair.getValue() == null) {
_map.put(pair.getKey(), "");
} else {
_map.put(pair.getKey(), pair.getValue());
}
// System.out.println(pair.getKey() + " = " + pair.getValue());
}
// System.out.println("Done: boardPreferences");
return _map;
}
// getIncludes to String
private static String preparePaths(List<String> includePaths) {
String includes = "";

View File

@ -1,67 +1,77 @@
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Sizer - computes the size of a .hex file
Part of the Arduino project - http://www.arduino.cc/
Sizer - computes the size of a .hex file
Part of the Arduino project - http://www.arduino.cc/
Copyright (c) 2006 David A. Mellis
Copyright (c) 2006 David A. Mellis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
$Id$
*/
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
$Id$
*/
package processing.app.debug;
import processing.app.Base;
import java.io.*;
import java.util.*;
import java.io.File;
import java.text.MessageFormat;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
public class Sizer implements MessageConsumer {
private String buildPath, sketchName;
private String firstLine;
private long size;
private RunnerException exception;
public Sizer(String buildPath, String sketchName) {
private Map<String, String> prefs;
public Sizer(String buildPath, String sketchName,
Map<String, String> prefs) {
this.buildPath = buildPath;
this.sketchName = sketchName;
this.prefs = prefs;
}
public long computeSize() throws RunnerException {
String avrBasePath = Base.getAvrBasePath();
String commandSize[] = new String[] {
avrBasePath + "avr-size",
" "
};
commandSize[1] = buildPath + File.separator + sketchName + ".hex";
String args[] = new String[3];
args[0] = prefs.get("compiler.path");
args[1] = prefs.get("compiler.size.cmd");
args[2] = buildPath + File.separator + sketchName;
String recipe = prefs.get("recipe.size.pattern");
MessageFormat compileFormat = new MessageFormat(recipe);
String command = compileFormat.format(args);
String[] commandArray = command.split("\\|");
int r = 0;
try {
exception = null;
size = -1;
firstLine = null;
Process process = Runtime.getRuntime().exec(commandSize);
Process process = Runtime.getRuntime().exec(commandArray);
MessageSiphon in = new MessageSiphon(process.getInputStream(), this);
MessageSiphon err = new MessageSiphon(process.getErrorStream(), this);
boolean running = true;
while(running) {
while (running) {
try {
if (in.thread != null)
in.thread.join();
@ -69,25 +79,28 @@ public class Sizer implements MessageConsumer {
err.thread.join();
r = process.waitFor();
running = false;
} catch (InterruptedException intExc) { }
} catch (InterruptedException intExc) {
}
}
} catch (Exception e) {
// The default Throwable.toString() never returns null, but apparently
// some sub-class has overridden it to do so, thus we need to check for
// it. See: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1166589459
exception = new RunnerException(
(e.toString() == null) ? e.getClass().getName() + r : e.toString() + r);
// it. See: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1166589459
if (e.toString() == null)
exception = new RunnerException(e.getClass().getName() + r);
else
exception = new RunnerException(e.toString() + r);
}
if (exception != null)
throw exception;
if (size == -1)
throw new RunnerException(firstLine);
return size;
}
public void message(String s) {
if (firstLine == null)
firstLine = s;

View File

@ -29,13 +29,17 @@ sam.recipe.c.combine.pattern={0}{1}|{2}|{3}{4}|-T{11}|-Wl,-Map,{5}{6}.map|-o|{5}
##create eeprom
#sam.recipe.objcopy.eep.pattern={0=compiler.path}{1=compiler.objcopy.cmd}{2=compiler.objcopy.eep.flags} {3=BUILD_PATH}{4=SOURCE_NAME}.elf {5=BUILD_PATH}{6=SOURCE_NAME}.eep
sam.recipe.objcopy.eep.pattern={0}{1}|{2}|{3}.elf|{4}.eep
#sam.recipe.objcopy.eep.pattern={0}{1}|{2}|{3}.elf|{4}.eep
sam.recipe.objcopy.eep.pattern=
##create hex
#sam.recipe.objcopy.hex.pattern={0=compiler.path}{1=compiler.objcopy.cmd}{2=compiler.objcopy.elf.flags} {3=BUILD_PATH}{4=SOURCE_NAME}.elf {5=BUILD_PATH}{6=SOURCE_NAME}.hex
sam.recipe.objcopy.hex.pattern={0}{1}|{2}|{3}.elf|{4}.hex
sam.recipe.objcopy.hex.pattern={0}{1}|{2}|{3}.elf|{4}.bin
##compute size
sam.recipe.size.pattern={0}{1}|{2}.elf
########################################################
sam.name=Atmel SAM
@ -56,6 +60,7 @@ sam.compiler.elf2hex.flags=|-O|binary
sam.compiler.elf2hex.cmd=arm-none-eabi-objcopy
sam.compiler.ldflags=
sam.compiler.cpudef=-mcpu=
sam.compiler.size.cmd=arm-none-eabi-size
sam.compiler.upload.cmd=
sam.compiler.upload.flags=
sam.compiler.define=-DARDUINO=