From 19629b7ab52db2c6eb61f9e063a763fd54285911 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Mon, 10 Aug 2015 23:33:15 -0400 Subject: [PATCH] Much progress on the Arduino build system. Change-Id: I437621ed8af02abddc05852bf6c1b62b50f17a25 --- .../internal/core/model/PathEntryManager.java | 537 ++++++++++-------- .../META-INF/MANIFEST.MF | 5 +- .../plugin.properties | 1 + .../org.eclipse.cdt.arduino.core/plugin.xml | 115 +--- .../core/ArduinoScannerInfoProvider.java | 37 ++ .../cdt/arduino/core/internal/Activator.java | 22 +- .../internal/ArduinoProjectGenerator.java | 137 ++--- .../internal/ArduinoTemplateGenerator.java | 58 ++ .../internal/AvrLanguageSettingsProvider.java | 72 --- .../arduino/core/internal/EnvVarSupplier.java | 118 ---- .../core/internal/HierarchicalProperties.java | 24 +- .../board/{Board.java => ArduinoBoard.java} | 24 +- .../internal/board/ArduinoBoardManager.java | 168 +++--- .../board/{Help.java => ArduinoHelp.java} | 2 +- ...{BoardPackage.java => ArduinoPackage.java} | 68 ++- .../core/internal/board/ArduinoPlatform.java | 176 ++++++ .../core/internal/board/ArduinoTool.java | 74 +++ .../internal/board/ArduinoToolSystem.java | 78 +++ .../core/internal/board/PackageIndex.java | 12 +- .../arduino/core/internal/board/Platform.java | 216 ------- .../cdt/arduino/core/internal/board/Tool.java | 30 - .../core/internal/board/ToolDependency.java | 34 ++ .../core/internal/board/ToolSystem.java | 38 -- .../build/ArduinoBuildConfiguration.java | 73 +++ .../core/internal/build/ArduinoBuilder.java | 138 ++++- .../ArduinoConsoleService.java} | 11 +- .../core/internal/console/ConsoleParser.java | 48 ++ .../ArduinoLaunchConfigurationDelegate.java | 86 +-- .../templates/board.mk | 21 + .../org.eclipse.cdt.arduino.ui/plugin.xml | 2 +- .../cdt/arduino/ui/internal/Activator.java | 13 +- .../cdt/arduino/ui/internal/Messages.java | 1 - .../ui/internal/launch/ArduinoConsole.java | 114 ++++ .../internal/launch/ArduinoLaunchConsole.java | 81 --- .../arduino/ui/internal/messages.properties | 5 +- .../ArduinoBoardsPreferencePage.java | 49 +- .../remote/ArduinoTargetPropertyPage.java | 14 +- .../remote/NewArduinoTargetWizardPage.java | 10 +- 38 files changed, 1424 insertions(+), 1288 deletions(-) create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/ArduinoScannerInfoProvider.java create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoTemplateGenerator.java delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/AvrLanguageSettingsProvider.java delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/EnvVarSupplier.java rename toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/{Board.java => ArduinoBoard.java} (73%) rename toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/{Help.java => ArduinoHelp.java} (95%) rename toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/{BoardPackage.java => ArduinoPackage.java} (62%) create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoTool.java create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoToolSystem.java delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Platform.java delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Tool.java delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolSystem.java create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java rename toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/{ArduinoLaunchConsoleService.java => console/ArduinoConsoleService.java} (67%) create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/console/ConsoleParser.java create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/launch/ArduinoConsole.java delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/launch/ArduinoLaunchConsole.java diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java index 0a891e22015..0b2e305248f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java @@ -89,13 +89,16 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange static String CONTAINER_INITIALIZER_EXTPOINT_ID = "PathEntryContainerInitializer"; //$NON-NLS-1$ /** - * An empty array of strings indicating that a project doesn't have any prerequesite projects. + * An empty array of strings indicating that a project doesn't have any + * prerequesite projects. */ static final String[] NO_PREREQUISITES = {}; /** - * pathentry containers pool accessing the Container is done synch with the class + * pathentry containers pool accessing the Container is done synch with the + * class */ - private static HashMap> Containers = new HashMap>(5); + private static HashMap> Containers = new HashMap>( + 5); static final IPathEntry[] NO_PATHENTRIES = {}; @@ -178,14 +181,14 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange public IIncludeFileEntry[] getIncludeFileEntries(IPath resPath) throws CModelException { ICElement celement = CoreModel.getDefault().create(resPath); if (celement instanceof ITranslationUnit) { - return getIncludeFileEntries((ITranslationUnit)celement); + return getIncludeFileEntries((ITranslationUnit) celement); } if (celement != null) { // Get project include file entries. List entryList = new ArrayList(); ICProject cproject = celement.getCProject(); ArrayList resolvedListEntries = getResolvedPathEntries(cproject, false); - IPathEntry[] pathEntries= getCachedResolvedPathEntries(resolvedListEntries, cproject); + IPathEntry[] pathEntries = getCachedResolvedPathEntries(resolvedListEntries, cproject); for (int i = 0; i < pathEntries.length; ++i) { IPathEntry entry = pathEntries[i]; if ((entry.getEntryKind() & IPathEntry.CDT_INCLUDE_FILE) != 0) { @@ -207,14 +210,14 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange public IIncludeEntry[] getIncludeEntries(IPath resPath) throws CModelException { ICElement celement = CoreModel.getDefault().create(resPath); if (celement instanceof ITranslationUnit) { - return getIncludeEntries((ITranslationUnit)celement); + return getIncludeEntries((ITranslationUnit) celement); } if (celement != null) { // get project include entries List entryList = new ArrayList(); ICProject cproject = celement.getCProject(); ArrayList resolvedListEntries = getResolvedPathEntries(cproject, false); - IPathEntry[] pathEntries= getCachedResolvedPathEntries(resolvedListEntries, cproject); + IPathEntry[] pathEntries = getCachedResolvedPathEntries(resolvedListEntries, cproject); for (int i = 0; i < pathEntries.length; ++i) { IPathEntry entry = pathEntries[i]; if ((entry.getEntryKind() & IPathEntry.CDT_INCLUDE) != 0) { @@ -233,30 +236,30 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return includes; } - public IMacroEntry[] getMacroEntries(IPath resPath) throws CModelException { + public IMacroEntry[] getMacroEntries(IPath resPath) throws CModelException { ICElement celement = CoreModel.getDefault().create(resPath); if (celement instanceof ITranslationUnit) { - return getMacroEntries((ITranslationUnit)celement); + return getMacroEntries((ITranslationUnit) celement); } if (celement != null) { // get project macro entries List entryList = new ArrayList(); ICProject cproject = celement.getCProject(); ArrayList resolvedListEntries = getResolvedPathEntries(cproject, false); - IPathEntry[] pathEntries= getCachedResolvedPathEntries(resolvedListEntries, cproject); + IPathEntry[] pathEntries = getCachedResolvedPathEntries(resolvedListEntries, cproject); for (int i = 0; i < pathEntries.length; ++i) { IPathEntry entry = pathEntries[i]; if ((entry.getEntryKind() & IPathEntry.CDT_MACRO) != 0) { entryList.add(entry); } } - IMacroEntry[] macros= entryList.toArray(new IMacroEntry[entryList.size()]); + IMacroEntry[] macros = entryList.toArray(new IMacroEntry[entryList.size()]); return macros; } return NO_MACRO_ENTRIES; } - private IMacroEntry[] getMacroEntries(ITranslationUnit cunit) throws CModelException { + private IMacroEntry[] getMacroEntries(ITranslationUnit cunit) throws CModelException { ArrayList macroList = new ArrayList(); ICProject cproject = cunit.getCProject(); IPath resPath = cunit.getPath(); @@ -271,8 +274,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange IPathEntryContainer[] containers = getPathEntryContainers(cproject); for (int i = 0; i < containers.length; ++i) { if (containers[i] instanceof IPathEntryContainerExtension) { - IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i]; - IPathEntry[] incs = extension.getPathEntries(resPath, IPathEntry.CDT_MACRO); + IPathEntryContainerExtension extension = (IPathEntryContainerExtension) containers[i]; + IPathEntry[] incs = extension.getPathEntries(resPath, IPathEntry.CDT_MACRO); macroList.addAll(Arrays.asList(incs)); } } @@ -282,7 +285,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange // For the macros the closest symbol will override // /projec/src/file.c --> NDEBUG=1 - // /project/src --> NDEBUG=0 + // /project/src --> NDEBUG=0 // // We will use NDEBUG=1 only int count = resPath.segmentCount(); @@ -306,13 +309,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange if (entry != null && entry.getEntryKind() == IPathEntry.CDT_PROJECT) { IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(entry.getPath()); if (res != null && res.getType() == IResource.PROJECT) { - ICProject refCProject = CoreModel.getDefault().create((IProject)res); + ICProject refCProject = CoreModel.getDefault().create((IProject) res); if (refCProject != null) { IPathEntry[] projEntries = refCProject.getResolvedPathEntries(); for (IPathEntry projEntry : projEntries) { if (projEntry.isExported()) { if (projEntry.getEntryKind() == IPathEntry.CDT_MACRO) { - IMacroEntry macro = (IMacroEntry)entry; + IMacroEntry macro = (IMacroEntry) entry; String key = macro.getMacroName(); if (!symbolMap.containsKey(key)) { symbolMap.put(key, macro); @@ -328,15 +331,15 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return symbolMap.values().toArray(NO_MACRO_ENTRIES); } - public IMacroFileEntry[] getMacroFileEntries(IPath resPath) throws CModelException { + public IMacroFileEntry[] getMacroFileEntries(IPath resPath) throws CModelException { ICElement celement = CoreModel.getDefault().create(resPath); if (celement instanceof ITranslationUnit) { - return getMacroFileEntries((ITranslationUnit)celement); + return getMacroFileEntries((ITranslationUnit) celement); } return NO_MACRO_FILE_ENTRIES; } - public IMacroFileEntry[] getMacroFileEntries(ITranslationUnit cunit) throws CModelException { + public IMacroFileEntry[] getMacroFileEntries(ITranslationUnit cunit) throws CModelException { List list = getPathEntries(cunit, IPathEntry.CDT_MACRO_FILE); IMacroFileEntry[] macFiles = list.toArray(new IMacroFileEntry[list.size()]); return macFiles; @@ -357,7 +360,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange IPathEntryContainer[] containers = getPathEntryContainers(cproject); for (int i = 0; i < containers.length; ++i) { if (containers[i] instanceof IPathEntryContainerExtension) { - IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i]; + IPathEntryContainerExtension extension = (IPathEntryContainerExtension) containers[i]; IPathEntry[] incs = extension.getPathEntries(resPath, type); entryList.addAll(Arrays.asList(incs)); } @@ -369,10 +372,10 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange // We need to reorder the include/macros: // includes with the closest match to the resource will come first - // /project/src/file.c --> /usr/local/include - // /project --> /usr/include + // /project/src/file.c --> /usr/local/include + // /project --> /usr/include // - // /usr/local/include must come first. + // /usr/local/include must come first. // int count = resPath.segmentCount(); for (int i = 0; i < count; i++) { @@ -392,7 +395,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange if (entry != null && entry.getEntryKind() == IPathEntry.CDT_PROJECT) { IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(entry.getPath()); if (res != null && res.getType() == IResource.PROJECT) { - ICProject refCProject = CoreModel.getDefault().create((IProject)res); + ICProject refCProject = CoreModel.getDefault().create((IProject) res); if (refCProject != null) { IPathEntry[] projEntries = refCProject.getResolvedPathEntries(); for (IPathEntry projEntry : projEntries) { @@ -411,6 +414,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange /** * Return the cached entries, if no cache null. + * * @param cproject */ protected IPathEntry[] getCachedResolvedPathEntries(ICProject cproject) { @@ -425,26 +429,26 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return null; } - public PathEntryResolveInfo getResolveInfo(ICProject cproject, boolean useCache) throws CModelException{ + public PathEntryResolveInfo getResolveInfo(ICProject cproject, boolean useCache) throws CModelException { PathEntryResolveInfo info = resolvedInfoMap.get(cproject); - if (info == null && useCache){ + if (info == null && useCache) { getResolvedPathEntries(cproject); info = resolvedInfoMap.get(cproject); } - if (info == null || !useCache || !getResolveInfoValidState(cproject)){ + if (info == null || !useCache || !getResolveInfoValidState(cproject)) { Object[] resolved = getResolvedPathEntries(cproject, false, false); if (resolved != null) - info = (PathEntryResolveInfo)resolved[1]; + info = (PathEntryResolveInfo) resolved[1]; } return info; } - private void setResolveInfoValidState(ICProject cproject, boolean valid){ + private void setResolveInfoValidState(ICProject cproject, boolean valid) { Object v = valid ? null : Boolean.FALSE; resolveInfoValidState.set(cproject, v); } - private boolean getResolveInfoValidState(ICProject cproject){ + private boolean getResolveInfoValidState(ICProject cproject) { return resolveInfoValidState.get(cproject) == null; } @@ -461,12 +465,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return null; } - private IPathEntry[] getCachedResolvedPathEntries(ArrayList resolvedListEntries, ICProject cproject) throws CModelException { + private IPathEntry[] getCachedResolvedPathEntries(ArrayList resolvedListEntries, + ICProject cproject) throws CModelException { IPathEntry[] entries = resolvedListEntries.toArray(NO_PATHENTRIES); boolean hasContainerExtension = false; for (IPathEntry entry : entries) { if (entry.getEntryKind() == IPathEntry.CDT_CONTAINER) { - IContainerEntry centry = (IContainerEntry)entry; + IContainerEntry centry = (IContainerEntry) entry; IPathEntryContainer container = getPathEntryContainer(centry, cproject); if (container instanceof IPathEntryContainerExtension) { hasContainerExtension = true; @@ -479,13 +484,14 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange ArrayList listEntries = new ArrayList(entries.length); for (int i = 0; i < entries.length; ++i) { if (entries[i].getEntryKind() == IPathEntry.CDT_CONTAINER) { - IContainerEntry centry = (IContainerEntry)entries[i]; + IContainerEntry centry = (IContainerEntry) entries[i]; IPathEntryContainer container = getPathEntryContainer(centry, cproject); if (container != null) { IPathEntry[] containerEntries = container.getPathEntries(); if (containerEntries != null) { for (IPathEntry containerEntry : containerEntries) { - IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, containerEntry); + IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, + containerEntry); listEntries.add(newEntry); } } @@ -506,7 +512,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } /** - * This method will not expand container extending IPathEntryContainerExtension + * This method will not expand container extending + * IPathEntryContainerExtension * * @param cproject * @param generateMarkers @@ -514,17 +521,19 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange * @throws CModelException */ @SuppressWarnings("unchecked") - private ArrayList getResolvedPathEntries(ICProject cproject, boolean generateMarkers) throws CModelException { + private ArrayList getResolvedPathEntries(ICProject cproject, boolean generateMarkers) + throws CModelException { Object[] result = getResolvedPathEntries(cproject, generateMarkers, true); if (result != null) return (ArrayList) result[0]; return null; } - private Object[] getResolvedPathEntries(ICProject cproject, boolean generateMarkers, boolean useCache) throws CModelException { + private Object[] getResolvedPathEntries(ICProject cproject, boolean generateMarkers, boolean useCache) + throws CModelException { ArrayList resolvedEntries = null; PathEntryResolveInfo rInfo = null; - if (useCache){ + if (useCache) { resolvedEntries = resolvedMap.get(cproject); rInfo = resolvedInfoMap.get(cproject); } @@ -536,17 +545,19 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange for (IPathEntry entry : rawEntries) { // Expand the containers. if (entry.getEntryKind() == IPathEntry.CDT_CONTAINER) { - IContainerEntry centry = (IContainerEntry)entry; + IContainerEntry centry = (IContainerEntry) entry; IPathEntryContainer container = getPathEntryContainer(centry, cproject); if (container != null) { - // For backward compatibility we need to expand and cache container that + // For backward compatibility we need to expand and + // cache container that // are not IPathEntryContainerExtension. if (!(container instanceof IPathEntryContainerExtension)) { IPathEntry[] containerEntries = container.getPathEntries(); List resolvedList = new ArrayList(); if (containerEntries != null) { for (IPathEntry containerEntry : containerEntries) { - IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, containerEntry); + IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, + containerEntry); resolvedEntries.add(newEntry); resolvedList.add(newEntry); } @@ -603,7 +614,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } rInfo = new PathEntryResolveInfo(resolveInfoList); - if (useCache){ + if (useCache) { resolvedMap.put(cproject, resolvedEntries); resolvedInfoMap.put(cproject, rInfo); } @@ -611,10 +622,12 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return new Object[] { resolvedEntries, rInfo }; } - public void setRawPathEntries(ICProject cproject, IPathEntry[] newEntries, IProgressMonitor monitor) throws CModelException { + public void setRawPathEntries(ICProject cproject, IPathEntry[] newEntries, IProgressMonitor monitor) + throws CModelException { try { IPathEntry[] oldResolvedEntries = getCachedResolvedPathEntries(cproject); - SetPathEntriesOperation op = new SetPathEntriesOperation(cproject, oldResolvedEntries, newEntries); + SetPathEntriesOperation op = new SetPathEntriesOperation(cproject, oldResolvedEntries, + newEntries); op.runOperation(monitor); } catch (CoreException e) { throw new CModelException(e); @@ -625,7 +638,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange IProject project = cproject.getProject(); // Check if the Project is accessible. if (!CoreModel.hasCNature(project) && !CoreModel.hasCCNature(project)) { - throw new CModelException(new CModelStatus(ICModelStatusConstants.ELEMENT_DOES_NOT_EXIST)); + throw new CModelException( + new CModelStatus(ICModelStatusConstants.ELEMENT_DOES_NOT_EXIST, cproject)); } IPathEntry[] pathEntries; try { @@ -666,17 +680,19 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return pathEntries; } - public void setPathEntryContainer(ICProject[] affectedProjects, IPathEntryContainer newContainer, IProgressMonitor monitor) - throws CModelException { + public void setPathEntryContainer(ICProject[] affectedProjects, IPathEntryContainer newContainer, + IProgressMonitor monitor) throws CModelException { - SetPathEntryContainerOperation op = new SetPathEntryContainerOperation(affectedProjects, newContainer); + SetPathEntryContainerOperation op = new SetPathEntryContainerOperation(affectedProjects, + newContainer); op.runOperation(monitor); } - public void clearPathEntryContainer(ICProject[] affectedProjects, IPath containerPath , IProgressMonitor monitor) - throws CModelException { + public void clearPathEntryContainer(ICProject[] affectedProjects, IPath containerPath, + IProgressMonitor monitor) throws CModelException { - SetPathEntryContainerOperation op = new SetPathEntryContainerOperation(affectedProjects, containerPath); + SetPathEntryContainerOperation op = new SetPathEntryContainerOperation(affectedProjects, + containerPath); op.runOperation(monitor); } @@ -685,44 +701,49 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange Map projectContainers = Containers.get(cproject); if (projectContainers != null) { Collection collection = projectContainers.values(); - pcs= collection.toArray(NO_PATHENTRYCONTAINERS); + pcs = collection.toArray(NO_PATHENTRYCONTAINERS); } return pcs; } - public IPathEntryContainer getPathEntryContainer(IContainerEntry entry, ICProject cproject) throws CModelException { + public IPathEntryContainer getPathEntryContainer(IContainerEntry entry, ICProject cproject) + throws CModelException { return getPathEntryContainer(entry.getPath(), cproject); } - public IPathEntryContainer getPathEntryContainer(final IPath containerPath, final ICProject project) throws CModelException { + public IPathEntryContainer getPathEntryContainer(final IPath containerPath, final ICProject project) + throws CModelException { // Try the cache. IPathEntryContainer container = containerGet(project, containerPath, true); if (container instanceof PathEntryContainerLock) { boolean runInitializer = false; - PathEntryContainerLock lock = (PathEntryContainerLock)container; + PathEntryContainerLock lock = (PathEntryContainerLock) container; synchronized (lock) { if (!lock.isContainerInitialize()) { runInitializer = true; lock.setContainerInitialize(runInitializer); - } else if (! Thread.holdsLock(lock)){ + } else if (!Thread.holdsLock(lock)) { // FIXME: Use Thread.holdsLock(lock) to break the cycle. - // This seem to happend when the container(say the auto discovery) - // trigger a resource change, the CoreModel will try to get the pathentries .. deadlock. + // This seem to happend when the container(say the auto + // discovery) + // trigger a resource change, the CoreModel will try to get + // the pathentries .. deadlock. // Wait for the inialization to finish. while (containerGet(project, containerPath, true) instanceof PathEntryContainerLock) { try { lock.wait(); } catch (InterruptedException e) { - //e.printStackTrace(); + // e.printStackTrace(); } } } } if (runInitializer) { // Remove the lock. - final PathEntryContainerInitializer initializer = getPathEntryContainerInitializer(containerPath.segment(0)); - final boolean[] ok = {false}; + final PathEntryContainerInitializer initializer = getPathEntryContainerInitializer( + containerPath.segment(0)); + final boolean[] ok = { false }; if (initializer != null) { // wrap initializer call with Safe runnable in case // initializer would be @@ -743,7 +764,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange }); } if (!ok[0]) { - containerPut(project, containerPath, null); // flush and notify + containerPut(project, containerPath, null); // flush and + // notify } } // Retrieve new value @@ -754,16 +776,16 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange /** * Helper method finding the container initializer registered for a given - * container ID or null if none was found while iterating - * over the contributions to extension point to the extension point + * container ID or null if none was found while iterating over + * the contributions to extension point to the extension point * "org.eclipse.cdt.core.PathEntryContainerInitializer". *

