Bug 480365 - Support Arduino Zero
authorDoug Schaefer <dschaefer@qnx.com>
Thu, 22 Oct 2015 02:19:30 +0000 (22:19 -0400)
committerDoug Schaefer <dschaefer@qnx.com>
Thu, 22 Oct 2015 02:22:41 +0000 (22:22 -0400)
Made a number of bad assumptions. This get us building for the Zero
and tested to make sure Uno and ESP8266 still work.

Change-Id: Ifed78af11969c7fba65754b9254d8a2eecf335ac

toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java
toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java
toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuilder.java
toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk

index f3e38ca..4c57d95 100644 (file)
@@ -210,12 +210,16 @@ public class ArduinoPlatform {
                }
        }
 
-       public Collection<String> getSources(String core) {
+       public Collection<String> getSources(String core, String variant) {
                List<String> sources = new ArrayList<>();
                Path srcPath = getInstallPath().resolve("cores").resolve(core); //$NON-NLS-1$
                if (srcPath.toFile().isDirectory()) {
                        getSources(sources, srcPath, true);
                }
+               Path variantPath = getInstallPath().resolve("variants").resolve(variant); //$NON-NLS-1$
+               if (variantPath.toFile().isDirectory()) {
+                       getSources(sources, variantPath, true);
+               }
                return sources;
        }
 
index f8d728c..b7340f1 100644 (file)
@@ -236,11 +236,30 @@ public class ArduinoBuildConfiguration {
                return board;
        }
 
-       private Properties getProperties() throws CoreException {
+       private synchronized Properties getProperties() throws CoreException {
                if (properties == null) {
+                       ArduinoPlatform platform = board.getPlatform();
+
+                       // IDE generated properties
+                       properties = new Properties();
+                       properties.put("runtime.platform.path", platform.getInstallPath().toString()); //$NON-NLS-1$
+                       properties.put("runtime.ide.version", "10607"); //$NON-NLS-1$ //$NON-NLS-2$
+                       properties.put("build.arch", platform.getArchitecture().toUpperCase()); //$NON-NLS-1$
+                       properties.put("build.path", config.getName()); //$NON-NLS-1$
+                       properties.put("build.variant.path", //$NON-NLS-1$
+                                       platform.getInstallPath().resolve("variants").resolve("{build.variant}").toString()); //$NON-NLS-1$ //$NON-NLS-2$
+
+                       // Platform
+                       properties.putAll(board.getPlatform().getPlatformProperties());
+
+                       // Tools
+                       for (ToolDependency toolDep : platform.getToolsDependencies()) {
+                               properties.putAll(toolDep.getTool().getToolProperties());
+                       }
+
                        // Board
                        ArduinoBoard board = getBoard();
-                       properties = board.getBoardProperties();
+                       properties.putAll(board.getBoardProperties());
 
                        // Menus
                        IEclipsePreferences settings = getSettings();
@@ -253,21 +272,8 @@ public class ArduinoBuildConfiguration {
                                        }
                                }
                        }
-
-                       // Platform
-                       ArduinoPlatform platform = board.getPlatform();
-                       properties.putAll(board.getPlatform().getPlatformProperties());
-
-                       // Tools
-                       for (ToolDependency toolDep : platform.getToolsDependencies()) {
-                               properties.putAll(toolDep.getTool().getToolProperties());
-                       }
-
-                       properties.put("runtime.platform.path", platform.getInstallPath().toString()); //$NON-NLS-1$
-                       properties.put("runtime.ide.version", "10607"); //$NON-NLS-1$ //$NON-NLS-2$
-                       properties.put("build.arch", platform.getArchitecture().toUpperCase()); //$NON-NLS-1$
-                       properties.put("build.path", config.getName()); //$NON-NLS-1$
                }
+
                // always do this in case the project changes names
                properties.put("build.project_name", config.getProject().getName()); //$NON-NLS-1$
                return properties;
@@ -364,7 +370,8 @@ public class ArduinoBuildConfiguration {
 
                Path platformPath = platform.getInstallPath();
                buildModel.put("platform_path", pathString(platformPath)); //$NON-NLS-1$
-               buildModel.put("platform_srcs", platform.getSources(properties.getProperty("build.core"))); //$NON-NLS-1$ //$NON-NLS-2$
+               buildModel.put("platform_srcs", //$NON-NLS-1$
+                               platform.getSources(properties.getProperty("build.core"), properties.getProperty("build.variant"))); //$NON-NLS-1$ //$NON-NLS-2$
 
                properties.put("object_file", "$@"); //$NON-NLS-1$ //$NON-NLS-2$
                properties.put("source_file", "$<"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -378,6 +385,7 @@ public class ArduinoBuildConfiguration {
                buildModel.put("recipe_c_combine_pattern", resolveProperty("recipe.c.combine.pattern", properties)); //$NON-NLS-1$ //$NON-NLS-2$
                buildModel.put("recipe_objcopy_eep_pattern", resolveProperty("recipe.objcopy.eep.pattern", properties)); //$NON-NLS-1$ //$NON-NLS-2$
                buildModel.put("recipe_objcopy_hex_pattern", resolveProperty("recipe.objcopy.hex.pattern", properties)); //$NON-NLS-1$ //$NON-NLS-2$
+               buildModel.put("recipe_objcopy_bin_pattern", resolveProperty("recipe.objcopy.bin.pattern", properties)); //$NON-NLS-1$ //$NON-NLS-2$
                buildModel.put("recipe_size_pattern", resolveProperty("recipe.size.pattern", properties)); //$NON-NLS-1$ //$NON-NLS-2$
 
                ArduinoTemplateGenerator templateGen = new ArduinoTemplateGenerator();
index a4f55b5..1875326 100644 (file)
@@ -26,8 +26,7 @@ import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 
 /**
- * This class is responsible for generating the Makefile for the current build
- * config.
+ * This class is responsible for generating the Makefile for the current build config.
  */
 public class ArduinoBuilder extends IncrementalProjectBuilder {
 
@@ -97,7 +96,7 @@ public class ArduinoBuilder extends IncrementalProjectBuilder {
                        String codeSizeRegex = config.getCodeSizeRegex();
                        Pattern codeSizePattern = codeSizeRegex != null ? Pattern.compile(codeSizeRegex) : null;
                        String dataSizeRegex = config.getDataSizeRegex();
-                       Pattern dataSizePattern = codeSizeRegex != null ? Pattern.compile(dataSizeRegex) : null;
+                       Pattern dataSizePattern = dataSizeRegex != null ? Pattern.compile(dataSizeRegex) : null;
 
                        if (codeSizePattern == null && dataSizePattern == null) {
                                return;
@@ -133,11 +132,13 @@ public class ArduinoBuilder extends IncrementalProjectBuilder {
                        }
                        console.writeOutput(" bytes\n");
 
-                       console.writeOutput("Initial RAM usage: " + dataSize);
-                       if (maxCodeSize > 0) {
-                               console.writeOutput(" of maximum " + maxDataSize);
+                       if (maxDataSize >= 0) {
+                               console.writeOutput("Initial RAM usage: " + dataSize);
+                               if (maxCodeSize > 0) {
+                                       console.writeOutput(" of maximum " + maxDataSize);
+                               }
+                               console.writeOutput(" bytes\n");
                        }
-                       console.writeOutput(" bytes\n");
                } catch (IOException e) {
                        throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Checking sizes", e));
                }
index e2c8974..e9bfc37 100644 (file)
@@ -48,14 +48,34 @@ LIBRARIES_OBJS = \
 </#if>
 </#list>
 
-all: ${build_path}/${project_name}.hex ${build_path}/${project_name}.eep
+TARGETS = \
+<#if recipe_objcopy_hex_pattern??>
+       ${build_path}/${project_name}.hex \
+</#if>
+<#if recipe_objcopy_epp_pattern??>
+       ${build_path}/${project_name}.eep \
+</#if>
+<#if recipe_objcopy_bin_pattern??>
+       ${build_path}/${project_name}.bin \
+</#if>
+
+all: $(TARGETS)
 
+<#if recipe_objcopy_hex_pattern??>
 ${build_path}/${project_name}.hex: ${build_path}/${project_name}.elf
        ${recipe_objcopy_hex_pattern}
 
+</#if>
+<#if recipe_objcopy_epp_pattern??>
 ${build_path}/${project_name}.eep: ${build_path}/${project_name}.elf
        ${recipe_objcopy_eep_pattern}
 
+</#if>
+<#if recipe_objcopy_bin_pattern??>
+${build_path}/${project_name}.bin: ${build_path}/${project_name}.elf
+       ${recipe_objcopy_bin_pattern}
+
+</#if>
 ${build_path}/${project_name}.elf: $(PROJECT_OBJS) $(LIBRARIES_OBJS) ${build_path}/core.a
        ${recipe_c_combine_pattern}