From 8cc9e5f3f02b495b6fa6b3f10b0a26b3a1960917 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Wed, 21 Oct 2015 22:19:30 -0400 Subject: [PATCH] Bug 480365 - Support Arduino Zero 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 --- .../core/internal/board/ArduinoPlatform.java | 6 ++- .../build/ArduinoBuildConfiguration.java | 42 +++++++++++-------- .../core/internal/build/ArduinoBuilder.java | 15 +++---- .../templates/board.mk | 22 +++++++++- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java index f3e38ca8c90..4c57d95dae1 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java @@ -210,12 +210,16 @@ public class ArduinoPlatform { } } - public Collection getSources(String core) { + public Collection getSources(String core, String variant) { List 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; } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java index f8d728cca35..b7340f1383b 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java @@ -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(); diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuilder.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuilder.java index a4f55b5dc0a..18753269114 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuilder.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuilder.java @@ -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)); } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk b/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk index e2c8974b3d8..e9bfc37c375 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk @@ -48,14 +48,34 @@ LIBRARIES_OBJS = \ -all: ${build_path}/${project_name}.hex ${build_path}/${project_name}.eep +TARGETS = \ +<#if recipe_objcopy_hex_pattern??> + ${build_path}/${project_name}.hex \ + +<#if recipe_objcopy_epp_pattern??> + ${build_path}/${project_name}.eep \ + +<#if recipe_objcopy_bin_pattern??> + ${build_path}/${project_name}.bin \ + +all: $(TARGETS) + +<#if recipe_objcopy_hex_pattern??> ${build_path}/${project_name}.hex: ${build_path}/${project_name}.elf ${recipe_objcopy_hex_pattern} + +<#if recipe_objcopy_epp_pattern??> ${build_path}/${project_name}.eep: ${build_path}/${project_name}.elf ${recipe_objcopy_eep_pattern} + +<#if recipe_objcopy_bin_pattern??> +${build_path}/${project_name}.bin: ${build_path}/${project_name}.elf + ${recipe_objcopy_bin_pattern} + + ${build_path}/${project_name}.elf: $(PROJECT_OBJS) $(LIBRARIES_OBJS) ${build_path}/core.a ${recipe_c_combine_pattern}