* A containerID is the first segment of any container path, used to * identify the registered container initializer. *

* - * @param containerID - - * a containerID identifying a registered initializer + * @param containerID + * - a containerID identifying a registered initializer * @return PathEntryContainerInitializer - the registered container * initializer or null if none was found. */ @@ -784,7 +806,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange try { Object execExt = configElement.createExecutableExtension("class"); //$NON-NLS-1$ if (execExt instanceof PathEntryContainerInitializer) { - return (PathEntryContainerInitializer)execExt; + return (PathEntryContainerInitializer) execExt; } } catch (CoreException e) { // Executable extension could not be created: @@ -797,7 +819,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return null; } - synchronized IPathEntryContainer containerGet(ICProject cproject, IPath containerPath, boolean bCreateLock) { + synchronized IPathEntryContainer containerGet(ICProject cproject, IPath containerPath, + boolean bCreateLock) { Map projectContainers = Containers.get(cproject); if (projectContainers == null) { projectContainers = new HashMap(); @@ -835,7 +858,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange Containers.remove(cproject); } - public void pathEntryContainerUpdates(IPathEntryContainerExtension container, PathEntryContainerChanged[] events, IProgressMonitor monitor) { + public void pathEntryContainerUpdates(IPathEntryContainerExtension container, + PathEntryContainerChanged[] events, IProgressMonitor monitor) { PathEntryContainerUpdatesOperation op = new PathEntryContainerUpdatesOperation(container, events); try { op.runOperation(monitor); @@ -882,7 +906,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange // Do not do this for container, the path is the ID. if (kind != IPathEntry.CDT_CONTAINER) { - // Translate to project relative from absolute (unless a device path) + // Translate to project relative from absolute (unless a device + // path) if (resourcePath.isAbsolute()) { if (projectPath != null && projectPath.isPrefixOf(resourcePath)) { if (resourcePath.segment(0).equals(projectPath.segment(0))) { @@ -898,84 +923,85 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange // Specifics to the entries IPathEntry entry; switch (kind) { - case IPathEntry.CDT_INCLUDE: { - IIncludeEntry include = (IIncludeEntry)pathEntry; - IPath baseRef = include.getBaseReference(); - if (baseRef == null || baseRef.isEmpty()) { - entry = CoreModel.newIncludeEntry(resourcePath, include.getBasePath(), include.getIncludePath(), - include.isSystemInclude(), include.getExclusionPatterns(), include.isExported()); - } else { - entry = CoreModel.newIncludeRefEntry(resourcePath, baseRef, include.getIncludePath()); - } - break; + case IPathEntry.CDT_INCLUDE: { + IIncludeEntry include = (IIncludeEntry) pathEntry; + IPath baseRef = include.getBaseReference(); + if (baseRef == null || baseRef.isEmpty()) { + entry = CoreModel.newIncludeEntry(resourcePath, include.getBasePath(), + include.getIncludePath(), include.isSystemInclude(), + include.getExclusionPatterns(), include.isExported()); + } else { + entry = CoreModel.newIncludeRefEntry(resourcePath, baseRef, include.getIncludePath()); } - case IPathEntry.CDT_INCLUDE_FILE: { - IIncludeFileEntry includeFile = (IIncludeFileEntry)pathEntry; - entry = CoreModel.newIncludeFileEntry(resourcePath, includeFile.getBasePath(), - includeFile.getBaseReference(), includeFile.getIncludeFilePath(), - includeFile.getExclusionPatterns(), includeFile.isExported()); - break; - } - case IPathEntry.CDT_LIBRARY: { - ILibraryEntry library = (ILibraryEntry)pathEntry; - IPath sourcePath = library.getSourceAttachmentPath(); - if (sourcePath != null) { - // Translate to project relative from absolute - if (projectPath != null && projectPath.isPrefixOf(sourcePath)) { - if (sourcePath.segment(0).equals(projectPath.segment(0))) { - sourcePath = sourcePath.removeFirstSegments(1); - sourcePath = sourcePath.makeRelative(); - } + break; + } + case IPathEntry.CDT_INCLUDE_FILE: { + IIncludeFileEntry includeFile = (IIncludeFileEntry) pathEntry; + entry = CoreModel.newIncludeFileEntry(resourcePath, includeFile.getBasePath(), + includeFile.getBaseReference(), includeFile.getIncludeFilePath(), + includeFile.getExclusionPatterns(), includeFile.isExported()); + break; + } + case IPathEntry.CDT_LIBRARY: { + ILibraryEntry library = (ILibraryEntry) pathEntry; + IPath sourcePath = library.getSourceAttachmentPath(); + if (sourcePath != null) { + // Translate to project relative from absolute + if (projectPath != null && projectPath.isPrefixOf(sourcePath)) { + if (sourcePath.segment(0).equals(projectPath.segment(0))) { + sourcePath = sourcePath.removeFirstSegments(1); + sourcePath = sourcePath.makeRelative(); } } - IPath baseRef = library.getBaseReference(); - if (baseRef == null || baseRef.isEmpty()) { - entry = CoreModel.newLibraryEntry(resourcePath, library.getBasePath(), library.getLibraryPath(), - sourcePath, library.getSourceAttachmentRootPath(), library.getSourceAttachmentPrefixMapping(), - library.isExported()); - } else { - entry = CoreModel.newLibraryRefEntry(resourcePath, baseRef, library.getLibraryPath()); - } - break; } - case IPathEntry.CDT_MACRO: { - IMacroEntry macro = (IMacroEntry)pathEntry; - IPath baseRef = macro.getBaseReference(); - if (baseRef == null || baseRef.isEmpty()) { - entry = CoreModel.newMacroEntry(resourcePath, macro.getMacroName(), macro.getMacroValue(), - macro.getExclusionPatterns(), macro.isExported()); - } else { - entry = CoreModel.newMacroRefEntry(resourcePath, baseRef, macro.getMacroName()); - } - break; + IPath baseRef = library.getBaseReference(); + if (baseRef == null || baseRef.isEmpty()) { + entry = CoreModel.newLibraryEntry(resourcePath, library.getBasePath(), + library.getLibraryPath(), sourcePath, library.getSourceAttachmentRootPath(), + library.getSourceAttachmentPrefixMapping(), library.isExported()); + } else { + entry = CoreModel.newLibraryRefEntry(resourcePath, baseRef, library.getLibraryPath()); } - case IPathEntry.CDT_MACRO_FILE: { - IMacroFileEntry macro = (IMacroFileEntry)pathEntry; - entry = CoreModel.newMacroFileEntry(resourcePath, macro.getBasePath(), - macro.getBaseReference(), macro.getMacroFilePath(), + break; + } + case IPathEntry.CDT_MACRO: { + IMacroEntry macro = (IMacroEntry) pathEntry; + IPath baseRef = macro.getBaseReference(); + if (baseRef == null || baseRef.isEmpty()) { + entry = CoreModel.newMacroEntry(resourcePath, macro.getMacroName(), macro.getMacroValue(), macro.getExclusionPatterns(), macro.isExported()); - break; + } else { + entry = CoreModel.newMacroRefEntry(resourcePath, baseRef, macro.getMacroName()); } - case IPathEntry.CDT_OUTPUT: { - IOutputEntry out = (IOutputEntry)pathEntry; - entry = CoreModel.newOutputEntry(resourcePath, out.getExclusionPatterns()); - break; - } - case IPathEntry.CDT_PROJECT: { - IProjectEntry projEntry = (IProjectEntry)pathEntry; - entry = CoreModel.newProjectEntry(projEntry.getPath(), projEntry.isExported()); - break; - } - case IPathEntry.CDT_SOURCE: { - ISourceEntry source = (ISourceEntry)pathEntry; - entry = CoreModel.newSourceEntry(resourcePath, source.getExclusionPatterns()); - break; - } - case IPathEntry.CDT_CONTAINER: - entry = CoreModel.newContainerEntry(pathEntry.getPath(), pathEntry.isExported()); - break; - default: - entry = pathEntry; + break; + } + case IPathEntry.CDT_MACRO_FILE: { + IMacroFileEntry macro = (IMacroFileEntry) pathEntry; + entry = CoreModel.newMacroFileEntry(resourcePath, macro.getBasePath(), + macro.getBaseReference(), macro.getMacroFilePath(), macro.getExclusionPatterns(), + macro.isExported()); + break; + } + case IPathEntry.CDT_OUTPUT: { + IOutputEntry out = (IOutputEntry) pathEntry; + entry = CoreModel.newOutputEntry(resourcePath, out.getExclusionPatterns()); + break; + } + case IPathEntry.CDT_PROJECT: { + IProjectEntry projEntry = (IProjectEntry) pathEntry; + entry = CoreModel.newProjectEntry(projEntry.getPath(), projEntry.isExported()); + break; + } + case IPathEntry.CDT_SOURCE: { + ISourceEntry source = (ISourceEntry) pathEntry; + entry = CoreModel.newSourceEntry(resourcePath, source.getExclusionPatterns()); + break; + } + case IPathEntry.CDT_CONTAINER: + entry = CoreModel.newContainerEntry(pathEntry.getPath(), pathEntry.isExported()); + break; + default: + entry = pathEntry; } list.add(entry); } @@ -993,9 +1019,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } /** - * Collects path entry errors for each project and generates error markers for these errors - * @param project - Project with path entry errors - * @param problems - The path entry errors associated with the project + * Collects path entry errors for each project and generates error markers + * for these errors + * + * @param project + * - Project with path entry errors + * @param problems + * - The path entry errors associated with the project */ public void addProblemMarkers(final IProject project, final ICModelStatus[] problems) { PathEntryProblem problem = new PathEntryProblem(project, problems); @@ -1025,7 +1055,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } } - private boolean needDelta(ICProject cproject){ + private boolean needDelta(ICProject cproject) { try { PathEntryStoreProxy store = (PathEntryStoreProxy) getPathEntryStore(cproject.getProject(), false); return store == null || !(store.getStore() instanceof ConfigBasedPathEntryStore); @@ -1034,7 +1064,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return false; } - public ICElementDelta[] generatePathEntryDeltas(ICProject cproject, IPathEntry[] oldEntries, IPathEntry[] newEntries) { + public ICElementDelta[] generatePathEntryDeltas(ICProject cproject, IPathEntry[] oldEntries, + IPathEntry[] newEntries) { if (!needDelta(cproject)) return new ICElementDelta[0]; @@ -1096,7 +1127,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } } } - // They may have remove some duplications, catch here .. consider it as reordering. + // They may have remove some duplications, catch here .. consider it as + // reordering. if (list.size() == 0 && oldEntries.length != newEntries.length) { ICElementDelta delta = makePathEntryDelta(cproject, null, true); if (delta != null) { @@ -1120,58 +1152,60 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } else { int kind = entry.getEntryKind(); switch (kind) { - case IPathEntry.CDT_SOURCE: { - ISourceEntry source = (ISourceEntry)entry; - IPath path = source.getPath(); - celement = CoreModel.getDefault().create(path); - flag = (removed) ? ICElementDelta.F_REMOVED_PATHENTRY_SOURCE : ICElementDelta.F_ADDED_PATHENTRY_SOURCE; - break; - } - case IPathEntry.CDT_LIBRARY: { - celement = cproject; - flag = (removed) ? ICElementDelta.F_REMOVED_PATHENTRY_LIBRARY : ICElementDelta.F_ADDED_PATHENTRY_LIBRARY; - break; - } - case IPathEntry.CDT_PROJECT: { - //IProjectEntry pentry = (IProjectEntry) entry; - celement = cproject; - flag = ICElementDelta.F_CHANGED_PATHENTRY_PROJECT; - break; - } - case IPathEntry.CDT_INCLUDE: { - IIncludeEntry include = (IIncludeEntry)entry; - IPath path = include.getPath(); - celement = CoreModel.getDefault().create(path); - flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE; - break; - } - case IPathEntry.CDT_INCLUDE_FILE: { - IIncludeFileEntry includeFile = (IIncludeFileEntry)entry; - IPath path = includeFile.getPath(); - celement = CoreModel.getDefault().create(path); - flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE; - break; - } - case IPathEntry.CDT_MACRO: { - IMacroEntry macro = (IMacroEntry)entry; - IPath path = macro.getPath(); - celement = CoreModel.getDefault().create(path); - flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO; - break; - } - case IPathEntry.CDT_MACRO_FILE: { - IMacroFileEntry macro = (IMacroFileEntry)entry; - IPath path = macro.getPath(); - celement = CoreModel.getDefault().create(path); - flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO; - break; - } - case IPathEntry.CDT_CONTAINER: { - //IContainerEntry container = (IContainerEntry) entry; - //celement = cproject; - //SHOULD NOT BE HERE Container are resolved. - break; - } + case IPathEntry.CDT_SOURCE: { + ISourceEntry source = (ISourceEntry) entry; + IPath path = source.getPath(); + celement = CoreModel.getDefault().create(path); + flag = (removed) ? ICElementDelta.F_REMOVED_PATHENTRY_SOURCE + : ICElementDelta.F_ADDED_PATHENTRY_SOURCE; + break; + } + case IPathEntry.CDT_LIBRARY: { + celement = cproject; + flag = (removed) ? ICElementDelta.F_REMOVED_PATHENTRY_LIBRARY + : ICElementDelta.F_ADDED_PATHENTRY_LIBRARY; + break; + } + case IPathEntry.CDT_PROJECT: { + // IProjectEntry pentry = (IProjectEntry) entry; + celement = cproject; + flag = ICElementDelta.F_CHANGED_PATHENTRY_PROJECT; + break; + } + case IPathEntry.CDT_INCLUDE: { + IIncludeEntry include = (IIncludeEntry) entry; + IPath path = include.getPath(); + celement = CoreModel.getDefault().create(path); + flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE; + break; + } + case IPathEntry.CDT_INCLUDE_FILE: { + IIncludeFileEntry includeFile = (IIncludeFileEntry) entry; + IPath path = includeFile.getPath(); + celement = CoreModel.getDefault().create(path); + flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE; + break; + } + case IPathEntry.CDT_MACRO: { + IMacroEntry macro = (IMacroEntry) entry; + IPath path = macro.getPath(); + celement = CoreModel.getDefault().create(path); + flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO; + break; + } + case IPathEntry.CDT_MACRO_FILE: { + IMacroFileEntry macro = (IMacroFileEntry) entry; + IPath path = macro.getPath(); + celement = CoreModel.getDefault().create(path); + flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO; + break; + } + case IPathEntry.CDT_CONTAINER: { + // IContainerEntry container = (IContainerEntry) entry; + // celement = cproject; + // SHOULD NOT BE HERE Container are resolved. + break; + } } } if (celement == null) { @@ -1222,16 +1256,16 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } public IPathEntryStore getPathEntryStore(IProject project, boolean create) throws CoreException { - synchronized (storeMap){ + synchronized (storeMap) { IPathEntryStore store = storeMap.get(project); if (store == null) { - if (create == true){ + if (create == true) { store = createPathEntryStore(project); storeMap.put(project, store); store.addPathEntryStoreListener(this); } - } else if (store instanceof AbstractCExtensionProxy){ - ((AbstractCExtensionProxy)store).updateProject(project); + } else if (store instanceof AbstractCExtensionProxy) { + ((AbstractCExtensionProxy) store).updateProject(project); } return store; } @@ -1239,45 +1273,50 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange public IPathEntryStore createPathEntryStore(IProject project) throws CoreException { return new PathEntryStoreProxy(project); -// IPathEntryStore store = null; -// if (project != null) { -// try { -// ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(project, false); -// if (cdesc != null) { -// ICExtensionReference[] cextensions = cdesc.get(PATHENTRY_STORE_UNIQ_ID, true); -// if (cextensions.length > 0) { -// for (int i = 0; i < cextensions.length; i++) { -// try { -// store = (IPathEntryStore)cextensions[i].createExtension(); -// break; -// } catch (ClassCastException e) { -// // -// CCorePlugin.log(e); -// } -// } -// } -// } -// } catch (CoreException e) { -// // ignore since we fall back to a default.... -// } -// } -// if (store == null) { -// store = createDefaultStore(project); -// } -// return store; + // IPathEntryStore store = null; + // if (project != null) { + // try { + // ICDescriptor cdesc = + // CCorePlugin.getDefault().getCProjectDescription(project, false); + // if (cdesc != null) { + // ICExtensionReference[] cextensions = + // cdesc.get(PATHENTRY_STORE_UNIQ_ID, true); + // if (cextensions.length > 0) { + // for (int i = 0; i < cextensions.length; i++) { + // try { + // store = (IPathEntryStore)cextensions[i].createExtension(); + // break; + // } catch (ClassCastException e) { + // // + // CCorePlugin.log(e); + // } + // } + // } + // } + // } catch (CoreException e) { + // // ignore since we fall back to a default.... + // } + // } + // if (store == null) { + // store = createDefaultStore(project); + // } + // return store; } -// private IPathEntryStore createDefaultStore(IProject project){ -// if (CProjectDescriptionManager.getInstance().isNewStyleIndexCfg(project)){ -// return new ConfigBasedPathEntryStore(project); -// } -// return new DefaultPathEntryStore(project); -// } + // private IPathEntryStore createDefaultStore(IProject project){ + // if + // (CProjectDescriptionManager.getInstance().isNewStyleIndexCfg(project)){ + // return new ConfigBasedPathEntryStore(project); + // } + // return new DefaultPathEntryStore(project); + // } /* * (non-Javadoc) * - * @see org.eclipse.cdt.core.resources.IPathEntryStoreListener#pathEntryStoreChanged(org.eclipse.cdt.core.resources.PathEntryChangedEvent) + * @see org.eclipse.cdt.core.resources.IPathEntryStoreListener# + * pathEntryStoreChanged(org.eclipse.cdt.core.resources. + * PathEntryChangedEvent) */ @Override public void pathEntryStoreChanged(PathEntryStoreChangedEvent event) { @@ -1318,11 +1357,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange if (entries != null) { IProject project = project2.getProject(); try { - IMarker[] markers = project.findMarkers(ICModelMarker.PATHENTRY_PROBLEM_MARKER, false, IResource.DEPTH_ZERO); + IMarker[] markers = project.findMarkers(ICModelMarker.PATHENTRY_PROBLEM_MARKER, + false, IResource.DEPTH_ZERO); if (markers != null && markers.length > 0) { ArrayList problemList = new ArrayList<>(); for (IPathEntry entry : entries) { - ICModelStatus status = PathEntryUtil.validatePathEntry(project2, entry, true, false); + ICModelStatus status = PathEntryUtil.validatePathEntry(project2, entry, + true, false); if (!status.isOK()) { problemList.add(status); } @@ -1350,7 +1391,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange // Handle open, closing and removing of projects if (type == ICElement.C_PROJECT) { - ICProject cproject = (ICProject)element; + ICProject cproject = (ICProject) element; if ((kind == ICElementDelta.REMOVED || kind == ICElementDelta.ADDED)) { if (kind == ICElementDelta.REMOVED) { IProject project = cproject.getProject(); @@ -1378,10 +1419,12 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return false; } if (kind == ICElementDelta.ADDED || kind == ICElementDelta.REMOVED) { - // If the element path maps to the some IPathEntry we need to remove that entry - // but I'm not sure of the side effects so lets just do this for the ISourceEntry type + // If the element path maps to the some IPathEntry we need to remove + // that entry + // but I'm not sure of the side effects so lets just do this for the + // ISourceEntry type if (element instanceof ISourceRoot) { - ISourceRoot sourceRoot = (ISourceRoot)element; + ISourceRoot sourceRoot = (ISourceRoot) element; if (kind == ICElementDelta.REMOVED) { updatePathEntryFromDeleteSource(sourceRoot); } @@ -1403,6 +1446,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange /** * The source root been deleted update the path entries + * * @param sourceRoot * @throws CModelException */ @@ -1429,7 +1473,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange Job updatePathEntry = new WorkspaceJob("PathEntry Update source roots") { //$NON-NLS-1$ @Override public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { - // If the path which triggered this change exists when we run this job then + // If the path which triggered this change exists when we + // run this job then // nothing to do. if (sourceRoot.getResource() == null || !sourceRoot.getResource().exists()) setRawPathEntries(cproject, finalEntries, monitor); @@ -1447,8 +1492,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return PathEntryUtil.validatePathEntry(cProject, entries); } - public ICModelStatus validatePathEntry(ICProject cProject, IPathEntry entry, boolean checkSourceAttachment, - boolean recurseInContainers) { + public ICModelStatus validatePathEntry(ICProject cProject, IPathEntry entry, + boolean checkSourceAttachment, boolean recurseInContainers) { return PathEntryUtil.validatePathEntry(cProject, entry, checkSourceAttachment, recurseInContainers); } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF b/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF index 54bfa1f117b..d6302fb05c0 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF @@ -9,8 +9,6 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.resources, org.eclipse.debug.core, org.eclipse.cdt.core, - org.eclipse.cdt.managedbuilder.core, - org.eclipse.cdt.managedbuilder.gnu.ui, org.eclipse.launchbar.core, org.eclipse.remote.core;bundle-version="2.0.0", org.eclipse.cdt.native.serial;bundle-version="1.0.0", @@ -25,5 +23,6 @@ Bundle-ClassPath: libs/freemarker-2.3.22.jar, . Export-Package: org.eclipse.cdt.arduino.core.internal;x-friends:="org.eclipse.cdt.arduino.ui", org.eclipse.cdt.arduino.core.internal.board;x-friends:="org.eclipse.cdt.arduino.ui", - org.eclipse.cdt.arduino.core.internal.build;x-friends:="org.eclipse.cdt.arduino.ui" + org.eclipse.cdt.arduino.core.internal.build;x-friends:="org.eclipse.cdt.arduino.ui", + org.eclipse.cdt.arduino.core.internal.console;x-friends:="org.eclipse.cdt.arduino.ui" Bundle-Localization: plugin diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.properties b/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.properties index 3ad49eae7cc..db0735247a7 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.properties +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.properties @@ -10,3 +10,4 @@ ############################################################################### pluginName=Arduino C++ Core providerName=Eclipse CDT +ArduinoBuilder.name=Arduino Builder diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml b/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml index a7733318764..d603ce83d68 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml @@ -2,95 +2,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + callOnEmptyDelta="true" + hasNature="true" + isConfigurable="true" + supportsConfigurations="true"> + + + + + + + + + + diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/ArduinoScannerInfoProvider.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/ArduinoScannerInfoProvider.java new file mode 100644 index 00000000000..c8a07d218ee --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/ArduinoScannerInfoProvider.java @@ -0,0 +1,37 @@ +package org.eclipse.cdt.arduino.core; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.core.parser.ExtendedScannerInfo; +import org.eclipse.cdt.core.parser.IScannerInfo; +import org.eclipse.cdt.core.parser.IScannerInfoChangeListener; +import org.eclipse.cdt.core.parser.IScannerInfoProvider; +import org.eclipse.core.resources.IResource; + +/** + * Responsible for collecting scanner info on Arduino Projects. + */ +public class ArduinoScannerInfoProvider implements IScannerInfoProvider { + + @Override + public IScannerInfo getScannerInformation(IResource resource) { + Map symbols = new HashMap<>(); + String[] includePath = { "/Users/dschaefer/.arduinocdt/hardware/arduino/avr/1.6.7/cores/arduino" }; + ExtendedScannerInfo scannerInfo = new ExtendedScannerInfo(symbols, includePath); + return scannerInfo; + } + + @Override + public void subscribe(IResource resource, IScannerInfoChangeListener listener) { + // TODO Auto-generated method stub + + } + + @Override + public void unsubscribe(IResource resource, IScannerInfoChangeListener listener) { + // TODO Auto-generated method stub + + } + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/Activator.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/Activator.java index 3a7dce67018..af57b6030c0 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/Activator.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/Activator.java @@ -10,12 +10,12 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal; -import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuilder; -import org.eclipse.cdt.core.model.CoreModel; -import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; -import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener; +import org.eclipse.cdt.arduino.core.internal.console.ArduinoConsoleService; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.eclipse.core.runtime.Status; import org.osgi.framework.BundleContext; @@ -47,14 +47,6 @@ public class Activator extends Plugin { public void start(BundleContext bundleContext) throws Exception { plugin = this; - - // register listener for build config changes - CoreModel.getDefault().addCProjectDescriptionListener(new ICProjectDescriptionListener() { - @Override - public void handleEvent(CProjectDescriptionEvent event) { - ArduinoBuilder.handleProjectDescEvent(event); - } - }, CProjectDescriptionEvent.APPLIED); } public void stop(BundleContext bundleContext) throws Exception { @@ -67,4 +59,10 @@ public class Activator extends Plugin { return ref != null ? context.getService(ref) : null; } + public static ArduinoConsoleService getConsoleService() throws CoreException { + IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(Activator.getId(), "consoleService"); //$NON-NLS-1$ + IExtension extension = point.getExtensions()[0]; // should only be one + return (ArduinoConsoleService) extension.getConfigurationElements()[0].createExecutableExtension("class"); //$NON-NLS-1$ + } + } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoProjectGenerator.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoProjectGenerator.java index 64a18c53f6e..d2176393212 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoProjectGenerator.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoProjectGenerator.java @@ -10,47 +10,27 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal; -import java.io.File; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import java.io.Writer; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; +import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuildConfiguration; import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuilder; -import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection; -import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.settings.model.ICProjectDescription; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; -import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject; +import org.eclipse.cdt.core.CCProjectNature; +import org.eclipse.cdt.core.CProjectNature; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.IPathEntry; +import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.IRemoteConnectionType; -import org.eclipse.remote.core.IRemoteServicesManager; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; - -@SuppressWarnings("restriction") public class ArduinoProjectGenerator { private final IProject project; @@ -61,100 +41,51 @@ public class ArduinoProjectGenerator { } public void setupArduinoProject(IProgressMonitor monitor) throws CoreException { - // Add Arduino nature + // Add natures to project: C, C++, Arduino IProjectDescription projDesc = project.getDescription(); String[] oldIds = projDesc.getNatureIds(); - String[] newIds = new String[oldIds.length + 1]; + String[] newIds = new String[oldIds.length + 3]; System.arraycopy(oldIds, 0, newIds, 0, oldIds.length); + newIds[newIds.length - 3] = CProjectNature.C_NATURE_ID; + newIds[newIds.length - 2] = CCProjectNature.CC_NATURE_ID; newIds[newIds.length - 1] = ArduinoProjectNature.ID; projDesc.setNatureIds(newIds); // Add Arduino Builder ICommand command = projDesc.newCommand(); command.setBuilderName(ArduinoBuilder.ID); + command.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, false); projDesc.setBuildSpec(new ICommand[] { command }); + // Create the default config + projDesc.setBuildConfigs(new String[] { "arduinoDefault" }); //$NON-NLS-1$ + project.setDescription(projDesc, monitor); - // create the CDT natures and build setup - CCorePlugin.getDefault().createCDTProject(projDesc, project, monitor); - ICProjectDescription cprojDesc = CCorePlugin.getDefault().createProjectDescription(project, false); - ManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project); - ManagedProject mProj = new ManagedProject(cprojDesc); - info.setManagedProject(mProj); - - // TODO make this a preference, the default board - String boardName = "Arduino Uno"; //$NON-NLS-1$ - String platformName = "Arduino AVR Boards"; //$NON-NLS-1$ - String packageName = "arduino"; //$NON-NLS-1$ - - IRemoteServicesManager remoteManager = Activator.getService(IRemoteServicesManager.class); - IRemoteConnectionType connectionType = remoteManager.getConnectionType(ArduinoRemoteConnection.TYPE_ID); - Collection connections = connectionType.getConnections(); - if (!connections.isEmpty()) { - IRemoteConnection firstConnection = connections.iterator().next(); - IArduinoRemoteConnection firstArduino = firstConnection.getService(IArduinoRemoteConnection.class); - boardName = firstArduino.getBoardName(); - platformName = firstArduino.getPlatformName(); - packageName = firstArduino.getPackageName(); - } - - ArduinoBoardManager.instance.createBuildConfiguration(cprojDesc, boardName, platformName, packageName); - CCorePlugin.getDefault().setProjectDescription(project, cprojDesc, true, monitor); + // Test config + IBuildConfiguration config = project.getBuildConfig("arduinoDefault"); //$NON-NLS-1$ + ArduinoBuildConfiguration arduinoConfig = config.getAdapter(ArduinoBuildConfiguration.class); + // TODO for now assume Uno + ArduinoBoard board = ArduinoBoardManager.instance.getBoard("Arduino Uno", "Arduino AVR Boards", "arduino"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + arduinoConfig.setBoard(board); // Generate files - try { - Configuration fmConfig = new Configuration(Configuration.VERSION_2_3_22); - URL templateDirURL = FileLocator.find(Activator.getContext().getBundle(), new Path("/templates"), null); //$NON-NLS-1$ - fmConfig.setDirectoryForTemplateLoading(new File(FileLocator.toFileURL(templateDirURL).toURI())); + ArduinoTemplateGenerator templateGen = new ArduinoTemplateGenerator(); + Map fmModel = new HashMap<>(); + fmModel.put("projectName", project.getName()); //$NON-NLS-1$ - final Map fmModel = new HashMap<>(); - fmModel.put("projectName", project.getName()); //$NON-NLS-1$ + templateGen.generateFile(fmModel, "Makefile", project.getFile("Makefile"), monitor); //$NON-NLS-1$ //$NON-NLS-2$ + templateGen.generateFile(fmModel, "arduino.mk", project.getFile("arduino.mk"), monitor); //$NON-NLS-1$ //$NON-NLS-2$ - generateFile(fmModel, fmConfig.getTemplate("Makefile"), project.getFile("Makefile")); //$NON-NLS-1$ //$NON-NLS-2$ - generateFile(fmModel, fmConfig.getTemplate("arduino.mk"), project.getFile("arduino.mk")); //$NON-NLS-1$ //$NON-NLS-2$ - - sourceFile = project.getFile(project.getName() + ".cpp"); //$NON-NLS-1$ - generateFile(fmModel, fmConfig.getTemplate("arduino.cpp"), sourceFile); //$NON-NLS-1$ - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e)); - } catch (URISyntaxException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e)); - } catch (TemplateException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e)); + IFolder sourceFolder = project.getFolder("src"); //$NON-NLS-1$ + if (!sourceFolder.exists()) { + sourceFolder.create(true, true, monitor); } + IPathEntry[] entries = new IPathEntry[] { CoreModel.newOutputEntry(sourceFolder.getFullPath()) }; + CoreModel.getDefault().create(project).setRawPathEntries(entries, monitor); - // Do the initial build - project.build(IncrementalProjectBuilder.FULL_BUILD, monitor); - } - - private static void generateFile(Object model, Template template, final IFile outputFile) - throws TemplateException, IOException, CoreException { - final PipedInputStream in = new PipedInputStream(); - PipedOutputStream out = new PipedOutputStream(in); - final Writer writer = new OutputStreamWriter(out); - Job job = new Job(Messages.ArduinoProjectGenerator_0) { - protected IStatus run(IProgressMonitor monitor) { - try { - outputFile.create(in, true, monitor); - } catch (CoreException e) { - return e.getStatus(); - } - return Status.OK_STATUS; - } - }; - job.setRule(outputFile.getProject()); - job.schedule(); - template.process(model, writer); - writer.close(); - try { - job.join(); - } catch (InterruptedException e) { - // TODO anything? - } - IStatus status = job.getResult(); - if (!status.isOK()) - throw new CoreException(status); + sourceFile = sourceFolder.getFile(project.getName() + ".cpp"); //$NON-NLS-1$ + templateGen.generateFile(fmModel, "arduino.cpp", sourceFile, monitor); //$NON-NLS-1$ } public IFile getSourceFile() { diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoTemplateGenerator.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoTemplateGenerator.java new file mode 100644 index 00000000000..56fc5b9aa44 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoTemplateGenerator.java @@ -0,0 +1,58 @@ +package org.eclipse.cdt.arduino.core.internal; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; + +public class ArduinoTemplateGenerator { + + private final Configuration config; + + public ArduinoTemplateGenerator() throws CoreException { + config = new Configuration(Configuration.VERSION_2_3_22); + URL templateDirURL = FileLocator.find(Activator.getContext().getBundle(), new Path("/templates"), null); //$NON-NLS-1$ + try { + config.setDirectoryForTemplateLoading(new File(FileLocator.toFileURL(templateDirURL).toURI())); + } catch (IOException | URISyntaxException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Template configuration", e)); + } + } + + public void generateFile(final Object model, String templateFile, final IFile outputFile, IProgressMonitor monitor) + throws CoreException { + try { + final Template template = config.getTemplate(templateFile); + try (StringWriter writer = new StringWriter()) { + template.process(model, writer); + try (ByteArrayInputStream in = new ByteArrayInputStream( + writer.getBuffer().toString().getBytes(StandardCharsets.UTF_8))) { + if (outputFile.exists()) { + outputFile.setContents(in, true, true, monitor); + } else { + outputFile.create(in, true, monitor); + } + } + } + } catch (IOException | TemplateException e) { + throw new CoreException( + new Status(IStatus.ERROR, Activator.getId(), "Processing template " + templateFile, e)); + } + } + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/AvrLanguageSettingsProvider.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/AvrLanguageSettingsProvider.java deleted file mode 100644 index 0165cdc6a31..00000000000 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/AvrLanguageSettingsProvider.java +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * QNX Software Systems - Initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.arduino.core.internal; - -import java.io.File; -import java.util.List; - -import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; -import org.eclipse.cdt.arduino.core.internal.board.Board; -import org.eclipse.cdt.managedbuilder.core.IConfiguration; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.Platform; - -public class AvrLanguageSettingsProvider extends GCCBuiltinSpecsDetector { - - @Override - public String getToolchainId() { - return "org.eclipse.cdt.arduino.toolChain.avr"; //$NON-NLS-1$ - } - - @Override - protected String getToolOptions(String languageId) { - String opts = super.getToolOptions(languageId); - - try { - IConfiguration config = ManagedBuildManager.getConfigurationForDescription(currentCfgDescription); - Board board = ArduinoBoardManager.instance.getBoard(config); - String mcu = board.getProperty("build.mcu"); //$NON-NLS-1$ - if (mcu != null) { - opts += " -mmcu=" + mcu; //$NON-NLS-1$ - } - } catch (CoreException e) { - Activator.getPlugin().getLog().log(e.getStatus()); - } - - return opts; - } - - @Override - protected List parseOptions(String line) { - if (Platform.getOS().equals(Platform.OS_WIN32)) { - if (line.startsWith(" /arduino/")) { //$NON-NLS-1$ - // TODO - File full = new File(ArduinoPreferences.getArduinoHome().toFile(), line.trim()); - return parseOptions(" " + full.getAbsolutePath()); //$NON-NLS-1$ - } - } - - return super.parseOptions(line); - } - - @Override - public AvrLanguageSettingsProvider cloneShallow() throws CloneNotSupportedException { - return (AvrLanguageSettingsProvider) super.cloneShallow(); - } - - @Override - public AvrLanguageSettingsProvider clone() throws CloneNotSupportedException { - return (AvrLanguageSettingsProvider) super.clone(); - } - -} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/EnvVarSupplier.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/EnvVarSupplier.java deleted file mode 100644 index 24f8a4ffd92..00000000000 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/EnvVarSupplier.java +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * QNX Software Systems - Initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.arduino.core.internal; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.cdt.managedbuilder.core.IConfiguration; -import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable; -import org.eclipse.cdt.managedbuilder.envvar.IConfigurationEnvironmentVariableSupplier; -import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider; -import org.eclipse.core.runtime.Platform; - -public class EnvVarSupplier implements IConfigurationEnvironmentVariableSupplier { - - private EnvVar arduinoHome; - private EnvVar arduinoLibs; - private EnvVar path; - - private static final String OUTPUT_DIR = "OUTPUT_DIR"; //$NON-NLS-1$ - - private static final class EnvVar implements IBuildEnvironmentVariable { - String name; - String value; - int operation = IBuildEnvironmentVariable.ENVVAR_REPLACE; - String delimiter = null; - - @Override - public String getName() { - return name; - } - - @Override - public String getValue() { - return value; - } - - @Override - public int getOperation() { - return operation; - } - - @Override - public String getDelimiter() { - return delimiter; - } - } - - private String clean(String str) { - return str.replaceAll("\\\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$ - } - - public EnvVarSupplier() { - arduinoHome = new EnvVar(); - arduinoHome.name = "ARDUINO_HOME"; //$NON-NLS-1$ - arduinoHome.value = clean(ArduinoPreferences.getArduinoHome().toString()); - - arduinoLibs = new EnvVar(); - arduinoLibs.name = "ARDUINO_USER_LIBS"; //$NON-NLS-1$ - arduinoLibs.value = clean(System.getProperty("user.home") + "/Documents/Arduino/libraries"); //$NON-NLS-1$ //$NON-NLS-2$ - - String avrDir = ArduinoPreferences.getArduinoHome().toString() + "/hardware/tools/avr/bin"; //$NON-NLS-1$ - String installDir = Platform.getInstallLocation().getURL().getPath(); - path = new EnvVar(); - path.name = "PATH"; //$NON-NLS-1$ - path.value = avrDir + File.pathSeparator + installDir; - path.operation = IBuildEnvironmentVariable.ENVVAR_PREPEND; - path.delimiter = File.pathSeparator; - } - - private IBuildEnvironmentVariable getOutputDir(IConfiguration configuration) { - EnvVar outputDir = new EnvVar(); - outputDir.name = OUTPUT_DIR; - outputDir.value = "build/" + configuration.getName(); //$NON-NLS-1$ - return outputDir; - } - - @Override - public IBuildEnvironmentVariable getVariable(String variableName, IConfiguration configuration, - IEnvironmentVariableProvider provider) { - if (variableName.equals(path.name)) { - return path; - } else if (variableName.equals(arduinoHome.name)) { - return arduinoHome; - } else if (variableName.equals(arduinoLibs.name)) { - return arduinoLibs; - } else if (variableName.equals(OUTPUT_DIR)) { - return getOutputDir(configuration); - } - return null; - } - - @Override - public IBuildEnvironmentVariable[] getVariables(IConfiguration configuration, - IEnvironmentVariableProvider provider) { - List vars = new ArrayList<>(); - - vars.add(path); - vars.add(arduinoHome); - vars.add(arduinoLibs); - - if (configuration != null) { - vars.add(getOutputDir(configuration)); - } - - return vars.toArray(new IBuildEnvironmentVariable[vars.size()]); - } - -} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java index 2271ddc609a..6effa7af20a 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java @@ -68,7 +68,7 @@ public class HierarchicalProperties { HierarchicalProperties child = children.get(key); if (child == null) { child = new HierarchicalProperties(); - children.put(qualifiedKey, child); + children.put(key, child); } String childKey = qualifiedKey.substring(i + 1); child.putProperty(childKey, value); @@ -133,4 +133,26 @@ public class HierarchicalProperties { } } + public Properties flatten() { + Properties properties = new Properties(); + flatten(null, this, properties); + return properties; + } + + private static void flatten(String prefix, HierarchicalProperties tree, Properties props) { + if (tree.getValue() != null && prefix != null) { + props.put(prefix, tree.getValue()); + } + + if (tree.getChildren() != null) { + for (Map.Entry entry : tree.getChildren().entrySet()) { + String childPrefix = entry.getKey(); + if (prefix != null) { + childPrefix = prefix + "." + childPrefix; //$NON-NLS-1$ + } + flatten(childPrefix, entry.getValue(), props); + } + } + } + } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Board.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoard.java similarity index 73% rename from toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Board.java rename to toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoard.java index 4f2afacb42c..7b4b26e5d10 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Board.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoard.java @@ -7,23 +7,25 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.board; +import java.util.Properties; + import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties; -public class Board { +public class ArduinoBoard { private String name; private String id; - private Platform platform; + private ArduinoPlatform platform; private HierarchicalProperties properties; - public Board() { + public ArduinoBoard() { } - public Board(HierarchicalProperties properties) { + public ArduinoBoard(String id, HierarchicalProperties properties) { this.properties = properties; - this.id = this.properties.getValue(); + this.id = id; this.name = this.properties.getChild("name").getValue(); //$NON-NLS-1$ } @@ -35,11 +37,11 @@ public class Board { return id; } - public Platform getPlatform() { + public ArduinoPlatform getPlatform() { return platform; } - Board setOwners(Platform platform) { + ArduinoBoard setOwners(ArduinoPlatform platform) { this.platform = platform; return this; } @@ -48,12 +50,8 @@ public class Board { return properties.getProperty(key); } - public String getPlatformId() { - return platform.getArchitecture(); - } - - public String getPackageId() { - return platform.getPackage().getName(); + public Properties getBoardProperties() { + return properties.flatten(); } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoardManager.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoardManager.java index f5bdd4a34b7..bc7d96c8565 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoardManager.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoardManager.java @@ -10,32 +10,28 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.board; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; -import org.apache.http.HttpEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.ArchiveException; +import org.apache.commons.compress.archivers.ArchiveInputStream; +import org.apache.commons.compress.archivers.ArchiveStreamFactory; +import org.apache.commons.compress.compressors.CompressorException; +import org.apache.commons.compress.compressors.CompressorStreamFactory; import org.eclipse.cdt.arduino.core.internal.Activator; import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; import org.eclipse.cdt.arduino.core.internal.Messages; -import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; -import org.eclipse.cdt.core.settings.model.ICProjectDescription; -import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; -import org.eclipse.cdt.managedbuilder.core.BuildException; -import org.eclipse.cdt.managedbuilder.core.IConfiguration; -import org.eclipse.cdt.managedbuilder.core.IOption; -import org.eclipse.cdt.managedbuilder.core.IToolChain; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject; -import org.eclipse.cdt.managedbuilder.internal.core.ToolChain; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -62,21 +58,10 @@ public class ArduinoBoardManager { public ArduinoBoardManager() { new Job(Messages.ArduinoBoardManager_0) { protected IStatus run(IProgressMonitor monitor) { - try (CloseableHttpClient client = HttpClients.createDefault()) { - HttpGet get = new HttpGet("http://downloads.arduino.cc/packages/package_index.json"); //$NON-NLS-1$ - try (CloseableHttpResponse response = client.execute(get)) { - if (response.getStatusLine().getStatusCode() >= 400) { - return new Status(IStatus.ERROR, Activator.getId(), - response.getStatusLine().getReasonPhrase()); - } else { - HttpEntity entity = response.getEntity(); - if (entity == null) { - return new Status(IStatus.ERROR, Activator.getId(), Messages.ArduinoBoardManager_1); - } - Files.createDirectories(packageIndexPath.getParent()); - Files.copy(entity.getContent(), packageIndexPath, StandardCopyOption.REPLACE_EXISTING); - } - } + try { + URL url = new URL("http://downloads.arduino.cc/packages/package_index.json"); //$NON-NLS-1$ + Files.createDirectories(packageIndexPath.getParent()); + Files.copy(url.openStream(), packageIndexPath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { return new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e); } @@ -85,72 +70,99 @@ public class ArduinoBoardManager { }.schedule(); } - public PackageIndex getPackageIndex() throws IOException { + public PackageIndex getPackageIndex() throws CoreException { if (packageIndex == null) { try (FileReader reader = new FileReader(packageIndexPath.toFile())) { packageIndex = new Gson().fromJson(reader, PackageIndex.class); packageIndex.setOwners(this); + } catch (IOException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Reading package index", e)); } } return packageIndex; } - public ICConfigurationDescription createBuildConfiguration(ICProjectDescription projDesc, String boardId, - String platformId, String packageId) throws CoreException { - Board board = packageIndex.getPackage(packageId).getPlatform(platformId).getBoard(boardId); - ManagedProject managedProject = new ManagedProject(projDesc); - // TODO find toolchain based on package (os), platform (arch). - String configId = ManagedBuildManager.calculateChildId(ArduinoBoardManager.AVR_TOOLCHAIN_ID, null); - IToolChain avrToolChain = ManagedBuildManager.getExtensionToolChain(ArduinoBoardManager.AVR_TOOLCHAIN_ID); - - org.eclipse.cdt.managedbuilder.internal.core.Configuration newConfig = new org.eclipse.cdt.managedbuilder.internal.core.Configuration( - managedProject, (ToolChain) avrToolChain, configId, board.getName()); - - IToolChain newToolChain = newConfig.getToolChain(); - IOption boardOption = newToolChain.getOptionBySuperClassId(BOARD_OPTION_ID); - ManagedBuildManager.setOption(newConfig, newToolChain, boardOption, boardId); - IOption platformOption = newToolChain.getOptionBySuperClassId(PLATFORM_OPTION_ID); - ManagedBuildManager.setOption(newConfig, newToolChain, platformOption, platformId); - IOption packageOption = newToolChain.getOptionBySuperClassId(PACKAGE_OPTION_ID); - ManagedBuildManager.setOption(newConfig, newToolChain, packageOption, packageId); - - CConfigurationData data = newConfig.getConfigurationData(); - return projDesc.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data); + public ArduinoBoard getBoard(String boardName, String platformName, String packageName) throws CoreException { + return getPackageIndex().getPackage(packageName).getPlatform(platformName).getBoard(boardName); } - public Board getBoard(String boardName, String platformName, String packageName) throws CoreException { - return packageIndex.getPackage(packageName).getPlatform(platformName).getBoard(boardName); - } - - public Board getBoard(IConfiguration configuration) throws CoreException { - try { - IToolChain toolChain = configuration.getToolChain(); - IOption boardOption = toolChain.getOptionBySuperClassId(BOARD_OPTION_ID); - String boardName = boardOption.getStringValue(); - IOption platformOption = toolChain.getOptionBySuperClassId(PLATFORM_OPTION_ID); - String platformName = platformOption.getStringValue(); - IOption packageOption = toolChain.getOptionBySuperClassId(PACKAGE_OPTION_ID); - String packageName = packageOption.getStringValue(); - - return getBoard(boardName, platformName, packageName); - } catch (BuildException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e)); - } - } - - public List getBoards() throws CoreException { - List boards = new ArrayList<>(); - for (BoardPackage pkg : packageIndex.getPackages()) { - for (Platform platform : pkg.getPlatforms()) { + public List getBoards() throws CoreException { + List boards = new ArrayList<>(); + for (ArduinoPackage pkg : packageIndex.getPackages()) { + for (ArduinoPlatform platform : pkg.getPlatforms()) { boards.addAll(platform.getBoards()); } } return boards; } - public Tool getTool(String packageName, String toolName, String version) { - BoardPackage pkg = packageIndex.getPackage(packageName); + public ArduinoTool getTool(String packageName, String toolName, String version) { + ArduinoPackage pkg = packageIndex.getPackage(packageName); return pkg != null ? pkg.getTool(toolName, version) : null; } + public static IStatus downloadAndInstall(String url, String archiveFileName, Path installPath, + IProgressMonitor monitor) { + try { + URL dl = new URL(url); + Path dlDir = ArduinoPreferences.getArduinoHome().resolve("downloads"); + Files.createDirectories(dlDir); + Path archivePath = dlDir.resolve(archiveFileName); + Files.copy(dl.openStream(), archivePath, StandardCopyOption.REPLACE_EXISTING); + + // extract + ArchiveInputStream archiveIn = null; + try { + String compressor = null; + String archiver = null; + if (archiveFileName.endsWith("tar.bz2")) { //$NON-NLS-1$ + compressor = CompressorStreamFactory.BZIP2; + archiver = ArchiveStreamFactory.TAR; + } else if (archiveFileName.endsWith(".tar.gz") || archiveFileName.endsWith(".tgz")) { //$NON-NLS-1$ //$NON-NLS-2$ + compressor = CompressorStreamFactory.GZIP; + archiver = ArchiveStreamFactory.TAR; + } else if (archiveFileName.endsWith(".tar.xz")) { //$NON-NLS-1$ + compressor = CompressorStreamFactory.XZ; + archiver = ArchiveStreamFactory.TAR; + } else if (archiveFileName.endsWith(".zip")) { //$NON-NLS-1$ + archiver = ArchiveStreamFactory.ZIP; + } + + InputStream in = new BufferedInputStream(new FileInputStream(archivePath.toFile())); + if (compressor != null) { + in = new CompressorStreamFactory().createCompressorInputStream(compressor, in); + } + archiveIn = new ArchiveStreamFactory().createArchiveInputStream(archiver, in); + + for (ArchiveEntry entry = archiveIn.getNextEntry(); entry != null; entry = archiveIn.getNextEntry()) { + if (entry.isDirectory()) { + continue; + } + + // TODO check for soft links in tar files. + Path entryPath = installPath.resolve(entry.getName()); + Files.createDirectories(entryPath.getParent()); + Files.copy(archiveIn, entryPath, StandardCopyOption.REPLACE_EXISTING); + } + } finally { + if (archiveIn != null) { + archiveIn.close(); + } + } + + // Fix up directory + File[] children = installPath.toFile().listFiles(); + if (children.length == 1 && children[0].isDirectory()) { + // make that directory the install path + Path childPath = children[0].toPath(); + Path tmpPath = installPath.getParent().resolve("_t"); //$NON-NLS-1$ + Files.move(childPath, tmpPath); + Files.delete(installPath); + Files.move(tmpPath, installPath); + } + return Status.OK_STATUS; + } catch (IOException | CompressorException | ArchiveException e) { + return new Status(IStatus.ERROR, Activator.getId(), "Installing Platform", e); + } + } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Help.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoHelp.java similarity index 95% rename from toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Help.java rename to toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoHelp.java index eae2f225103..902748925fe 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Help.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoHelp.java @@ -7,7 +7,7 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.board; -public class Help { +public class ArduinoHelp { private String online; diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/BoardPackage.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java similarity index 62% rename from toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/BoardPackage.java rename to toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java index 74ff5a15f9c..70c6e00e069 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/BoardPackage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java @@ -15,22 +15,25 @@ import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; -public class BoardPackage { +public class ArduinoPackage { private String name; private String maintainer; private String websiteURL; private String email; - private Help help; - private List platforms; - private List tools; + private ArduinoHelp help; + private List platforms; + private List tools; private transient ArduinoBoardManager manager; - void setOwners(ArduinoBoardManager manager) { + void setOwner(ArduinoBoardManager manager) { this.manager = manager; - for (Platform platform : platforms) { - platform.setOwners(this); + for (ArduinoPlatform platform : platforms) { + platform.setOwner(this); + } + for (ArduinoTool tool : tools) { + tool.setOwner(this); } } @@ -54,11 +57,11 @@ public class BoardPackage { return email; } - public Help getHelp() { + public ArduinoHelp getHelp() { return help; } - public Collection getPlatforms() { + public Collection getPlatforms() { return Collections.unmodifiableCollection(platforms); } @@ -67,10 +70,10 @@ public class BoardPackage { * * @return latest platforms */ - public Collection getLatestPlatforms() { - Map platformMap = new HashMap<>(); - for (Platform platform : platforms) { - Platform p = platformMap.get(platform.getName()); + public Collection getLatestPlatforms() { + Map platformMap = new HashMap<>(); + for (ArduinoPlatform platform : platforms) { + ArduinoPlatform p = platformMap.get(platform.getName()); if (p == null || compareVersions(platform.getVersion(), p.getVersion()) > 0) { platformMap.put(platform.getName(), platform); } @@ -124,22 +127,30 @@ public class BoardPackage { return 0; } - public Platform getPlatform(String architecture) { - for (Platform platform : platforms) { - if (platform.getArchitecture().equals(architecture)) { - return platform; + public ArduinoPlatform getPlatform(String name) { + ArduinoPlatform foundPlatform = null; + for (ArduinoPlatform platform : platforms) { + if (platform.getName().equals(name)) { + if (foundPlatform == null) { + foundPlatform = platform; + } else { + if (platform.isInstalled() + && compareVersions(platform.getVersion(), foundPlatform.getVersion()) > 0) { + foundPlatform = platform; + } + } } } - return null; + return foundPlatform; } - public List getTools() { + public List getTools() { return tools; } - public Tool getTool(String toolName, String version) { - for (Tool tool : tools) { - if (tool.getName().equals(toolName) && tool.getName().equals(version)) { + public ArduinoTool getTool(String toolName, String version) { + for (ArduinoTool tool : tools) { + if (tool.getName().equals(toolName) && tool.getVersion().equals(version)) { return tool; } } @@ -150,4 +161,17 @@ public class BoardPackage { } + @Override + public boolean equals(Object obj) { + if (obj instanceof ArduinoPackage) { + return ((ArduinoPackage) obj).getName().equals(name); + } + return super.equals(obj); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + } 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 new file mode 100644 index 00000000000..2a1f3769b1e --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java @@ -0,0 +1,176 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.cdt.arduino.core.internal.board; + +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.eclipse.cdt.arduino.core.internal.Activator; +import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; +import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Status; + +public class ArduinoPlatform { + + private String name; + private String architecture; + private String version; + private String category; + private String url; + private String archiveFileName; + private String checksum; + private String size; + private List boards; + private List toolsDependencies; + + private transient ArduinoPackage pkg; + private transient HierarchicalProperties boardsFile; + + void setOwner(ArduinoPackage pkg) { + this.pkg = pkg; + for (ArduinoBoard board : boards) { + board.setOwners(this); + } + for (ToolDependency toolDep : toolsDependencies) { + toolDep.setOwner(this); + } + } + + public ArduinoPackage getPackage() { + return pkg; + } + + public String getName() { + return name; + } + + public String getArchitecture() { + return architecture; + } + + public String getVersion() { + return version; + } + + public String getCategory() { + return category; + } + + public String getUrl() { + return url; + } + + public String getArchiveFileName() { + return archiveFileName; + } + + public String getChecksum() { + return checksum; + } + + public String getSize() { + return size; + } + + public List getBoards() throws CoreException { + if (isInstalled() && boardsFile == null) { + Properties boardProps = new Properties(); + try (Reader reader = new FileReader(getInstallPath().resolve("boards.txt").toFile())) { //$NON-NLS-1$ + boardProps.load(reader); + } catch (IOException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Loading boards.txt", e)); + } + + boardsFile = new HierarchicalProperties(boardProps); + + // Replace the boards with a real ones + boards = new ArrayList<>(); + for (Map.Entry entry : boardsFile.getChildren().entrySet()) { + if (entry.getValue().getChild("name") != null) { //$NON-NLS-1$ + // assume things with names are boards + boards.add(new ArduinoBoard(entry.getKey(), entry.getValue()).setOwners(this)); + } + } + } + return boards; + } + + public ArduinoBoard getBoard(String name) throws CoreException { + for (ArduinoBoard board : getBoards()) { + if (name.equals(board.getName())) { + return board; + } + } + return null; + } + + public List getToolsDependencies() { + return toolsDependencies; + } + + public Properties getPlatformProperties() throws CoreException { + Properties properties = new Properties(); + try (Reader reader = new FileReader(getInstallPath().resolve("boards.txt").toFile())) { //$NON-NLS-1$ + properties.load(reader); + return properties; + } catch (IOException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Loading platform.txt", e)); + } + } + + public boolean isInstalled() { + return getInstallPath().resolve("boards.txt").toFile().exists(); //$NON-NLS-1$ + } + + private Path getInstallPath() { + return ArduinoPreferences.getArduinoHome().resolve("hardware").resolve(pkg.getName()).resolve(architecture) //$NON-NLS-1$ + .resolve(version); + } + + public IStatus install(IProgressMonitor monitor) { + // Check if we're installed already + if (isInstalled()) { + return Status.OK_STATUS; + } + + // Download platform archive + IStatus status = ArduinoBoardManager.downloadAndInstall(url, archiveFileName, getInstallPath(), monitor); + if (!status.isOK()) { + return status; + } + + // Install the tools + MultiStatus mstatus = null; + for (ToolDependency toolDep : toolsDependencies) { + status = toolDep.install(monitor); + if (!status.isOK()) { + if (mstatus == null) { + mstatus = new MultiStatus(status.getPlugin(), status.getCode(), status.getMessage(), + status.getException()); + } else { + mstatus.add(status); + } + } + } + + // TODO on Windows install make from equations.org + + return mstatus != null ? mstatus : Status.OK_STATUS; + } + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoTool.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoTool.java new file mode 100644 index 00000000000..e2dda8ef288 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoTool.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.cdt.arduino.core.internal.board; + +import java.nio.file.Path; +import java.util.List; + +import org.eclipse.cdt.arduino.core.internal.Activator; +import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; + +public class ArduinoTool { + + private String name; + private String version; + private List systems; + + private transient ArduinoPackage pkg; + + public void setOwner(ArduinoPackage pkg) { + this.pkg = pkg; + for (ArduinoToolSystem system : systems) { + system.setOwner(this); + } + } + + public ArduinoPackage getPackage() { + return pkg; + } + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + public List getSystems() { + return systems; + } + + public Path getInstallPath() { + return ArduinoPreferences.getArduinoHome().resolve("tools").resolve(pkg.getName()).resolve(name) //$NON-NLS-1$ + .resolve(version); + } + + public boolean isInstalled() { + return getInstallPath().toFile().exists(); + } + + public IStatus install(IProgressMonitor monitor) { + if (isInstalled()) { + return Status.OK_STATUS; + } + + for (ArduinoToolSystem system : systems) { + if (system.isApplicable()) { + return system.install(monitor); + } + } + + // No valid system + return new Status(IStatus.ERROR, Activator.getId(), "No valid system found for " + name); + } + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoToolSystem.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoToolSystem.java new file mode 100644 index 00000000000..bb994a4dadf --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoToolSystem.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.cdt.arduino.core.internal.board; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; + +public class ArduinoToolSystem { + + private String host; + private String archiveFileName; + private String url; + private String checksum; + private String size; + + private transient ArduinoTool tool; + + public void setOwner(ArduinoTool tool) { + this.tool = tool; + } + + public String getHost() { + return host; + } + + public String getArchiveFileName() { + return archiveFileName; + } + + public String getUrl() { + return url; + } + + public String getChecksum() { + return checksum; + } + + public String getSize() { + return size; + } + + public boolean isApplicable() { + switch (Platform.getOS()) { + case Platform.OS_WIN32: + return "i686-mingw32".equals(host); //$NON-NLS-1$ + case Platform.OS_MACOSX: + switch (host) { + case "i386-apple-darwin11": //$NON-NLS-1$ + case "x86_64-apple-darwin:": //$NON-NLS-1$ + return true; + default: + return false; + } + case Platform.OS_LINUX: + switch (Platform.getOSArch()) { + case Platform.ARCH_X86_64: + return "x86_64-pc-linux-gnu".equals(host); //$NON-NLS-1$ + case Platform.ARCH_X86: + return "i686-pc-linux-gnu".equals(host); //$NON-NLS-1$ + default: + return false; + } + default: + return false; + } + } + + public IStatus install(IProgressMonitor monitor) { + return ArduinoBoardManager.downloadAndInstall(url, archiveFileName, tool.getInstallPath(), monitor); + } + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/PackageIndex.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/PackageIndex.java index 5917412b7e6..c03c55c3699 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/PackageIndex.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/PackageIndex.java @@ -11,14 +11,14 @@ import java.util.List; public class PackageIndex { - private List packages; + private List packages; - public List getPackages() { + public List getPackages() { return packages; } - public BoardPackage getPackage(String packageName) { - for (BoardPackage pkg : packages) { + public ArduinoPackage getPackage(String packageName) { + for (ArduinoPackage pkg : packages) { if (pkg.getName().equals(packageName)) { return pkg; } @@ -27,8 +27,8 @@ public class PackageIndex { } void setOwners(ArduinoBoardManager manager) { - for (BoardPackage pkg : packages) { - pkg.setOwners(manager); + for (ArduinoPackage pkg : packages) { + pkg.setOwner(manager); } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Platform.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Platform.java deleted file mode 100644 index 885e79a2bf4..00000000000 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Platform.java +++ /dev/null @@ -1,216 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - *******************************************************************************/ -package org.eclipse.cdt.arduino.core.internal.board; - -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import org.apache.commons.compress.archivers.ArchiveEntry; -import org.apache.commons.compress.archivers.ArchiveException; -import org.apache.commons.compress.archivers.ArchiveInputStream; -import org.apache.commons.compress.archivers.ArchiveStreamFactory; -import org.apache.commons.compress.compressors.CompressorException; -import org.apache.commons.compress.compressors.CompressorStreamFactory; -import org.apache.http.HttpEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.eclipse.cdt.arduino.core.internal.Activator; -import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; -import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties; -import org.eclipse.cdt.arduino.core.internal.Messages; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -@SuppressWarnings("restriction") -public class Platform { - - private String name; - private String architecture; - private String version; - private String category; - private String url; - private String archiveFileName; - private String checksum; - private String size; - private List boards; - private List toolsDependencies; - - private transient BoardPackage pkg; - private transient HierarchicalProperties boardsFile; - - void setOwners(BoardPackage pkg) { - this.pkg = pkg; - for (Board board : boards) { - board.setOwners(this); - } - } - - public BoardPackage getPackage() { - return pkg; - } - - public String getName() { - return name; - } - - public String getArchitecture() { - return architecture; - } - - public String getVersion() { - return version; - } - - public String getCategory() { - return category; - } - - public String getUrl() { - return url; - } - - public String getArchiveFileName() { - return archiveFileName; - } - - public String getChecksum() { - return checksum; - } - - public String getSize() { - return size; - } - - public List getBoards() throws CoreException { - if (isInstalled() && boardsFile == null) { - Properties boardProps = new Properties(); - try (Reader reader = new FileReader(getInstallPath().resolve("boards.txt").toFile())) { //$NON-NLS-1$ - boardProps.load(reader); - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Loading boards", e)); - } - - boardsFile = new HierarchicalProperties(boardProps); - - // Replace the boards with a real ones - boards = new ArrayList<>(); - for (HierarchicalProperties child : boardsFile.getChildren().values()) { - if (child.getChild("name") != null) { //$NON-NLS-1$ - // assume things with names are boards - boards.add(new Board(child).setOwners(this)); - } - } - } - return boards; - } - - public Board getBoard(String boardId) throws CoreException { - for (Board board : getBoards()) { - if (boardId.equals(board.getId())) { - return board; - } - } - return null; - } - - public List getToolsDependencies() { - return toolsDependencies; - } - - public boolean isInstalled() { - return getInstallPath().resolve("boards.txt").toFile().exists(); //$NON-NLS-1$ - } - - private Path getInstallPath() { - return ArduinoPreferences.getArduinoHome().resolve("hardware").resolve(pkg.getName()).resolve(architecture) //$NON-NLS-1$ - .resolve(version); - } - - public IStatus install(IProgressMonitor monitor) throws CoreException { - try { - try (CloseableHttpClient client = HttpClients.createDefault()) { - HttpGet get = new HttpGet(url); - try (CloseableHttpResponse response = client.execute(get)) { - if (response.getStatusLine().getStatusCode() >= 400) { - return new Status(IStatus.ERROR, Activator.getId(), response.getStatusLine().getReasonPhrase()); - } else { - HttpEntity entity = response.getEntity(); - if (entity == null) { - return new Status(IStatus.ERROR, Activator.getId(), Messages.ArduinoBoardManager_1); - } - // the archive has the version number as the root - // directory - Path installPath = getInstallPath().getParent(); - Files.createDirectories(installPath); - Path archivePath = installPath.resolve(archiveFileName); - Files.copy(entity.getContent(), archivePath, StandardCopyOption.REPLACE_EXISTING); - - // extract - ArchiveInputStream archiveIn = null; - try { - String compressor = null; - String archiver = null; - if (archiveFileName.endsWith("tar.bz2")) { //$NON-NLS-1$ - compressor = CompressorStreamFactory.BZIP2; - archiver = ArchiveStreamFactory.TAR; - } else if (archiveFileName.endsWith(".tar.gz") || archiveFileName.endsWith(".tgz")) { //$NON-NLS-1$ //$NON-NLS-2$ - compressor = CompressorStreamFactory.GZIP; - archiver = ArchiveStreamFactory.TAR; - } else if (archiveFileName.endsWith(".tar.xz")) { //$NON-NLS-1$ - compressor = CompressorStreamFactory.XZ; - archiver = ArchiveStreamFactory.TAR; - } else if (archiveFileName.endsWith(".zip")) { //$NON-NLS-1$ - archiver = ArchiveStreamFactory.ZIP; - } - - InputStream in = new BufferedInputStream(new FileInputStream(archivePath.toFile())); - if (compressor != null) { - in = new CompressorStreamFactory().createCompressorInputStream(compressor, in); - } - archiveIn = new ArchiveStreamFactory().createArchiveInputStream(archiver, in); - - for (ArchiveEntry entry = archiveIn.getNextEntry(); entry != null; entry = archiveIn - .getNextEntry()) { - if (entry.isDirectory()) { - continue; - } - - // TODO check for soft links in tar files. - Path entryPath = installPath.resolve(entry.getName()); - Files.createDirectories(entryPath.getParent()); - Files.copy(archiveIn, entryPath, StandardCopyOption.REPLACE_EXISTING); - } - } finally { - if (archiveIn != null) { - archiveIn.close(); - } - } - } - } - } - return Status.OK_STATUS; - } catch (IOException | CompressorException | ArchiveException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Installing Platform", e)); - } - } - -} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Tool.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Tool.java deleted file mode 100644 index b1f95b628a0..00000000000 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/Tool.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - *******************************************************************************/ -package org.eclipse.cdt.arduino.core.internal.board; - -import java.util.List; - -public class Tool { - - private String name; - private String version; - private List systems; - - public String getName() { - return name; - } - - public String getVersion() { - return version; - } - - public List getSystems() { - return systems; - } - -} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolDependency.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolDependency.java index f154346fafa..c69e02b8a72 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolDependency.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolDependency.java @@ -7,12 +7,24 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.board; +import org.eclipse.cdt.arduino.core.internal.Activator; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; + public class ToolDependency { private String packager; private String name; private String version; + private transient ArduinoPlatform platform; + + public void setOwner(ArduinoPlatform platform) { + this.platform = platform; + } + public String getPackager() { return packager; } @@ -25,4 +37,26 @@ public class ToolDependency { return version; } + public ArduinoTool getTool() throws CoreException { + ArduinoPackage pkg = platform.getPackage(); + if (!pkg.getName().equals(packager)) { + pkg = pkg.getManager().getPackageIndex().getPackage(packager); + } + + return pkg.getTool(name, version); + } + + public IStatus install(IProgressMonitor monitor) { + try { + ArduinoTool tool = getTool(); + if (tool == null) { + return new Status(IStatus.ERROR, Activator.getId(), + String.format("Tool not found %s %s", name, version)); + } + return getTool().install(monitor); + } catch (CoreException e) { + return e.getStatus(); + } + } + } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolSystem.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolSystem.java deleted file mode 100644 index d7fcb407a9d..00000000000 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ToolSystem.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - *******************************************************************************/ -package org.eclipse.cdt.arduino.core.internal.board; - -public class ToolSystem { - - private String host; - private String archiveFileName; - private String url; - private String checksum; - private String size; - - public String getHost() { - return host; - } - - public String getArchiveFileName() { - return archiveFileName; - } - - public String getUrl() { - return url; - } - - public String getChecksum() { - return checksum; - } - - public String getSize() { - return size; - } - -} 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 new file mode 100644 index 00000000000..f1adddbdf03 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java @@ -0,0 +1,73 @@ +package org.eclipse.cdt.arduino.core.internal.build; + +import org.eclipse.cdt.arduino.core.internal.Activator; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPackage; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform; +import org.eclipse.core.resources.IBuildConfiguration; +import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdapterFactory; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.osgi.service.prefs.BackingStoreException; + +public class ArduinoBuildConfiguration { + + private static final String PACKAGE_NAME = "packageId"; + private static final String PLATFORM_NAME = "platformName"; + private static final String BOARD_NAME = "boardName"; + + private final IBuildConfiguration config; + + private ArduinoBuildConfiguration(IBuildConfiguration config) { + this.config = config; + } + + public static class Factory implements IAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public T getAdapter(Object adaptableObject, Class adapterType) { + if (adapterType.equals(ArduinoBuildConfiguration.class) && adaptableObject instanceof IBuildConfiguration) { + return (T) new ArduinoBuildConfiguration((IBuildConfiguration) adaptableObject); + } + return null; + } + + @Override + public Class[] getAdapterList() { + return new Class[] { ArduinoBuildConfiguration.class }; + } + } + + public IEclipsePreferences getSettings() { + return (IEclipsePreferences) new ProjectScope(config.getProject()).getNode(Activator.getId()).node("config") //$NON-NLS-1$ + .node(config.getName()); + } + + public void setBoard(ArduinoBoard board) throws CoreException { + ArduinoPlatform platform = board.getPlatform(); + ArduinoPackage pkg = platform.getPackage(); + + IEclipsePreferences settings = getSettings(); + settings.put(PACKAGE_NAME, pkg.getName()); + settings.put(PLATFORM_NAME, platform.getName()); + settings.put(BOARD_NAME, board.getName()); + try { + settings.flush(); + } catch (BackingStoreException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Saving preferences", e)); + } + } + + public ArduinoBoard getBoard() throws CoreException { + IEclipsePreferences settings = getSettings(); + String packageName = settings.get(PACKAGE_NAME, ""); //$NON-NLS-1$ + String platformName = settings.get(PLATFORM_NAME, ""); //$NON-NLS-1$ + String boardName = settings.get(BOARD_NAME, ""); //$NON-NLS-1$ + return ArduinoBoardManager.instance.getBoard(boardName, platformName, packageName); + } + +} 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 2450dac4068..f7cee036f95 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 @@ -7,21 +7,34 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.build; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; import org.eclipse.cdt.arduino.core.internal.Activator; -import org.eclipse.cdt.arduino.core.internal.ArduinoProjectNature; -import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; -import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; -import org.eclipse.cdt.managedbuilder.core.IConfiguration; -import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.arduino.core.internal.ArduinoTemplateGenerator; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; +import org.eclipse.cdt.arduino.core.internal.console.ArduinoConsoleService; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.IOutputEntry; +import org.eclipse.cdt.core.model.IPathEntry; +import org.eclipse.cdt.core.model.ISourceRoot; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceProxy; +import org.eclipse.core.resources.IResourceProxyVisitor; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; /** * This class is responsible for generating the Makefile for the current build @@ -33,36 +46,101 @@ public class ArduinoBuilder extends IncrementalProjectBuilder { @Override protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { - IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); - IConfiguration config = info.getDefaultConfiguration(); + IProject project = getProject(); + + // What board are we building for? + ArduinoBuildConfiguration config = getBuildConfig().getAdapter(ArduinoBuildConfiguration.class); + ArduinoBoard board = config.getBoard(); + + // Get the build console + ArduinoConsoleService consoleService = Activator.getConsoleService(); + + try { + consoleService.writeOutput(String.format("\nBuilding project: %s\n", project.getName())); + + IFolder buildFolder = project.getFolder("build"); //$NON-NLS-1$ + if (!buildFolder.exists()) { + buildFolder.create(true, true, monitor); + CoreModel.newOutputEntry(buildFolder.getFullPath()); + } + + String makeFileName = board.getId() + ".mk"; //$NON-NLS-1$ + IFile makeFile = buildFolder.getFile(makeFileName); + generateMakefile(makeFile, board, monitor); + + String[] cmd = new String[] { "make", "-f", makeFileName }; //$NON-NLS-1$ //$NON-NLS-2$ + Process process = Runtime.getRuntime().exec(cmd, null, new File(buildFolder.getLocationURI())); + consoleService.monitor(process, null); + + buildFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); + } catch (IOException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Build error", e)); + } // TODO if there are references we want to watch, return them here - return null; + return new IProject[] { project }; } - public static void handleProjectDescEvent(CProjectDescriptionEvent event) { + @Override + protected void clean(IProgressMonitor monitor) throws CoreException { + IProject project = getProject(); + ArduinoBuildConfiguration config = getBuildConfig().getAdapter(ArduinoBuildConfiguration.class); + ArduinoBoard board = config.getBoard(); + + ArduinoConsoleService consoleService = Activator.getConsoleService(); try { - IProject project = event.getProject(); - // Is this an arduino project? - if (!ArduinoProjectNature.hasNature(project)) { - return; + consoleService.writeOutput(String.format("\nCleaning project: %s\n", project.getName())); + + IFolder buildFolder = project.getFolder("build"); //$NON-NLS-1$ + if (!buildFolder.exists()) { + buildFolder.create(true, true, monitor); + ICProject cproject = CoreModel.getDefault().create(project); + IOutputEntry output = CoreModel.newOutputEntry(buildFolder.getFullPath()); + IPathEntry[] oldEntries = cproject.getRawPathEntries(); + IPathEntry[] newEntries = new IPathEntry[oldEntries.length]; + System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length); + newEntries[oldEntries.length] = output; + cproject.setRawPathEntries(newEntries, monitor); } - // See if CDT config changed and sync the Resource config - ICConfigurationDescription newConfigDesc = event.getNewCProjectDescription().getActiveConfiguration(); - ICConfigurationDescription oldConfigDesc = event.getOldCProjectDescription().getActiveConfiguration(); - if (!newConfigDesc.equals(oldConfigDesc)) { - System.out.println("Active config changed: " + newConfigDesc.getName()); //$NON-NLS-1$ - String configName = newConfigDesc.getName(); - if (project.hasBuildConfig(configName)) { - IProjectDescription projDesc = project.getDescription(); - projDesc.setActiveBuildConfig(configName); - project.setDescription(projDesc, new NullProgressMonitor()); - } - } - } catch (CoreException e) { - Activator.log(e); + String makeFileName = board.getId() + ".mk"; //$NON-NLS-1$ + IFile makeFile = buildFolder.getFile(makeFileName); + generateMakefile(makeFile, board, monitor); + + String[] cmd = new String[] { "make", "-f", makeFileName, "clean" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Process process = Runtime.getRuntime().exec(cmd, null, new File(buildFolder.getLocationURI())); + + consoleService.monitor(process, null); + + buildFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); + } catch (IOException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Build error", e)); } } + private void generateMakefile(IFile makeFile, ArduinoBoard board, IProgressMonitor monitor) throws CoreException { + Map buildModel = new HashMap<>(); + buildModel.put("boardId", board.getId()); //$NON-NLS-1$ + + final List sourceFiles = new ArrayList<>(); + final IProject project = getProject(); + for (ISourceRoot sourceRoot : CCorePlugin.getDefault().getCoreModel().create(project).getSourceRoots()) { + sourceRoot.getResource().accept(new IResourceProxyVisitor() { + @Override + public boolean visit(IResourceProxy proxy) throws CoreException { + if (proxy.getType() == IResource.FILE) { + if (CoreModel.isValidSourceUnitName(project, proxy.getName())) { + sourceFiles.add(proxy.getName()); + } + } + return true; + } + }, 0); + } + buildModel.put("sources", sourceFiles); //$NON-NLS-1$ + + ArduinoTemplateGenerator templateGen = new ArduinoTemplateGenerator(); + templateGen.generateFile(buildModel, "board.mk", makeFile, monitor); //$NON-NLS-1$ + } + } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoLaunchConsoleService.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/console/ArduinoConsoleService.java similarity index 67% rename from toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoLaunchConsoleService.java rename to toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/console/ArduinoConsoleService.java index e5b3014b1bc..3f5496e5788 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoLaunchConsoleService.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/console/ArduinoConsoleService.java @@ -8,16 +8,21 @@ * Contributors: * QNX Software Systems - Initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.arduino.core.internal; +package org.eclipse.cdt.arduino.core.internal.console; +import java.io.IOException; -public interface ArduinoLaunchConsoleService { +public interface ArduinoConsoleService { /** * Capture the output for the process and display on the console. * * @param process */ - void monitor(Process process); + void monitor(Process process, ConsoleParser[] consoleParsers) throws IOException; + + void writeOutput(String msg) throws IOException; + + void writeError(String msg) throws IOException; } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/console/ConsoleParser.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/console/ConsoleParser.java new file mode 100644 index 00000000000..0db948baabe --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/console/ConsoleParser.java @@ -0,0 +1,48 @@ +package org.eclipse.cdt.arduino.core.internal.console; + +import java.nio.file.Path; + +public interface ConsoleParser { + + /** + * Returns the pattern to be used for matching. The pattern is a string + * representing a regular expression. + * + * @return the regular expression to be used for matching + */ + public String getPattern(); + + /** + * Returns the flags to use when compiling this pattern match listener's + * regular expression, as defined by by + * Pattern.compile(String regex, int flags) + * + * @return the flags to use when compiling this pattern match listener's + * regular expression + * @see java.util.regex.Pattern#compile(java.lang.String, int) + */ + public int getCompilerFlags(); + + /** + * Returns a simple regular expression used to identify lines that may match + * this pattern matcher's complete pattern, or null. Use of + * this attribute can improve performance by disqualifying lines from the + * search. When a line is found containing a match for this expression, the + * line is searched from the beginning for this pattern matcher's complete + * pattern. Lines not containing this pattern are discarded. + * + * @return a simple regular expression used to identify lines that may match + * this pattern matcher's complete pattern, or null + */ + public String getLineQualifier(); + + /** + * The pattern has been matched. Perform any necessary actions. Generally + * this would include creating markers for the errors. + * + * @param text text that matched the pattern + * @param directory calculated current directory + */ + public void patternMatched(String text, Path directory); + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java index c682b96b8d6..585444ce8eb 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java @@ -16,25 +16,14 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.arduino.core.internal.Activator; -import org.eclipse.cdt.arduino.core.internal.ArduinoLaunchConsoleService; import org.eclipse.cdt.arduino.core.internal.IArduinoRemoteConnection; import org.eclipse.cdt.arduino.core.internal.Messages; -import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; -import org.eclipse.cdt.arduino.core.internal.board.Board; +import org.eclipse.cdt.arduino.core.internal.console.ArduinoConsoleService; import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection; -import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.envvar.IEnvironmentVariable; -import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; -import org.eclipse.cdt.core.settings.model.ICProjectDescription; -import org.eclipse.cdt.managedbuilder.core.IConfiguration; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IExtension; -import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.DebugPlugin; @@ -64,19 +53,7 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg // 1. make sure proper build config is set active IProject project = configuration.getMappedResources()[0].getProject(); - ICProjectDescription projDesc = CCorePlugin.getDefault().getProjectDescription(project); - ICConfigurationDescription configDesc = getBuildConfiguration(projDesc, target); - boolean newConfig = false; - if (configDesc == null) { - IArduinoRemoteConnection arduinoRemote = target.getService(IArduinoRemoteConnection.class); - configDesc = ArduinoBoardManager.instance.createBuildConfiguration(projDesc, arduinoRemote.getBoardName(), - arduinoRemote.getPlatformName(), arduinoRemote.getPackageName()); - newConfig = true; - } - if (newConfig || !projDesc.getActiveConfiguration().equals(configDesc)) { - projDesc.setActiveConfiguration(configDesc); - CCorePlugin.getDefault().setProjectDescription(project, projDesc); - } + // TODO set active build config for the selected target // 2. Run the build return super.buildForLaunch(configuration, mode, monitor); @@ -95,7 +72,7 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg new Job(Messages.ArduinoLaunchConfigurationDelegate_0) { protected IStatus run(IProgressMonitor monitor) { try { - ArduinoLaunchConsoleService consoleService = getConsoleService(); + ArduinoConsoleService consoleService = Activator.getConsoleService(); IRemoteConnection target = getTarget(configuration); if (target == null) { return new Status(IStatus.ERROR, Activator.getId(), @@ -106,14 +83,8 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg IProject project = (IProject) configuration.getMappedResources()[0]; // The build environment - ICProjectDescription projDesc = CCorePlugin.getDefault().getProjectDescription(project); - ICConfigurationDescription configDesc = getBuildConfiguration(projDesc, target); - IEnvironmentVariable[] envVars = CCorePlugin.getDefault().getBuildEnvironmentManager() - .getVariables(configDesc, true); - List envVarList = new ArrayList(envVars.length + 1); - for (IEnvironmentVariable var : envVars) { - envVarList.add(var.getName() + '=' + var.getValue()); - } + List envVarList = new ArrayList<>(); + // Add in the serial port based on launch config IArduinoRemoteConnection arduinoRemote = target.getService(IArduinoRemoteConnection.class); envVarList.add("SERIAL_PORT=" + arduinoRemote.getPortName()); //$NON-NLS-1$ @@ -123,8 +94,7 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg File projectDir = new File(project.getLocationURI()); // The build command - IConfiguration buildConfig = ManagedBuildManager.getConfigurationForDescription(configDesc); - String command = buildConfig.getBuilder().getCommand(); + String command = "make"; // If opened, temporarily close the connection so we can use // it to download the firmware. @@ -135,7 +105,7 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg // Run the process and capture the results in the console Process process = Runtime.getRuntime().exec(command + " load", envp, projectDir); //$NON-NLS-1$ - consoleService.monitor(process); + consoleService.monitor(process, null); try { process.waitFor(); } catch (InterruptedException e) { @@ -158,46 +128,4 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg }.schedule(); } - private ArduinoLaunchConsoleService getConsoleService() throws CoreException { - IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(Activator.getId(), "consoleService"); //$NON-NLS-1$ - IExtension extension = point.getExtensions()[0]; // should only be one - return (ArduinoLaunchConsoleService) extension.getConfigurationElements()[0].createExecutableExtension("class"); //$NON-NLS-1$ - } - - /** - * Returns the build configuration for the active target and the launch - * configuration. - * - * @param launchConfig - * @return - */ - private ICConfigurationDescription getBuildConfiguration(ICProjectDescription projDesc, IRemoteConnection target) - throws CoreException { - String boardName; - String platformName; - String packageName; - if (target != null) { - IArduinoRemoteConnection arduinoRemote = target.getService(IArduinoRemoteConnection.class); - boardName = arduinoRemote.getBoardName(); - platformName = arduinoRemote.getPlatformName(); - packageName = arduinoRemote.getPackageName(); - } else { - // TODO - boardName = "Arduino Uno"; //$NON-NLS-1$ - platformName = "Arduino AVR Boards"; //$NON-NLS-1$ - packageName = "arduino"; //$NON-NLS-1$ - } - - for (ICConfigurationDescription configDesc : projDesc.getConfigurations()) { - IConfiguration config = ManagedBuildManager.getConfigurationForDescription(configDesc); - Board board = ArduinoBoardManager.instance.getBoard(config); - if (boardName.equals(board.getId()) && platformName.equals(board.getPlatform().getArchitecture()) - && packageName.equals(board.getPlatform().getPackage().getName())) { - return configDesc; - } - } - - return null; - } - } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk b/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk new file mode 100644 index 00000000000..99db916c4b0 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk @@ -0,0 +1,21 @@ +OUTPUT_DIR = ${boardId} + +ifeq ($(OS),Windows_NT) +RMDIR = rmdir /s /q +mymkdir = if not exist "$(call fixpath,$1)" mkdir $(call fixpath,$1) +else +RMDIR = rm -fr +mymkdir = mkdir -p $1 +endif + +SOURCES = \ +<#list sources as file> + ../src/${file} \ + + +all: + @$(call mymkdir,$(OUTPUT_DIR)) + echo hello from template + +clean: + $(RMDIR) $(OUTPUT_DIR) diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml b/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml index 1965a99dd52..86ecabdea97 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml @@ -33,7 +33,7 @@ + class="org.eclipse.cdt.arduino.ui.internal.launch.ArduinoConsole"> = 0; c = processOut.read()) { - out.write(c); - } - } catch (IOException e) { - // Nothing. Just exit - } - } - }.start(); - - final IOConsoleOutputStream err = console.newOutputStream(); - err.setColor(Display.getDefault().getSystemColor(SWT.COLOR_RED)); - new Thread(Messages.ArduinoLaunchConsole_3) { - public void run() { - try (InputStream processErr = process.getErrorStream()) { - for (int c = processErr.read(); c >= 0; c = processErr.read()) { - err.write(c); - } - } catch (IOException e) { - // Nothing. Just exit - } - } - }.start(); - - return Status.OK_STATUS; - } - }.schedule(); - } - -} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties index 7a86eecc4d7..daa70740da0 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties @@ -1,7 +1,6 @@ -ArduinoLaunchConsole_0=Arduino Launch +ArduinoLaunchConsole_0=Arduino ArduinoLaunchConsole_1=Start Arduino Console -ArduinoLaunchConsole_2=Arduino Launch Console Output -ArduinoLaunchConsole_3=Arduino Launch Console Output +ArduinoLaunchConsole_2=Arduino Console Output ArduinoPreferencePage_0=Arduino IDE Install Location ArduinoPreferencePage_1=Arduino C++ Preferences ArduinoTargetPropertyPage_0=Serial Port: diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoBoardsPreferencePage.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoBoardsPreferencePage.java index 985474235d5..cfbed0431e5 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoBoardsPreferencePage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoBoardsPreferencePage.java @@ -7,7 +7,6 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.ui.internal.preferences; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -15,16 +14,16 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; -import org.eclipse.cdt.arduino.core.internal.board.Board; -import org.eclipse.cdt.arduino.core.internal.board.BoardPackage; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPackage; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform; import org.eclipse.cdt.arduino.core.internal.board.PackageIndex; -import org.eclipse.cdt.arduino.core.internal.board.Platform; import org.eclipse.cdt.arduino.ui.internal.Activator; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.preference.PreferencePage; @@ -47,7 +46,7 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork private Table table; private Button installButton; - private Set toInstall = new HashSet<>(); + private Set toInstall = new HashSet<>(); @Override public void init(IWorkbench workbench) { @@ -100,7 +99,7 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork @Override public void handleEvent(Event event) { for (TableItem item : table.getSelection()) { - Board board = (Board) item.getData(); + ArduinoBoard board = (ArduinoBoard) item.getData(); toInstall.add(board); item.setText(2, "selected"); updateButtons(); @@ -123,11 +122,11 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork try { PackageIndex packageIndex = ArduinoBoardManager.instance.getPackageIndex(); - List boards = new ArrayList<>(); - for (BoardPackage pkg : packageIndex.getPackages()) { - for (Platform platform : pkg.getLatestPlatforms()) { + List boards = new ArrayList<>(); + for (ArduinoPackage pkg : packageIndex.getPackages()) { + for (ArduinoPlatform platform : pkg.getLatestPlatforms()) { try { - for (Board board : platform.getBoards()) { + for (ArduinoBoard board : platform.getBoards()) { boards.add(board); } } catch (CoreException e) { @@ -136,13 +135,13 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork } } - Collections.sort(boards, new Comparator() { - public int compare(Board o1, Board o2) { + Collections.sort(boards, new Comparator() { + public int compare(ArduinoBoard o1, ArduinoBoard o2) { return o1.getName().compareTo(o2.getName()); } }); - for (Board board : boards) { + for (ArduinoBoard board : boards) { TableItem item = new TableItem(table, SWT.NONE); item.setData(board); item.setText(0, board.getName()); @@ -155,7 +154,7 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork } item.setText(2, msg); } - } catch (IOException e) { + } catch (CoreException e) { Activator.log(e); } } @@ -167,11 +166,11 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork boolean enable = false; for (TableItem item : table.getSelection()) { - Board board = (Board) item.getData(); + ArduinoBoard board = (ArduinoBoard) item.getData(); if (toInstall.contains(board)) { continue; } - Platform platform = board.getPlatform(); + ArduinoPlatform platform = board.getPlatform(); if (!platform.isInstalled()) { enable = true; } @@ -184,17 +183,15 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork new Job("Installing Arduino Board Platforms") { @Override protected IStatus run(IProgressMonitor monitor) { - Set platforms = new HashSet<>(); - for (Board board : toInstall) { + Set platforms = new HashSet<>(); + for (ArduinoBoard board : toInstall) { platforms.add(board.getPlatform()); } - for (Platform platform : platforms) { - try { - platform.install(monitor); - } catch (CoreException e) { - return e.getStatus(); - } + MultiStatus status = new MultiStatus(Activator.PLUGIN_ID, 0, "Installing Arduino Board Platforms", + null); + for (ArduinoPlatform platform : platforms) { + status.add(platform.install(monitor)); } toInstall.clear(); @@ -208,7 +205,7 @@ public class ArduinoBoardsPreferencePage extends PreferencePage implements IWork }); } - return Status.OK_STATUS; + return status; } }.schedule(); return true; diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java index 48d524590f4..37e7682b99c 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java @@ -5,7 +5,7 @@ import java.util.Collection; import org.eclipse.cdt.arduino.core.internal.IArduinoRemoteConnection; import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; -import org.eclipse.cdt.arduino.core.internal.board.Board; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; import org.eclipse.cdt.arduino.ui.internal.Activator; import org.eclipse.cdt.arduino.ui.internal.Messages; import org.eclipse.cdt.serial.SerialPort; @@ -28,7 +28,7 @@ public class ArduinoTargetPropertyPage extends PropertyPage implements IWorkbenc private Combo portSelector; private Combo boardSelector; - private Board[] boards; + private ArduinoBoard[] boards; @Override protected Control createContents(Composite parent) { @@ -73,13 +73,13 @@ public class ArduinoTargetPropertyPage extends PropertyPage implements IWorkbenc boardSelector.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); try { - Board currentBoard = ArduinoBoardManager.instance.getBoard(arduinoRemote.getBoardName(), + ArduinoBoard currentBoard = ArduinoBoardManager.instance.getBoard(arduinoRemote.getBoardName(), arduinoRemote.getPlatformName(), arduinoRemote.getPackageName()); - Collection boardList = ArduinoBoardManager.instance.getBoards(); - boards = new Board[boardList.size()]; + Collection boardList = ArduinoBoardManager.instance.getBoards(); + boards = new ArduinoBoard[boardList.size()]; i = 0; int boardSel = 0; - for (Board board : boardList) { + for (ArduinoBoard board : boardList) { boards[i] = board; boardSelector.add(board.getName()); if (board.equals(currentBoard)) { @@ -103,7 +103,7 @@ public class ArduinoTargetPropertyPage extends PropertyPage implements IWorkbenc String portName = portSelector.getItem(portSelector.getSelectionIndex()); workingCopy.setAttribute(IArduinoRemoteConnection.PORT_NAME, portName); - Board board = boards[boardSelector.getSelectionIndex()]; + ArduinoBoard board = boards[boardSelector.getSelectionIndex()]; workingCopy.setAttribute(IArduinoRemoteConnection.BOARD_ID, board.getId()); try { diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java index a5578823fc5..92272ba925e 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java @@ -3,7 +3,7 @@ package org.eclipse.cdt.arduino.ui.internal.remote; import java.io.IOException; import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; -import org.eclipse.cdt.arduino.core.internal.board.Board; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; import org.eclipse.cdt.arduino.ui.internal.Activator; import org.eclipse.cdt.arduino.ui.internal.Messages; import org.eclipse.cdt.serial.SerialPort; @@ -30,8 +30,8 @@ public class NewArduinoTargetWizardPage extends WizardPage { private String[] portNames; private Combo portCombo; - Board board; - private Board[] boards; + ArduinoBoard board; + private ArduinoBoard[] boards; private Combo boardCombo; public NewArduinoTargetWizardPage() { @@ -90,8 +90,8 @@ public class NewArduinoTargetWizardPage extends WizardPage { boardCombo = new Combo(comp, SWT.READ_ONLY); boardCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); try { - boards = ArduinoBoardManager.instance.getBoards().toArray(new Board[0]); - for (Board board : boards) { + boards = ArduinoBoardManager.instance.getBoards().toArray(new ArduinoBoard[0]); + for (ArduinoBoard board : boards) { boardCombo.add(board.getName()); } boardCombo.select(0);