1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-01-18 07:52:14 +01:00

Merge commit 'fcbbf8f4b4960bae1091c0cd9dc58b4a1885baf6' into platforms-b

Conflicts:
	app/src/processing/app/Base.java
	app/src/processing/app/debug/Compiler.java
	build/build.xml
	hardware/arduino/boards.txt
This commit is contained in:
Cristian Maglie 2011-12-22 00:35:33 +01:00
commit 65c15d93eb
10 changed files with 756 additions and 70 deletions

View File

@ -953,8 +953,20 @@ public class Base {
importToLibraryTable = new HashMap<String, File>(); importToLibraryTable = new HashMap<String, File>();
// Add from the "libraries" subfolder in the Processing directory // Add from the "libraries" subfolder in the Processing directory
//Choose which library to add by chip platform
try { try {
addLibraries(importMenu, librariesFolder); //Find the current target. Get the platform, and then select the correct name and core path.
String platformname = this.getBoardPreferences().get("platform");
String targetname = this.getPlatformPreferences(platformname).get("name");
String libraryPath = this.getPlatformPreferences(platformname).get("library.core.path");
JMenuItem platformItem = new JMenuItem(targetname);
platformItem.setEnabled(false);
importMenu.add(platformItem);
importMenu.addSeparator();
addLibraries(importMenu, getCoreLibraries(libraryPath));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -1011,6 +1023,8 @@ public class Base {
Preferences.set("board", (String) getValue("board")); Preferences.set("board", (String) getValue("board"));
onBoardOrPortChange(); onBoardOrPortChange();
Sketch.buildSettingChanged(); Sketch.buildSettingChanged();
//Debug: created new imports menu based on board
rebuildImportMenu(activeEditor.importMenu);
} }
}; };
action.putValue("target", target.getName()); action.putValue("target", target.getName());
@ -1527,6 +1541,10 @@ public class Base {
return getContentFile("hardware"); return getContentFile("hardware");
} }
//Get the core libraries
static public File getCoreLibraries(String path) {
return getContentFile(path);
}
static public String getHardwarePath() { static public String getHardwarePath() {
return getHardwareFolder().getAbsolutePath(); return getHardwareFolder().getAbsolutePath();
@ -1544,20 +1562,105 @@ public class Base {
static public Target getTarget() { static public Target getTarget() {
return Base.targetsTable.get(Preferences.get("target")); System.out.println("Base.targetsTable.get(Preferences.get(\"target\"))" + Base.targetsTable.get(Preferences.get("target")));
System.out.println("Preferences.get(\"target\")" + Preferences.get("target"));
Target target = Base.targetsTable.get(Preferences.get("target"));
if (target == null) {
System.out.println("default target is not in list. Replace with default.");
Preferences.set("target", "arduino");
target = Base.targetsTable.get(Preferences.get("target"));
}
return target;
} }
static public Map<String, String> getBoardPreferences() { static public Map<String, String> getPlatformPreferences() {
System.out.println("getPlatformPreferences() no arguments: start");
Target target = getTarget(); Target target = getTarget();
if (target == null) return new LinkedHashMap(); //if (target == null) return new LinkedHashMap();
Map map = target.getBoards(); Map map = target.getPlatforms();
if (map == null) return new LinkedHashMap(); /*
map = (Map) map.get(Preferences.get("board")); if (map == null)
if (map == null) return new LinkedHashMap(); {
System.err.println("Error loading platforms preference from Target");
System.exit(0);
}
*/
//if (map == null) return new LinkedHashMap();
map = (Map) map.get(Preferences.get("platform"));
//if (map == null) return new LinkedHashMap();
return map; return map;
} }
//Get a specific platform
static public Map<String, String> getPlatformPreferences(String platformname) {
if (platformname == null) {
platformname = Preferences.get("platform");
}
System.out.println("getlatformPreferences(String platformname)): start: platformname = " + platformname );
Target target = getTarget();
if (target == null ) {
System.out.println("get target is null. trouble! ");
}
Map map = target.getPlatforms();
map = (Map) map.get(platformname);
//What if null or defaults to nonexisent platform
System.out.println("PlatformName: " + platformname);
if (map == null)
{
System.err.println("Error loading platforms preference from Target");
System.exit(0);
}
return map;
}
static public Map<String, String> bogusgetBoardPreferences() {
System.out.println("getBoardPrefences method: start");
Target target = getTarget();
if (target == null) {
System.out.println("getBoardPrefereces method: target == null");
return new LinkedHashMap();
}
Map map = target.getBoards();
if (map == null) {
System.out.println("getBoardPrefereces method: target.getBoards() == null");
return new LinkedHashMap();
}
map = (Map) map.get(Preferences.get("board"));
if (map == null) {
System.out.println("getBoardPrefereces method: Preferences.get(board) == null");
return new LinkedHashMap();
}
//Debug iterate the map
Iterator iterator = map.entrySet().iterator();
while(iterator.hasNext())
{
Map.Entry pair = (Map.Entry)iterator.next();
if (pair.getValue() == null)
{
System.out.println("KeyName: " + pair.getKey() + " val: null");
}
else
{
System.out.println("KeyName: " + pair.getKey() + " val" + pair.getValue());
}
}
return map;
}
static public Map<String, String> getBoardPreferences() {
Target target = getTarget();
Map map = new LinkedHashMap();
if (target != null) {
map = target.getBoards();
map = (Map) map.get(Preferences.get("board"));
}
return map;
}
static public File getSketchbookFolder() { static public File getSketchbookFolder() {
return new File(Preferences.get("sketchbook.path")); return new File(Preferences.get("sketchbook.path"));

View File

@ -689,6 +689,9 @@ public class Editor extends JFrame implements RunnerListener {
if (boardsMenu == null) { if (boardsMenu == null) {
boardsMenu = new JMenu(_("Board")); boardsMenu = new JMenu(_("Board"));
base.rebuildBoardsMenu(boardsMenu); base.rebuildBoardsMenu(boardsMenu);
//Debug: rebuild imports
importMenu.removeAll();
base.rebuildImportMenu(importMenu);
} }
menu.add(boardsMenu); menu.add(boardsMenu);

View File

@ -780,4 +780,22 @@ public class Preferences {
return new SyntaxStyle(color, italic, bold, underlined); return new SyntaxStyle(color, italic, bold, underlined);
} }
//get a Map of the Preferences
static public Map<String, String> getMap()
{
Map globalpreferences = new LinkedHashMap();
Enumeration e = table.keys();
while (e.hasMoreElements())
{
String key = (String) e.nextElement();
//System.out.println("Key: " + key + "Val: " + table.get(key));
String value = (String) table.get(key);
globalpreferences.put(key, value );
}
return globalpreferences;
}
} }

View File

@ -1438,9 +1438,12 @@ public class Sketch {
// grab the imports from the code just preproc'd // grab the imports from the code just preproc'd
importedLibraries = new ArrayList<File>(); importedLibraries = new ArrayList<File>();
//Remember to clear library path before building it.
libraryPath = "";
for (String item : preprocessor.getExtraImports()) { for (String item : preprocessor.getExtraImports()) {
File libFolder = (File) Base.importToLibraryTable.get(item);
File libFolder = (File) Base.importToLibraryTable.get(item);
//If needed can Debug libraryPath here
if (libFolder != null && !importedLibraries.contains(libFolder)) { if (libFolder != null && !importedLibraries.contains(libFolder)) {
importedLibraries.add(libFolder); importedLibraries.add(libFolder);

View File

@ -34,6 +34,7 @@ import static processing.app.I18n._;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import java.util.zip.*; import java.util.zip.*;
import java.text.MessageFormat;
public class Compiler implements MessageConsumer { public class Compiler implements MessageConsumer {
@ -45,10 +46,23 @@ public class Compiler implements MessageConsumer {
Sketch sketch; Sketch sketch;
String buildPath; String buildPath;
String primaryClassName; String primaryClassName;
String platform;
String board;
boolean verbose; boolean verbose;
RunnerException exception; RunnerException exception;
HashMap<String, String> configPreferences;
HashMap<String, String> boardPreferences;
HashMap<String, String> platformPreferences;
String avrBasePath;
String corePath;
List<File> objectFiles;
ArrayList<String> includePaths;
public Compiler() { } public Compiler() { }
/** /**
@ -68,13 +82,56 @@ public class Compiler implements MessageConsumer {
this.buildPath = buildPath; this.buildPath = buildPath;
this.primaryClassName = primaryClassName; this.primaryClassName = primaryClassName;
this.verbose = verbose; this.verbose = verbose;
objectFiles = new ArrayList<File>();
// the pms object isn't used for anything but storage // the pms object isn't used for anything but storage
MessageStream pms = new MessageStream(this); MessageStream pms = new MessageStream(this);
String avrBasePath = Base.getAvrBasePath();
Map<String, String> boardPreferences = Base.getBoardPreferences(); Map<String, String> boardPreferences = Base.getBoardPreferences();
String core = boardPreferences.get("build.core");
//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
MessageFormat compileFormat = new MessageFormat(avrBasePath);
String basePath = System.getProperty("user.dir");
if (Base.isMacOS()) {
//logger.debug("basePath: " + basePath);
basePath += "/Arduino.app/Contents/Resources/Java";
}
Object[] Args = {basePath};
avrBasePath = compileFormat.format( Args );
System.out.println("avrBasePath:new: " + avrBasePath);
}
this.board = configPreferences.get("board");
if (this.board == "")
{
this.board = "_UNKNOWN";
}
String core = configPreferences.get("build.core");
if (core == null) { if (core == null) {
RunnerException re = new RunnerException(_("No board selected; please choose a board from the Tools > Board menu.")); RunnerException re = new RunnerException(_("No board selected; please choose a board from the Tools > Board menu."));
re.hideStackTrace(); re.hideStackTrace();
@ -96,6 +153,9 @@ public class Compiler implements MessageConsumer {
String variant = boardPreferences.get("build.variant"); String variant = boardPreferences.get("build.variant");
String variantPath = null; String variantPath = null;
String pins = configPreferences.get("build.pins");
String pinsPath = null;
if (variant != null) { if (variant != null) {
if (variant.indexOf(':') == -1) { if (variant.indexOf(':') == -1) {
Target t = Base.getTarget(); Target t = Base.getTarget();
@ -109,12 +169,11 @@ public class Compiler implements MessageConsumer {
} }
} }
List<File> objectFiles = new ArrayList<File>();
// 0. include paths for core + all libraries // 0. include paths for core + all libraries
sketch.setCompilingProgress(20); sketch.setCompilingProgress(20);
List includePaths = new ArrayList(); ArrayList<String> includePaths = new ArrayList<String>();
includePaths.add(corePath); includePaths.add(corePath);
if (variantPath != null) includePaths.add(variantPath); if (variantPath != null) includePaths.add(variantPath);
for (File file : sketch.getImportedLibraries()) { for (File file : sketch.getImportedLibraries()) {
@ -122,18 +181,19 @@ public class Compiler implements MessageConsumer {
} }
// 1. compile the sketch (already in the buildPath) // 1. compile the sketch (already in the buildPath)
System.out.println("1. compileSketch");
sketch.setCompilingProgress(30); sketch.setCompilingProgress(30);
objectFiles.addAll( compileSketch(avrBasePath, buildPath, includePaths, configPreferences);
compileFiles(avrBasePath, buildPath, includePaths,
findFilesInPath(buildPath, "S", false),
findFilesInPath(buildPath, "c", false),
findFilesInPath(buildPath, "cpp", false),
boardPreferences));
// 2. compile the libraries, outputting .o files to: <buildPath>/<library>/ // 2. compile the libraries, outputting .o files to: <buildPath>/<library>/
// 2. compile the libraries, outputting .o files to:
// <buildPath>/<library>/
//Doesn't really use configPreferences
System.out.println("2. compileLibraries");
sketch.setCompilingProgress(40);
compileLibraries(avrBasePath, buildPath, includePaths, configPreferences);
/*
sketch.setCompilingProgress(40);
for (File libraryFolder : sketch.getImportedLibraries()) { for (File libraryFolder : sketch.getImportedLibraries()) {
File outputFolder = new File(buildPath, libraryFolder.getName()); File outputFolder = new File(buildPath, libraryFolder.getName());
File utilityFolder = new File(libraryFolder, "utility"); File utilityFolder = new File(libraryFolder, "utility");
@ -157,11 +217,17 @@ public class Compiler implements MessageConsumer {
// other libraries should not see this library's utility/ folder // other libraries should not see this library's utility/ folder
includePaths.remove(includePaths.size() - 1); includePaths.remove(includePaths.size() - 1);
} }
*/
// 3. compile the core, outputting .o files to <buildPath> and then // 3. compile the core, outputting .o files to <buildPath> and then
// collecting them into the core.a library file. // collecting them into the core.a library file.
System.out.println("3. compileCore");
System.out.println("corePath: " + corePath);
sketch.setCompilingProgress(50); sketch.setCompilingProgress(50);
compileCore(avrBasePath, buildPath, corePath, pins, pinsPath, configPreferences);
/*
includePaths.clear(); includePaths.clear();
includePaths.add(corePath); // include path for core only includePaths.add(corePath); // include path for core only
if (variantPath != null) includePaths.add(variantPath); if (variantPath != null) includePaths.add(variantPath);
@ -183,16 +249,13 @@ public class Compiler implements MessageConsumer {
commandAR.add(file.getAbsolutePath()); commandAR.add(file.getAbsolutePath());
execAsynchronously(commandAR); execAsynchronously(commandAR);
} }
*/
// 4. link it all together into the .elf file // 4. link it all together into the .elf file
// For atmega2560, need --relax linker option to link larger sketch.setCompilingProgress(60);
// programs correctly. System.out.println("4. compileLink");
String optRelax = ""; compileLink(avrBasePath, buildPath, corePath, includePaths, configPreferences);
String atmega2560 = new String ("atmega2560");
if ( atmega2560.equals(boardPreferences.get("build.mcu")) ) { /*
optRelax = new String(",--relax");
}
sketch.setCompilingProgress(60);
List baseCommandLinker = new ArrayList(Arrays.asList(new String[] { List baseCommandLinker = new ArrayList(Arrays.asList(new String[] {
avrBasePath + "avr-gcc", avrBasePath + "avr-gcc",
"-Os", "-Os",
@ -219,9 +282,11 @@ public class Compiler implements MessageConsumer {
})); }));
List commandObjcopy; List commandObjcopy;
*/
// 5. extract EEPROM data (from EEMEM directive) to .eep file. // 5. extract EEPROM data (from EEMEM directive) to .eep file.
sketch.setCompilingProgress(70); sketch.setCompilingProgress(70);
/*
commandObjcopy = new ArrayList(baseCommandObjcopy); commandObjcopy = new ArrayList(baseCommandObjcopy);
commandObjcopy.add(2, "ihex"); commandObjcopy.add(2, "ihex");
commandObjcopy.set(3, "-j"); commandObjcopy.set(3, "-j");
@ -233,26 +298,32 @@ public class Compiler implements MessageConsumer {
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".elf"); commandObjcopy.add(buildPath + File.separator + primaryClassName + ".elf");
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".eep"); commandObjcopy.add(buildPath + File.separator + primaryClassName + ".eep");
execAsynchronously(commandObjcopy); execAsynchronously(commandObjcopy);
*/
System.out.println("5. compileEep");
compileEep(avrBasePath, buildPath, includePaths, configPreferences);
// 6. build the .hex file // 6. build the .hex file
sketch.setCompilingProgress(80); sketch.setCompilingProgress(80);
/*
commandObjcopy = new ArrayList(baseCommandObjcopy); commandObjcopy = new ArrayList(baseCommandObjcopy);
commandObjcopy.add(2, "ihex"); commandObjcopy.add(2, "ihex");
commandObjcopy.add(".eeprom"); // remove eeprom data commandObjcopy.add(".eeprom"); // remove eeprom data
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".elf"); commandObjcopy.add(buildPath + File.separator + primaryClassName + ".elf");
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".hex"); commandObjcopy.add(buildPath + File.separator + primaryClassName + ".hex");
execAsynchronously(commandObjcopy); execAsynchronously(commandObjcopy);
*/
System.out.println("6. compileHex");
compileHex(avrBasePath, buildPath, includePaths, configPreferences);
sketch.setCompilingProgress(90); sketch.setCompilingProgress(90);
return true; return true;
} }
private List<File> compileFiles(String avrBasePath, private List<File> compileFiles(String avrBasePath,
String buildPath, List<File> includePaths, String buildPath, ArrayList<String> includePaths,
List<File> sSources, ArrayList<File> sSources,
List<File> cSources, List<File> cppSources, ArrayList<File> cSources, ArrayList<File> cppSources,
Map<String, String> boardPreferences) Map<String, String> boardPreferences)
throws RunnerException { throws RunnerException {
@ -264,7 +335,7 @@ public class Compiler implements MessageConsumer {
execAsynchronously(getCommandCompilerS(avrBasePath, includePaths, execAsynchronously(getCommandCompilerS(avrBasePath, includePaths,
file.getAbsolutePath(), file.getAbsolutePath(),
objectPath, objectPath,
boardPreferences)); configPreferences));
} }
for (File file : cSources) { for (File file : cSources) {
@ -277,7 +348,7 @@ public class Compiler implements MessageConsumer {
execAsynchronously(getCommandCompilerC(avrBasePath, includePaths, execAsynchronously(getCommandCompilerC(avrBasePath, includePaths,
file.getAbsolutePath(), file.getAbsolutePath(),
objectPath, objectPath,
boardPreferences)); configPreferences));
} }
for (File file : cppSources) { for (File file : cppSources) {
@ -290,7 +361,7 @@ public class Compiler implements MessageConsumer {
execAsynchronously(getCommandCompilerCPP(avrBasePath, includePaths, execAsynchronously(getCommandCompilerCPP(avrBasePath, includePaths,
file.getAbsolutePath(), file.getAbsolutePath(),
objectPath, objectPath,
boardPreferences)); configPreferences));
} }
return objectPaths; return objectPaths;
@ -365,9 +436,18 @@ public class Compiler implements MessageConsumer {
/** /**
* Either succeeds or throws a RunnerException fit for public consumption. * Either succeeds or throws a RunnerException fit for public consumption.
*/ */
private void execAsynchronously(List commandList) throws RunnerException { private void execAsynchronously(String[] command) throws RunnerException {
String[] command = new String[commandList.size()];
commandList.toArray(command); //eliminate any empty array entries
List<String> stringList = new ArrayList<String>();
for(String string : command) {
string = string.trim();
if(string != null && string.length() > 0) {
stringList.add(string);
}
}
command = stringList.toArray(new String[stringList.size()]);
int result = 0; int result = 0;
if (verbose || Preferences.getBoolean("build.verbose")) { if (verbose || Preferences.getBoolean("build.verbose")) {
@ -427,6 +507,7 @@ public class Compiler implements MessageConsumer {
re.hideStackTrace(); re.hideStackTrace();
throw re; throw re;
} }
System.out.println("execAsync: Done.");
} }
@ -523,7 +604,7 @@ public class Compiler implements MessageConsumer {
} }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
/*
static private List getCommandCompilerS(String avrBasePath, List includePaths, static private List getCommandCompilerS(String avrBasePath, List includePaths,
String sourceName, String objectName, Map<String, String> boardPreferences) { String sourceName, String objectName, Map<String, String> boardPreferences) {
List baseCommandCompiler = new ArrayList(Arrays.asList(new String[] { List baseCommandCompiler = new ArrayList(Arrays.asList(new String[] {
@ -545,7 +626,39 @@ public class Compiler implements MessageConsumer {
return baseCommandCompiler; return baseCommandCompiler;
} }
*/
// ///////////////////////////////////////////////////////////////////////////
static private String[] getCommandCompilerS(String avrBasePath,
ArrayList<String> includePaths, String sourceName, String objectName,
HashMap<String, String> configPreferences)
{
System.out.println("getCommandCompilerS: start");
String baseCommandString = configPreferences.get("recipe.cpp.o.pattern");
MessageFormat compileFormat = new MessageFormat(baseCommandString);
//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 command = compileFormat.format( Args );
String[] commandArray = command.split("\\|");
return commandArray;
}
/*
static private List getCommandCompilerC(String avrBasePath, List includePaths, static private List getCommandCompilerC(String avrBasePath, List includePaths,
String sourceName, String objectName, Map<String, String> boardPreferences) { String sourceName, String objectName, Map<String, String> boardPreferences) {
@ -574,7 +687,38 @@ public class Compiler implements MessageConsumer {
return baseCommandCompiler; return baseCommandCompiler;
} }
*/
//removed static
private String[] getCommandCompilerC(String avrBasePath,
ArrayList<String> includePaths, String sourceName, String objectName,
HashMap<String, String> configPreferences)
{
System.out.println("getCommandCompilerC: start");
String baseCommandString = configPreferences.get("recipe.c.o.pattern");
MessageFormat compileFormat = new MessageFormat(baseCommandString);
//getIncludes to String
String includes = preparePaths(includePaths);
Object[] Args = {
avrBasePath,
configPreferences.get("compiler.c.cmd"),
configPreferences.get("compiler.c.flags"),
configPreferences.get("compiler.cpudef"),
configPreferences.get("build.mcu"),
configPreferences.get("build.f_cpu"),
configPreferences.get("software"),
Base.REVISION,
includes,
sourceName,
objectName
};
String command = compileFormat.format( Args );
String[] commandArray = command.split("\\|");
return commandArray;
}
/*
static private List getCommandCompilerCPP(String avrBasePath, static private List getCommandCompilerCPP(String avrBasePath,
List includePaths, String sourceName, String objectName, List includePaths, String sourceName, String objectName,
@ -605,7 +749,44 @@ public class Compiler implements MessageConsumer {
return baseCommandCompilerCPP; return baseCommandCompilerCPP;
} }
*/
static private String[] getCommandCompilerCPP(String avrBasePath,
ArrayList<String> includePaths, String sourceName, String objectName,
HashMap<String, String> configPreferences)
{
System.out.println("getCommandCompilerCPP: start");
String baseCommandString = configPreferences.get("recipe.cpp.o.pattern");
MessageFormat compileFormat = new MessageFormat(baseCommandString);
//getIncludes to String
String includes = preparePaths(includePaths);
Object[] Args = {
avrBasePath,
configPreferences.get("compiler.cpp.cmd"),
configPreferences.get("compiler.cpp.flags"),
configPreferences.get("compiler.cpudef"),
configPreferences.get("build.mcu"),
configPreferences.get("build.f_cpu"),
configPreferences.get("software"),
Base.REVISION,
includes,
sourceName,
objectName
};
String command = compileFormat.format( Args );
String[] commandArray = command.split("\\|");
/*
System.out.println("command:" + command);
for (int ii = 0; ii < commandArray.length; ii++)
{
System.out.println("'" + commandArray[ii] + "'");
}
*/
return commandArray;
}
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -633,6 +814,7 @@ public class Compiler implements MessageConsumer {
static public ArrayList<File> findFilesInPath(String path, String extension, static public ArrayList<File> findFilesInPath(String path, String extension,
boolean recurse) { boolean recurse) {
System.out.println("findFilesInPath: " + path);
return findFilesInFolder(new File(path), extension, recurse); return findFilesInFolder(new File(path), extension, recurse);
} }
@ -655,4 +837,277 @@ public class Compiler implements MessageConsumer {
return files; return files;
} }
// 1. compile the sketch (already in the buildPath)
void compileSketch(String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<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));
}
//logger.debug("compileSketch: start");
this.objectFiles.addAll(compileFiles(avrBasePath, buildPath, includePaths,
findFilesInPath(buildPath, "S", false),
findFilesInPath(buildPath, "c", false),
findFilesInPath(buildPath, "cpp", false),
configPreferences));
}
// 2. compile the libraries, outputting .o files to:
// <buildPath>/<library>/
void compileLibraries (String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<String, String> configPreferences)
throws RunnerException
{
System.out.println("compileLibraries: start");
for (File libraryFolder : sketch.getImportedLibraries()) {
System.out.println("libraryFolder: " + libraryFolder);
File outputFolder = new File(buildPath, libraryFolder.getName());
File utilityFolder = new File(libraryFolder, "utility");
createFolder(outputFolder);
// this library can use includes in its utility/ folder
includePaths.add(utilityFolder.getAbsolutePath());
//debug includePaths
System.out.println("includePaths: ");
for (int i = 0; i < includePaths.size(); i++) {
System.out.println("-I" + (String) includePaths.get(i));
}
objectFiles.addAll(
compileFiles(avrBasePath, outputFolder.getAbsolutePath(), includePaths,
findFilesInFolder(libraryFolder, "S", false),
findFilesInFolder(libraryFolder, "c", false),
findFilesInFolder(libraryFolder, "cpp", false),
boardPreferences));
outputFolder = new File(outputFolder, "utility");
createFolder(outputFolder);
objectFiles.addAll(
compileFiles(avrBasePath, outputFolder.getAbsolutePath(), includePaths,
findFilesInFolder(utilityFolder, "S", false),
findFilesInFolder(utilityFolder, "c", false),
findFilesInFolder(utilityFolder, "cpp", false),
boardPreferences));
// other libraries should not see this library's utility/ folder
includePaths.remove(includePaths.size() - 1);
}
}
// 3. compile the core, outputting .o files to <buildPath> and then
// collecting them into the core.a library file.
void compileCore (String avrBasePath, String buildPath, String corePath, String pins, String pinsPath, HashMap<String, String> configPreferences)
throws RunnerException
{
System.out.println("compileCore(...) start");
ArrayList<String> includePaths = new ArrayList();
includePaths.add(corePath); //include core path only
if (pinsPath != null) includePaths.add(pinsPath);
//debug includePaths
System.out.println("includePaths: ");
for (int i = 0; i < includePaths.size(); i++) {
System.out.println("-I" + (String) includePaths.get(i));
}
String baseCommandString = configPreferences.get("recipe.ar.pattern");
String commandString = "";
MessageFormat compileFormat = new MessageFormat(baseCommandString);
System.out.println("corePath: " + corePath);
List<File> coreObjectFiles = compileFiles(
avrBasePath,
buildPath,
includePaths,
findFilesInPath(corePath, "S", true),
findFilesInPath(corePath, "c", true),
findFilesInPath(corePath, "cpp", true),
configPreferences);
for (File file : coreObjectFiles) {
//List commandAR = new ArrayList(baseCommandAR);
//commandAR = commandAR + file.getAbsolutePath();
Object[] Args = {
avrBasePath,
configPreferences.get("compiler.ar.cmd"),
configPreferences.get("compiler.ar.flags"),
//corePath,
buildPath + File.separator,
"core.a",
//objectName
file.getAbsolutePath()
};
System.out.println("compileCore(...) substitute");
commandString = compileFormat.format( Args );
String[] commandArray = commandString.split("\\|");
execAsynchronously(commandArray);
}
}
// 4. link it all together into the .elf file
void compileLink(String avrBasePath, String buildPath, String corePath, ArrayList<String> includePaths, HashMap<String, String> configPreferences)
throws RunnerException
{
// For atmega2560, need --relax linker option to link larger
// programs correctly.
String optRelax = "";
if (boardPreferences.get("build.mcu").equals("atmega2560"))
optRelax = ",--relax";
System.out.println("compileLink: start");
String baseCommandString = configPreferences.get("recipe.c.combine.pattern");
String commandString = "";
MessageFormat compileFormat = new MessageFormat(baseCommandString);
String objectFileList = "";
for (File file : objectFiles) {
objectFileList = objectFileList + file.getAbsolutePath() + "|";
}
System.out.println("objectFileList: " + objectFileList);
Object[] Args = {
avrBasePath,
configPreferences.get("compiler.c.elf.cmd"),
configPreferences.get("compiler.c.elf.flags")+optRelax,
configPreferences.get("compiler.cpudef"),
configPreferences.get("build.mcu"),
buildPath + File.separator,
primaryClassName,
objectFileList,
buildPath + File.separator + "core.a",
buildPath,
corePath,
configPreferences.get("ldscript"),
};
commandString = compileFormat.format( Args );
String[] commandArray = commandString.split("\\|");
execAsynchronously(commandArray);
}
// 5. extract EEPROM data (from EEMEM directive) to .eep file.
void compileEep (String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<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 = "";
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[] commandArray = commandString.split("\\|");
execAsynchronously(commandArray);
}
// 6. build the .hex file
void compileHex (String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<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 = "";
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[] 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;
}
private static String preparePaths(ArrayList<String> includePaths) {
//getIncludes to String
//logger.debug("Start: Prepare paths");
String includes = "";
for (int i = 0; i < includePaths.size(); i++)
{
includes = includes + (" -I" + (String) includePaths.get(i)) + "|";
}
//logger.debug("Paths prepared: " + includes);
return includes;
}
} }

View File

@ -29,18 +29,22 @@ import java.io.*;
import java.util.*; import java.util.*;
import processing.app.Preferences; import processing.app.Preferences;
//import processing.app.Base;
public class Target { public class Target {
private String name; private String name;
private File folder; private File folder;
private Map boards; private Map boards;
private Map programmers; private Map programmers;
private Map platforms;
public Target(String name, File folder) { public Target(String name, File folder) {
System.out.println("Target: constructor start, name: " + name);
this.name = name; this.name = name;
this.folder = folder; this.folder = folder;
this.boards = new LinkedHashMap(); this.boards = new LinkedHashMap();
this.programmers = new LinkedHashMap(); this.programmers = new LinkedHashMap();
this.platforms = new LinkedHashMap();
File boardsFile = new File(folder, "boards.txt"); File boardsFile = new File(folder, "boards.txt");
try { try {
@ -58,8 +62,31 @@ public class Target {
} }
} catch (Exception e) { } catch (Exception e) {
System.err.println("Error loading boards from " + boardsFile + ": " + e); System.err.println("Error loading boards from " + boardsFile + ": " + e);
} }
File platformsFile = new File(folder,"platforms.txt");
try
{
if(platformsFile.exists()){
Map platformPreferences = new LinkedHashMap();
Preferences.load(new FileInputStream(platformsFile), platformPreferences);
for(Object k : platformPreferences.keySet())
{
String key=(String) k;
String platform=key.substring(0,key.indexOf('.'));
if (!platforms.containsKey(platform)) platforms.put(platform, new HashMap());
((Map) platforms.get(platform)).put(key.substring(key.indexOf('.') + 1),platformPreferences.get(key));
}
}
} catch (Exception e) {
System.err.println("Error loading platforms from " +
platformsFile + ": " + e);
//System.exit(0);
}
File programmersFile = new File(folder, "programmers.txt"); File programmersFile = new File(folder, "programmers.txt");
try { try {
if (programmersFile.exists()) { if (programmersFile.exists()) {
@ -88,4 +115,8 @@ public class Target {
public Map<String, Map<String, String>> getProgrammers() { public Map<String, Map<String, String>> getProgrammers() {
return programmers; return programmers;
} }
public Map<String, Map<String, String>> getPlatforms() {
return platforms;
}
} }

View File

@ -217,6 +217,10 @@
<exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="true"/> <exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="true"/>
</target> </target>
<target name="macosx-debug" depends="macosx-build" description="Run Mac OS X version">
<exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="false"/>
</target>
<target name="macosx-dist" if="macosx" depends="macosx-build" description="Create a downloadable .zip for the Mac OS X version"> <target name="macosx-dist" if="macosx" depends="macosx-build" description="Create a downloadable .zip for the Mac OS X version">
<!-- The ant copy command does not preserve permissions. --> <!-- The ant copy command does not preserve permissions. -->
<chmod file="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" perm="+x" /> <chmod file="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" perm="+x" />

View File

@ -239,6 +239,8 @@ run.present.exclusive.macosx = true
# ARDUINO PREFERENCES # ARDUINO PREFERENCES
board = uno board = uno
target = arduino target = arduino
platform = avr
software=ARDUINO
programmer = arduino:avrispmkii programmer = arduino:avrispmkii

View File

@ -1,7 +1,8 @@
############################################################## ##############################################################
uno.name=Arduino Uno uno.name=Arduino Uno
uno.upload.protocol=arduino uno.platform=avr
uno.upload.protocol=stk500
uno.upload.maximum_size=32256 uno.upload.maximum_size=32256
uno.upload.speed=115200 uno.upload.speed=115200
uno.bootloader.low_fuses=0xff uno.bootloader.low_fuses=0xff
@ -19,7 +20,7 @@ uno.build.variant=standard
############################################################## ##############################################################
atmega328.name=Arduino Duemilanove w/ ATmega328 atmega328.name=Arduino Duemilanove w/ ATmega328
atmega328.platform=avr
atmega328.upload.protocol=arduino atmega328.upload.protocol=arduino
atmega328.upload.maximum_size=30720 atmega328.upload.maximum_size=30720
atmega328.upload.speed=57600 atmega328.upload.speed=57600
@ -40,7 +41,7 @@ atmega328.build.variant=standard
############################################################## ##############################################################
diecimila.name=Arduino Diecimila or Duemilanove w/ ATmega168 diecimila.name=Arduino Diecimila or Duemilanove w/ ATmega168
diecimila.platform=avr
diecimila.upload.protocol=arduino diecimila.upload.protocol=arduino
diecimila.upload.maximum_size=14336 diecimila.upload.maximum_size=14336
diecimila.upload.speed=19200 diecimila.upload.speed=19200
@ -61,7 +62,7 @@ diecimila.build.variant=standard
############################################################## ##############################################################
nano328.name=Arduino Nano w/ ATmega328 nano328.name=Arduino Nano w/ ATmega328
nano328.platform=avr
nano328.upload.protocol=arduino nano328.upload.protocol=arduino
nano328.upload.maximum_size=30720 nano328.upload.maximum_size=30720
nano328.upload.speed=57600 nano328.upload.speed=57600
@ -82,7 +83,7 @@ nano328.build.variant=eightanaloginputs
############################################################## ##############################################################
nano.name=Arduino Nano w/ ATmega168 nano.name=Arduino Nano w/ ATmega168
nano.platform=avr
nano.upload.protocol=arduino nano.upload.protocol=arduino
nano.upload.maximum_size=14336 nano.upload.maximum_size=14336
nano.upload.speed=19200 nano.upload.speed=19200
@ -103,7 +104,7 @@ nano.build.variant=eightanaloginputs
############################################################## ##############################################################
mega2560.name=Arduino Mega 2560 or Mega ADK mega2560.name=Arduino Mega 2560 or Mega ADK
mega2560.platform=avr
mega2560.upload.protocol=stk500v2 mega2560.upload.protocol=stk500v2
mega2560.upload.maximum_size=258048 mega2560.upload.maximum_size=258048
mega2560.upload.speed=115200 mega2560.upload.speed=115200
@ -124,7 +125,7 @@ mega2560.build.variant=mega
############################################################## ##############################################################
mega.name=Arduino Mega (ATmega1280) mega.name=Arduino Mega (ATmega1280)
mega.platform=avr
mega.upload.protocol=arduino mega.upload.protocol=arduino
mega.upload.maximum_size=126976 mega.upload.maximum_size=126976
mega.upload.speed=57600 mega.upload.speed=57600
@ -145,6 +146,7 @@ mega.build.variant=mega
############################################################## ##############################################################
#leonardo.name=Arduino Leonardo #leonardo.name=Arduino Leonardo
#leonardo.platform=avr
#leonardo.upload.protocol=arduino #leonardo.upload.protocol=arduino
#leonardo.upload.maximum_size=28672 #leonardo.upload.maximum_size=28672
#leonardo.upload.speed=1200 #leonardo.upload.speed=1200
@ -163,6 +165,7 @@ mega.build.variant=mega
############################################################## ##############################################################
#micro.name=Arduino Micro #micro.name=Arduino Micro
#micro.platform=avr
#micro.upload.protocol=arduino #micro.upload.protocol=arduino
#micro.upload.maximum_size=30720 #micro.upload.maximum_size=30720
#micro.upload.speed=1200 #micro.upload.speed=1200
@ -181,7 +184,7 @@ mega.build.variant=mega
############################################################## ##############################################################
mini328.name=Arduino Mini w/ ATmega328 mini328.name=Arduino Mini w/ ATmega328
mini328.platform=avr
mini328.upload.protocol=stk500 mini328.upload.protocol=stk500
mini328.upload.maximum_size=28672 mini328.upload.maximum_size=28672
mini328.upload.speed=115200 mini328.upload.speed=115200
@ -202,7 +205,7 @@ mini328.build.variant=eightanaloginputs
############################################################## ##############################################################
mini.name=Arduino Mini w/ ATmega168 mini.name=Arduino Mini w/ ATmega168
mini.platform=avr
mini.upload.protocol=arduino mini.upload.protocol=arduino
mini.upload.maximum_size=14336 mini.upload.maximum_size=14336
mini.upload.speed=19200 mini.upload.speed=19200
@ -223,7 +226,7 @@ mini.build.variant=eightanaloginputs
############################################################## ##############################################################
ethernet.name=Arduino Ethernet ethernet.name=Arduino Ethernet
ethernet.platform=avr
ethernet.upload.protocol=arduino ethernet.upload.protocol=arduino
ethernet.upload.maximum_size=32256 ethernet.upload.maximum_size=32256
ethernet.upload.speed=115200 ethernet.upload.speed=115200
@ -244,7 +247,7 @@ ethernet.build.core=arduino
############################################################## ##############################################################
fio.name=Arduino Fio fio.name=Arduino Fio
fio.platform=avr
fio.upload.protocol=arduino fio.upload.protocol=arduino
fio.upload.maximum_size=30720 fio.upload.maximum_size=30720
fio.upload.speed=57600 fio.upload.speed=57600
@ -265,7 +268,7 @@ fio.build.variant=eightanaloginputs
############################################################## ##############################################################
bt328.name=Arduino BT w/ ATmega328 bt328.name=Arduino BT w/ ATmega328
bt328.platform=avr
bt328.upload.protocol=arduino bt328.upload.protocol=arduino
bt328.upload.maximum_size=28672 bt328.upload.maximum_size=28672
bt328.upload.speed=19200 bt328.upload.speed=19200
@ -287,7 +290,7 @@ bt328.build.variant=eightanaloginputs
############################################################## ##############################################################
bt.name=Arduino BT w/ ATmega168 bt.name=Arduino BT w/ ATmega168
bt.platform=avr
bt.upload.protocol=arduino bt.upload.protocol=arduino
bt.upload.maximum_size=14336 bt.upload.maximum_size=14336
bt.upload.speed=19200 bt.upload.speed=19200
@ -309,7 +312,7 @@ bt.build.variant=eightanaloginputs
############################################################## ##############################################################
lilypad328.name=LilyPad Arduino w/ ATmega328 lilypad328.name=LilyPad Arduino w/ ATmega328
lilypad328.platform=avr
lilypad328.upload.protocol=arduino lilypad328.upload.protocol=arduino
lilypad328.upload.maximum_size=30720 lilypad328.upload.maximum_size=30720
lilypad328.upload.speed=57600 lilypad328.upload.speed=57600
@ -330,7 +333,7 @@ lilypad328.build.variant=standard
############################################################## ##############################################################
lilypad.name=LilyPad Arduino w/ ATmega168 lilypad.name=LilyPad Arduino w/ ATmega168
lilypad.platform=avr
lilypad.upload.protocol=arduino lilypad.upload.protocol=arduino
lilypad.upload.maximum_size=14336 lilypad.upload.maximum_size=14336
lilypad.upload.speed=19200 lilypad.upload.speed=19200
@ -351,7 +354,7 @@ lilypad.build.variant=standard
############################################################## ##############################################################
pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
pro5v328.platform=avr
pro5v328.upload.protocol=arduino pro5v328.upload.protocol=arduino
pro5v328.upload.maximum_size=30720 pro5v328.upload.maximum_size=30720
pro5v328.upload.speed=57600 pro5v328.upload.speed=57600
@ -372,7 +375,7 @@ pro5v328.build.variant=standard
############################################################## ##############################################################
pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168
pro5v.platform=avr
pro5v.upload.protocol=arduino pro5v.upload.protocol=arduino
pro5v.upload.maximum_size=14336 pro5v.upload.maximum_size=14336
pro5v.upload.speed=19200 pro5v.upload.speed=19200
@ -393,7 +396,7 @@ pro5v.build.variant=standard
############################################################## ##############################################################
pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
pro328.platform=avr
pro328.upload.protocol=arduino pro328.upload.protocol=arduino
pro328.upload.maximum_size=30720 pro328.upload.maximum_size=30720
pro328.upload.speed=57600 pro328.upload.speed=57600
@ -414,7 +417,7 @@ pro328.build.variant=standard
############################################################## ##############################################################
pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
pro.platform=avr
pro.upload.protocol=arduino pro.upload.protocol=arduino
pro.upload.maximum_size=14336 pro.upload.maximum_size=14336
pro.upload.speed=19200 pro.upload.speed=19200
@ -435,7 +438,7 @@ pro.build.variant=standard
############################################################## ##############################################################
atmega168.name=Arduino NG or older w/ ATmega168 atmega168.name=Arduino NG or older w/ ATmega168
atmega168.platform=avr
atmega168.upload.protocol=arduino atmega168.upload.protocol=arduino
atmega168.upload.maximum_size=14336 atmega168.upload.maximum_size=14336
atmega168.upload.speed=19200 atmega168.upload.speed=19200
@ -456,7 +459,7 @@ atmega168.build.variant=standard
############################################################## ##############################################################
atmega8.name=Arduino NG or older w/ ATmega8 atmega8.name=Arduino NG or older w/ ATmega8
atmega8.platform=avr
atmega8.upload.protocol=arduino atmega8.upload.protocol=arduino
atmega8.upload.maximum_size=7168 atmega8.upload.maximum_size=7168
atmega8.upload.speed=19200 atmega8.upload.speed=19200

64
hardware/arduino/platforms.txt Executable file
View File

@ -0,0 +1,64 @@
#########Compiler Recipe#################################
##compile c object files
##Default.recipe, overide if overide exists, these defauls should remain the same, if you need to change them do it as an overide.
#default.recipe.c.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
#default.recipe.cpp.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
#default.recipe.ar.pattern={0}{1}|{2}|{3}{4}|{5}
#default.recipe.c.combine.pattern={0}{1}|{2}|{3}{4}|-o|{5}{6}.elf|{7}|{8}|-L{9}|-lm
#default.recipe.objcopy.eep.pattern={0}{1}|{2}|{3}.elf|{4}.eep
#default.recipe.objcopy.hex.pattern={0}{1}|{2}|{3}.elf|{4}.hex
########avr compile pattern ##########
#avr.recipe.c.o.pattern={0=compiler.path}{1=compiler.c.cmd}{2=compiler.c.flags}{3=compiler.cpudef}{4=build.mcu}-DF_CPU={5=build.f_cpu}-D{7=ARDUINO}={6=Base.REVISION}{7=-I/INCLUDE_PATHS} {8=SOURCE_NAME} -o{9=OBJECT_NAME}
#object name seems to have build path in it.
avr.recipe.c.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
##compile cc object files
#avr.recipe.cc.o.pattern={0=compiler.path}{1=compiler.cc.cmd}{2=compiler.c.flags}{3=compiler.cpudef}{4=build.mcu}-DF_CPU={5=build.f_cpu}-DARDUINO={6=Base.REVISION}{-7=I/INCLUDE_PATHS} {8=SOURCE_NAME} -o{9=BUILD_PATH}{10=OBJECT_NAME}
avr.recipe.cpp.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
##create archives
#avr.recipe.ar.pattern={0=compiler.path}{1=compiler.ar.cmd}{2=compiler.ar.flags}{3=BUILD_PATH}{4=CORE_NAME=core.a}{5=BUILD_PATH}{6=OBJECT_NAME}
avr.recipe.ar.pattern={0}{1}|{2}|{3}{4}|{5}
##combine gc-sections| archives, and objects
#avr.recipe.c.combine.pattern={0=compiler.path}{1=compiler.c.cmd}{2=compiler.combine.flags}{3=compiler.cpudef}{4=build.mcu} -o {5=BUILD_PATH}{6=SOURCE_NAME}.elf {7=BUILD_PATH}{8=SOURCE_NAME}.o {9=BUILD_PATH}{10=CORE_NAME=core.a} -L{11=BUILD_PATH} -lm
#avr.recipe.c.combine.pattern={0}{1}|{2}|{3}{4}|-o|{5}{6}.elf|{7}{8}|{9}|-L{10}|-lm
avr.recipe.c.combine.pattern={0}{1}|{2}|{3}{4}|-o|{5}{6}.elf|{7}|{8}|-L{9}|-lm
##create eeprom
#avr.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
avr.recipe.objcopy.eep.pattern={0}{1}|{2}|{3}.elf|{4}.eep
##create hex
#avr.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
avr.recipe.objcopy.hex.pattern={0}{1}|{2}|{3}.elf|{4}.hex
########################################################
avr.name=Arduino
#avr.compiler.path Official default is correct, only need to change this if you want to overide the initial default
#avr.compiler.path={0}/hardware/tools/avr/bin/
avr.compiler.c.cmd=avr-gcc
avr.compiler.c.flags=|-c|-g|-Os|-w|-ffunction-sections|-fdata-sections
avr.compiler.c.elf.flags=|-Os|-Wl,--gc-sections
avr.compiler.c.elf.cmd=avr-gcc
avr.compiler.S.flags=|-c|-g|-assembler-with-cpp
avr.compiler.cpp.cmd=avr-g++
avr.compiler.cpp.flags=|-c|-g|-Os|-w|-fno-exceptions|-ffunction-sections|-fdata-sections
avr.compiler.ar.cmd=avr-ar
avr.compiler.ar.flags=rcs
avr.compiler.objcopy.cmd=avr-objcopy
avr.compiler.objcopy.eep.flags=|-O|ihex|-j|.eeprom|--set-section-flags=.eeprom=alloc,load|--no-change-warnings|--change-section-lma|.eeprom=0
avr.compiler.elf2hex.flags=|-O|ihex|-R|.eeprom
avr.compiler.elf2hex.cmd=avr-objcopy
avr.compiler.ldflags=
avr.compiler.cpudef=-mmcu=
avr.compiler.upload.cmd=
avr.compiler.upload.flags=
avr.compiler.define=-DARDUINO=
avr.library.path=./hardware/arduino/cores/arduino
avr.library.core.path=./libraries