From 52a6839cf1893c00c95443e8cde212eb19efd75d Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 20 Nov 2008 16:33:19 +0000 Subject: Initial import. --- org.rtems.cdt.toolchain/.classpath | 9 + org.rtems.cdt.toolchain/.project | 34 + .../.settings/org.eclipse.jdt.core.prefs | 7 + org.rtems.cdt.toolchain/LICENSE | 7 + org.rtems.cdt.toolchain/META-INF/MANIFEST.MF | 16 + org.rtems.cdt.toolchain/build.properties | 8 + org.rtems.cdt.toolchain/plugin.properties | 81 +++ org.rtems.cdt.toolchain/plugin.xml | 759 +++++++++++++++++++++ .../src/org/rtems/cdt/toolchain/Activator.java | 52 ++ .../cdt/toolchain/IsRtemsToolChainSupported.java | 21 + .../RtemsBspDefinedSymbolsValueHandler.java | 58 ++ .../cdt/toolchain/RtemsCommandLineGenerator.java | 89 +++ .../RtemsEnvironmentVariableSupplier.java | 301 ++++++++ .../RtemsInstallBspDirectoryValueHandler.java | 101 +++ .../cdt/toolchain/RtemsLinkCommandLineInfo.java | 23 + .../RtemsManagerRelocationLinkHandler.java | 177 +++++ .../cdt/toolchain/RtemsScannerInfoCollector.java | 127 ++++ .../templates/serial/src/Basename.c | 162 +++++ .../templates/serial/template.properties | 3 + .../templates/serial/template.xml | 69 ++ 20 files changed, 2104 insertions(+) create mode 100644 org.rtems.cdt.toolchain/.classpath create mode 100644 org.rtems.cdt.toolchain/.project create mode 100644 org.rtems.cdt.toolchain/.settings/org.eclipse.jdt.core.prefs create mode 100644 org.rtems.cdt.toolchain/LICENSE create mode 100644 org.rtems.cdt.toolchain/META-INF/MANIFEST.MF create mode 100644 org.rtems.cdt.toolchain/build.properties create mode 100644 org.rtems.cdt.toolchain/plugin.properties create mode 100644 org.rtems.cdt.toolchain/plugin.xml create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/Activator.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/IsRtemsToolChainSupported.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsBspDefinedSymbolsValueHandler.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsCommandLineGenerator.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsEnvironmentVariableSupplier.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsInstallBspDirectoryValueHandler.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsLinkCommandLineInfo.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsManagerRelocationLinkHandler.java create mode 100644 org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsScannerInfoCollector.java create mode 100644 org.rtems.cdt.toolchain/templates/serial/src/Basename.c create mode 100644 org.rtems.cdt.toolchain/templates/serial/template.properties create mode 100644 org.rtems.cdt.toolchain/templates/serial/template.xml diff --git a/org.rtems.cdt.toolchain/.classpath b/org.rtems.cdt.toolchain/.classpath new file mode 100644 index 0000000..2409da5 --- /dev/null +++ b/org.rtems.cdt.toolchain/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.rtems.cdt.toolchain/.project b/org.rtems.cdt.toolchain/.project new file mode 100644 index 0000000..1fdd4d5 --- /dev/null +++ b/org.rtems.cdt.toolchain/.project @@ -0,0 +1,34 @@ + + + org.rtems.cdt.toolchain + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.api.tools.apiAnalysisBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + org.eclipse.pde.api.tools.apiAnalysisNature + + diff --git a/org.rtems.cdt.toolchain/.settings/org.eclipse.jdt.core.prefs b/org.rtems.cdt.toolchain/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f8a6e50 --- /dev/null +++ b/org.rtems.cdt.toolchain/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +#Fri Nov 07 00:24:21 PST 2008 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/org.rtems.cdt.toolchain/LICENSE b/org.rtems.cdt.toolchain/LICENSE new file mode 100644 index 0000000..4e04964 --- /dev/null +++ b/org.rtems.cdt.toolchain/LICENSE @@ -0,0 +1,7 @@ +# +# $Id$ +# + +All rights are temporarily reserved by author Robert Fu until +author consults with RTEMS community and decides the final license +to use for this RTEMS Eclipse Plug-in. diff --git a/org.rtems.cdt.toolchain/META-INF/MANIFEST.MF b/org.rtems.cdt.toolchain/META-INF/MANIFEST.MF new file mode 100644 index 0000000..16cbe62 --- /dev/null +++ b/org.rtems.cdt.toolchain/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: RTEMS Toolchain Plug-in +Bundle-SymbolicName: org.rtems.cdt.toolchain;singleton:=true +Bundle-Version: 1.0.0 +Bundle-Activator: org.rtems.cdt.toolchain.Activator +Bundle-Vendor: RobertF +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.ui, + org.eclipse.cdt.core, + org.eclipse.cdt.managedbuilder.core;bundle-version="5.0.1" +Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-ActivationPolicy: lazy +Import-Package: org.eclipse.core.resources +Bundle-Localization: plugin +Export-Package: org.rtems.cdt.toolchain diff --git a/org.rtems.cdt.toolchain/build.properties b/org.rtems.cdt.toolchain/build.properties new file mode 100644 index 0000000..675404c --- /dev/null +++ b/org.rtems.cdt.toolchain/build.properties @@ -0,0 +1,8 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.xml,\ + plugin.properties,\ + templates/,\ + LICENSE diff --git a/org.rtems.cdt.toolchain/plugin.properties b/org.rtems.cdt.toolchain/plugin.properties new file mode 100644 index 0000000..8b31be6 --- /dev/null +++ b/org.rtems.cdt.toolchain/plugin.properties @@ -0,0 +1,81 @@ +############################################################################### +# Note about steps of updating plugin.properties: +# +# 0. clean then rebuild +# 1. remove the old plugin by deleting the jar file +# 2. start Eclipse, and then close it +# (w/o this step, somehow it remembers old plugin, so you cannot see your +# changes) +# 3. copy new plugin jar file into Eclipse plugins directory +# 4. restart Eclipse +############################################################################### + +RTEMS.Debug=Debug +RTEMS.Release=Release + +RTEMS.C.Linker.Shared.Libgcc=Shared libgcc (-shared-libgcc) +RTEMS.CPP.Linker.Shared.Libgcc=Shared libgcc (-shared-libgcc) + +RTEMS.C.Linker.Start.Address=Start Address (-Wl,-Ttext,) +RTEMS.CPP.Linker.Start.Address=Start Address (-Wl,-Ttext,) + +RTEMS.C.Compiler.CPU.Type=CPU Type (-mtune=) +RTEMS.CPP.Compiler.CPU.Type=CPU Type (-mtune=) +RTEMS.C.Linker.CPU.Type=CPU Type (-mtune=) +RTEMS.CPP.Linker.CPU.Type=CPU Type (-mtune=) + +RTEMS.C.Compiler.Search.Path=Search Path (-B) +RTEMS.CPP.Compiler.Search.Path=Search Path (-B) +RTEMS.C.Link.Search.Path=Search Path (-B) +RTEMS.CPP.Link.Search.Path=Search Path (-B) + +RTEMS.C.Compiler.Specs=Specs (-specs=) +RTEMS.CPP.Compiler.Specs=Specs (-specs=) +RTEMS.C.Linker.Specs=Specs (-specs=) +RTEMS.CPP.Linker.Specs=Specs (-specs=) + +C.Link.OptionCategory.RTEMS=RTEMS Specific +CPP.Link.OptionCategory.RTEMS=RTEMS Specific + +RTEMS.C.Link.Option.Mgr.Barrier=Enable Barrier +RTEMS.CPP.Link.Option.Mgr.Barrier=Enable Barrier + +RTEMS.C.Link.Option.Mgr.Console=Enable Console +RTEMS.CPP.Link.Option.Mgr.Console=Enable Console + +RTEMS.C.Link.Option.Mgr.Dual.Ported.Memory=Enable Dual Ported Memory +RTEMS.CPP.Link.Option.Mgr.Dual.Ported.Memory=Enable Dual Ported Memory + +RTEMS.C.Link.Option.Mgr.Event=Enable Event +RTEMS.CPP.Link.Option.Mgr.Event=Enable Event + +RTEMS.C.Link.Option.Mgr.File.System=Enable File System +RTEMS.CPP.Link.Option.Mgr.File.System=Enable File System + +RTEMS.C.Link.Option.Mgr.IO=Enable I/O +RTEMS.CPP.Link.Option.Mgr.IO=Enable I/O + +RTEMS.C.Link.Option.Mgr.Multi.Processor=Enable Multi-Processor +RTEMS.CPP.Link.Option.Mgr.Multi.Processor=Enable Multi-Processor + +RTEMS.C.Link.Option.Mgr.Message=Enable Message +RTEMS.CPP.Link.Option.Mgr.Message=Enable Message + +RTEMS.C.Link.Option.Mgr.Partition=Enable Partition +RTEMS.CPP.Link.Option.Mgr.Partition=Enable Partition + +RTEMS.C.Link.Option.Mgr.Region=Enable Region +RTEMS.CPP.Link.Option.Mgr.Region=Enable Region + +RTEMS.C.Link.Option.Mgr.Rate.Monotonic=Enable Rate Monotonic +RTEMS.CPP.Link.Option.Mgr.Rate.Monotonic=Enable Rate Monotonic + +RTEMS.C.Link.Option.Mgr.Semaphore=Enable Semaphore +RTEMS.CPP.Link.Option.Mgr.Semaphore=Enable Semaphore + +RTEMS.C.Link.Option.Mgr.Signal=Enable Signal +RTEMS.CPP.Link.Option.Mgr.Signal=Enable Signal + +RTEMS.C.Link.Option.Mgr.Timer=Enable Timer +RTEMS.CPP.Link.Option.Mgr.Timer=Enable Timer + diff --git a/org.rtems.cdt.toolchain/plugin.xml b/org.rtems.cdt.toolchain/plugin.xml new file mode 100644 index 0000000..66a67d7 --- /dev/null +++ b/org.rtems.cdt.toolchain/plugin.xml @@ -0,0 +1,759 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/Activator.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/Activator.java new file mode 100644 index 0000000..813df03 --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/Activator.java @@ -0,0 +1,52 @@ +package org.rtems.cdt.toolchain; + +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "org.rtems.cdt.toolchain"; + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/IsRtemsToolChainSupported.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/IsRtemsToolChainSupported.java new file mode 100644 index 0000000..dda639d --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/IsRtemsToolChainSupported.java @@ -0,0 +1,21 @@ +/********************************************************************** + * Copyright (c) 2008 RobertF. + * All rights reserved. + **********************************************************************/ + +package org.rtems.cdt.toolchain; + +import org.eclipse.cdt.managedbuilder.core.IManagedIsToolChainSupported; +import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.core.runtime.PluginVersionIdentifier; + +public class IsRtemsToolChainSupported implements IManagedIsToolChainSupported { + public IsRtemsToolChainSupported() { + } + + public boolean isSupported(IToolChain toolChain, + PluginVersionIdentifier version, String instance) { + return RtemsEnvironmentVariableSupplier.toolChainSupported; + } + +} diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsBspDefinedSymbolsValueHandler.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsBspDefinedSymbolsValueHandler.java new file mode 100644 index 0000000..00bed1e --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsBspDefinedSymbolsValueHandler.java @@ -0,0 +1,58 @@ +package org.rtems.cdt.toolchain; + +import java.util.Iterator; +import java.util.List; +import java.util.ArrayList; + +import org.eclipse.cdt.managedbuilder.core.IBuildObject; +import org.eclipse.cdt.managedbuilder.core.IHoldsOptions; +import org.eclipse.cdt.managedbuilder.core.IManagedOptionValueHandler; +import org.eclipse.cdt.managedbuilder.core.IOption; +import org.eclipse.cdt.managedbuilder.core.ManagedOptionValueHandler; + +public class RtemsBspDefinedSymbolsValueHandler extends ManagedOptionValueHandler + implements IManagedOptionValueHandler { + private List bspDefinedSymbolList; + + public RtemsBspDefinedSymbolsValueHandler() { + bspDefinedSymbolList = RtemsScannerInfoCollector.getBspDefinedSymbols(); + } + + /** + * Handles transfer between values between UI element and + * back-end in different circumstances. + * + * @param configuration build configuration of option + * (may be IConfiguration or IResourceConfiguration) + * @param holder contains the holder of the option + * @param option the option that is handled + * @param extraArgument extra argument for handler + * @param event event to be handled, one of the following: + * (EVENT_OPEN = 1, EVENT_CLOSE = 2, + * EVENT_SETDEFAULT = 3, + * EVENT_APPLY = 4, EVENT_LOAD = 5) + * + * @return True when the event was handled, false otherwise. + * This enables default event handling can take place. + */ + public boolean handleValue(IBuildObject configuration, IHoldsOptions holder, + IOption option, String extraArgument, int event) { + if (event == EVENT_CLOSE) return false; + + try { + Object defaultValue = option.getDefaultValue(); + + if ( defaultValue==null + || ( defaultValue instanceof List + && ((List)defaultValue).size()<=0 + ) + ) { + option.setDefaultValue(bspDefinedSymbolList); + } + } catch (Exception e) { + return false; + } + + return true; + } +} diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsCommandLineGenerator.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsCommandLineGenerator.java new file mode 100644 index 0000000..1e52f85 --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsCommandLineGenerator.java @@ -0,0 +1,89 @@ +package org.rtems.cdt.toolchain; + +import java.util.HashMap; + +import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator; +import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo; +import org.eclipse.cdt.managedbuilder.core.ITool; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedCommandLineGenerator; + +public class RtemsCommandLineGenerator extends ManagedCommandLineGenerator + implements IManagedCommandLineGenerator { + + public static final String ENV_RTEMS_TOOLSET = "RTEMS_TOOLSET"; + + public static final String TOOL_AR = "ar"; + public static final String TOOL_AS = "as"; + public static final String TOOL_GCC = "gcc"; + public static final String TOOL_GPP = "g++"; + + private static final String DEFAULT_RTEMS_TOOLSET = + "i386-rtems4.9-ar, i386-rtems4.9-as, i386-rtems4.9-gcc, i386-rtems4.9-g++"; + + private static HashMap toolCmdMap = new HashMap(10); + private String toolName; + + static { + String toolset = System.getenv(ENV_RTEMS_TOOLSET); + if (toolset==null) toolset = DEFAULT_RTEMS_TOOLSET; + + String[] tool = toolset.split(","); + for (int i=0; i= 0; + } + + drivePrefix = isOSWindows ? "C:" : ""; + + toolPath = getRtemsToolDirectory(); + targetToolPath = getRtemsTargetToolDirectory(); + targetCpuGccLibPath = getRtemsTargetCpuGccLibDirectory(); + installPath = getRtemsInstallDirectory(); + installBspPath = getRtemsInstallBspDirectory(); + + toolChainSupported = toolPath != null && targetToolPath != null + && installPath != null && installBspPath != null + && targetCpuGccLibPath != null; + + StringBuffer binPathBuf = new StringBuffer(); + StringBuffer incPathBuf = new StringBuffer(); + StringBuffer libPathBuf = new StringBuffer(); + + if (toolPath != null) { + binPathBuf = binPathBuf.append(toolPath.append("bin").toOSString()); + } + + if (targetCpuGccLibPath != null) { + if (libPathBuf.length()>0) libPathBuf.append(pathSeparator); + libPathBuf = libPathBuf.append(targetCpuGccLibPath.toOSString()); + + + IPath targetGccVersionPath; + try { + targetGccVersionPath = targetCpuGccLibPath.append(".."); + + IPath gccIncPath = targetGccVersionPath.append("include"); + if (!gccIncPath.toFile().isDirectory()) { + targetGccVersionPath = targetCpuGccLibPath; + } + } catch (Exception e) { + targetGccVersionPath = targetCpuGccLibPath; + } + + if (incPathBuf.length()>0) incPathBuf.append(pathSeparator); + incPathBuf = incPathBuf.append(targetGccVersionPath.append("include").toOSString()); + + incPathBuf.append(pathSeparator); + incPathBuf = incPathBuf.append(targetGccVersionPath.append("include-fixed").toOSString()); + + } + + if (targetToolPath != null) { + if (binPathBuf.length()>0) binPathBuf.append(pathSeparator); + binPathBuf = binPathBuf.append(targetToolPath.append("bin").toOSString()); + + if (incPathBuf.length()>0) incPathBuf.append(pathSeparator); + incPathBuf = incPathBuf.append(targetToolPath.append("include").toOSString()); + + if (libPathBuf.length()>0) libPathBuf.append(pathSeparator); + libPathBuf = libPathBuf.append(targetToolPath.append("lib").toOSString()); + } + + if (installPath != null) { + if (binPathBuf.length()>0) binPathBuf.append(pathSeparator); + binPathBuf = binPathBuf.append(installPath.append("bin").toOSString()); + } + + if (installBspPath != null) { + if (binPathBuf.length()>0) binPathBuf.append(pathSeparator); + binPathBuf = binPathBuf.append(installBspPath.append("build-tools").toOSString()); + + IPath bspLibPath = installBspPath.append("lib"); + if (incPathBuf.length()>0) incPathBuf.append(pathSeparator); + incPathBuf = incPathBuf.append(bspLibPath.append("include").toOSString()); + + if (libPathBuf.length()>0) libPathBuf.append(pathSeparator); + libPathBuf = libPathBuf.append(bspLibPath.toOSString()); + } + + evBinPath = new RtemsBuildEnvironmentVariable("PATH", + binPathBuf.toString(), + IBuildEnvironmentVariable.ENVVAR_PREPEND); + evCIncludePath = new RtemsBuildEnvironmentVariable("C_INCLUDE_PATH", + incPathBuf.toString(), + IBuildEnvironmentVariable.ENVVAR_PREPEND); + //evCppIncludePath = new RtemsBuildEnvironmentVariable("CPLUS_INCLUDE_PATH", + // incPath.toString(), + // IBuildEnvironmentVariable.ENVVAR_PREPEND); + evLibPath = new RtemsBuildEnvironmentVariable("LIBRARY_PATH", + libPathBuf.toString(), + IBuildEnvironmentVariable.ENVVAR_PREPEND); + } + + public RtemsEnvironmentVariableSupplier() { + } + + public IBuildEnvironmentVariable getVariable(String variableName, + IConfiguration configuration, IEnvironmentVariableProvider provider) { + if (evBinPath != null && + variableName.equals(evBinPath.getName())) { + return evBinPath; + + } else if (evLibPath != null && + variableName.equals(evLibPath.getName())) { + return evLibPath; + + } else if (evCIncludePath != null && + variableName.equals(evCIncludePath.getName())) { + return evCIncludePath; + } + + return null; + } + + public IBuildEnvironmentVariable[] getVariables( + IConfiguration configuration, IEnvironmentVariableProvider provider) { + return new IBuildEnvironmentVariable[] { + evBinPath, evCIncludePath, evLibPath }; + } + + public static IPath getRtemsToolDirectory() { + IPath path; + + // Preferred way to get RTEMS Tool directory via environment variable + String dir = System.getenv(ENV_RTEMS_TOOL_DIR); + if (dir != null) { + path = new Path(dir); + if (path.toFile().isDirectory()) return path; + } + + // Try to locate RTEMS Tool directory at /opt/rtems + // User can create such a soft link to point to the latest one + path = new Path(drivePrefix + "/opt/rtems"); + if (path.toFile().isDirectory()) return path; + + // Try RTEMS 4.9 specific tool bin directory + path = new Path(drivePrefix + "/opt/rtems-4.9"); + if (path.toFile().isDirectory()) return path; + + // Still not found + return null; + } + + public static IPath getRtemsTargetToolDirectory() { + IPath path; + + // Preferred way to get RTEMS Target Tool directory via environment variable + String dir = System.getenv(ENV_RTEMS_TARGET_TOOL_DIR); + if (dir != null) { + path = new Path(dir); + if (path.toFile().isDirectory()) return path; + } + + // Try to locate RTEMS Target Tool directory at /opt/rtems/i386-rtems4.9 + // User can create such a soft link to point to the latest one + path = new Path(drivePrefix + "/opt/rtems/i386-rtems4.9"); + if (path.toFile().isDirectory()) return path; + + // Try RTEMS 4.9 specific target tool bin directory + path = new Path(drivePrefix + "/opt/rtems-4.9/i386-rtems4.9"); + if (path.toFile().isDirectory()) return path; + + // Still not found + return null; + } + + public static IPath getRtemsTargetCpuGccLibDirectory() { + IPath path; + + // Preferred way to get RTEMS Target Tool directory via environment variable + String dir = System.getenv(ENV_RTEMS_TARGET_CPU_GCC_LIB_DIR); + if (dir != null) { + path = new Path(dir); + if (path.toFile().isDirectory()) return path; + } + + //Try default RTEMS 4.9 Target Tool bin directory + path = new Path(drivePrefix + "/opt/rtems-4.9/lib/gcc/i386-rtems4.9/4.3.2/mpentiumpro"); + if (path.toFile().isDirectory()) return path; + + // Still not found + return null; + } + + public static IPath getRtemsInstallDirectory() { + IPath path; + + // Preferred way to get RTEMS Install directory via environment variable + String dir = System.getenv(ENV_RTEMS_INSTALL_DIR); + if (dir != null) { + path = new Path(dir); + if (path.toFile().isDirectory()) return path; + } + + // Try /opt/rtems_install + path = new Path(drivePrefix + "/opt/rtems_install"); + if (path.toFile().isDirectory()) return path; + + // Still not found + return null; + } + + public static IPath getRtemsInstallBspDirectory() { + IPath path; + + // Preferred way to get installed target lib directory via environment variable + String dir = System.getenv(ENV_RTEMS_INSTALL_BSP_DIR); + if (dir != null) { + path = new Path(dir); + if (path.toFile().isDirectory()) return path; + } + + // Try /opt/rtems_install/i386-rtems4.9/pc686/lib + path = new Path(drivePrefix + "/opt/rtems_install/i386-rtems4.9/pc686/lib"); + if (path.toFile().isDirectory()) return path; + + // Still not found + return null; + } + + public static IPath getRtemsInstallBspLibDirectory() { + IPath installedBspLibPath = getRtemsInstallBspDirectory(); + + if (installedBspLibPath != null) { + installedBspLibPath = installedBspLibPath.append("lib"); + } + + return installedBspLibPath; + } +} + diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsInstallBspDirectoryValueHandler.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsInstallBspDirectoryValueHandler.java new file mode 100644 index 0000000..9be247e --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsInstallBspDirectoryValueHandler.java @@ -0,0 +1,101 @@ +package org.rtems.cdt.toolchain; + +import org.eclipse.cdt.managedbuilder.core.IBuildObject; +import org.eclipse.cdt.managedbuilder.core.IHoldsOptions; +import org.eclipse.cdt.managedbuilder.core.IManagedOptionValueHandler; +import org.eclipse.cdt.managedbuilder.core.IOption; +import org.eclipse.core.runtime.IPath; + +public class RtemsInstallBspDirectoryValueHandler implements IManagedOptionValueHandler { + private IPath installedBspLibPath; // e.g., /opt/rtems_install/i386-rtems4.9/pc686/lib + + public RtemsInstallBspDirectoryValueHandler() { + installedBspLibPath = RtemsEnvironmentVariableSupplier.getRtemsInstallBspLibDirectory(); + } + + /** + * Handles transfer between values between UI element and + * back-end in different circumstances. + * + * @param configuration build configuration of option + * (may be IConfiguration or IResourceConfiguration) + * @param holder contains the holder of the option + * @param option the option that is handled + * @param extraArgument extra argument for handler + * @param event event to be handled, one of the following: + * (EVENT_OPEN = 1, EVENT_CLOSE = 2, + * EVENT_SETDEFAULT = 3, + * EVENT_APPLY = 4, EVENT_LOAD = 5) + * + * @return True when the event was handled, false otherwise. + * This enables default event handling can take place. + */ + public boolean handleValue(IBuildObject configuration, IHoldsOptions holder, + IOption option, String extraArgument, int event) { + if (event == EVENT_CLOSE) return false; + + try { + String optionValue = (String) option.getValue(); + if (optionValue==null || optionValue.trim().length()<=0) { + option.setValue(installedBspLibPath.toPortableString()); + } + } catch (Exception e) { + return false; + } + + return true; + } + + /** + * Checks whether the value of an option is its default value. + * + * @param configuration build configuration of option + * (may be IConfiguration or IResourceConfiguration) + * @param holder contains the holder of the option + * @param option the option that is handled + * @param extraArgument extra argument for handler + * + * The additional options besides configuration are supplied to + * provide enough information for querying the default value from + * a potential data storage back-end. + * + * @return True if the options value is its default value and + * False otherwise. This enables that default event handling can + * take place. + */ + public boolean isDefaultValue(IBuildObject configuration, + IHoldsOptions holder, IOption option, String extraArgument) { + if (installedBspLibPath==null) return false; + + return installedBspLibPath.toPortableString().equals(option.getValue()); + } + + /** + * Checks whether an enumeration value of an option is currently a + * valid choice. The use-case for this method is the case, where + * the set of valid enumerations in the plugin.xml file changes. + * The UI will remove entries from selection lists if the value + * returns false. + * + * @param configuration build configuration of option + * (may be IConfiguration or IResourceConfiguration) + * @param holder contains the holder of the option + * @param option the option that is handled + * @param extraArgument extra argument for handler + * @param enumValue enumeration value that is to be checked + * + * The additional options besides configuration are supplied to + * provide enough information for querying information from a + * a potential data storage back-end. + * + * @return True if the enumeration value is valid and False + * otherwise. + */ + public boolean isEnumValueAppropriate(IBuildObject configuration, + IHoldsOptions holder, IOption option, String extraArgument, + String enumValue) { + // By default return true for all the enum values. + return true; + } + +} diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsLinkCommandLineInfo.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsLinkCommandLineInfo.java new file mode 100644 index 0000000..a19fef1 --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsLinkCommandLineInfo.java @@ -0,0 +1,23 @@ +package org.rtems.cdt.toolchain; + +import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedCommandLineInfo; + +public class RtemsLinkCommandLineInfo extends ManagedCommandLineInfo + implements IManagedCommandLineInfo { + + public RtemsLinkCommandLineInfo(String commandLine, + String commandLinePattern, String commandName, String flags, + String outputFlag, String outputPrefix, String outputName, + String inputResources) { + super(commandLine, commandLinePattern, commandName, flags, outputFlag, + outputPrefix, outputName, inputResources); + } + + public String getCommandLine() { + String defaultCmdLine = super.getCommandLine(); + String relObjs = RtemsManagerRelocationLinkHandler.getRelocationLinkObjs(); + return defaultCmdLine + relObjs; + } + +} diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsManagerRelocationLinkHandler.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsManagerRelocationLinkHandler.java new file mode 100644 index 0000000..5d41b60 --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsManagerRelocationLinkHandler.java @@ -0,0 +1,177 @@ +package org.rtems.cdt.toolchain; + +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; + +import org.eclipse.cdt.managedbuilder.core.IBuildObject; +import org.eclipse.cdt.managedbuilder.core.IHoldsOptions; +import org.eclipse.cdt.managedbuilder.core.IManagedOptionValueHandler; +import org.eclipse.cdt.managedbuilder.core.IOption; + +public class RtemsManagerRelocationLinkHandler implements + IManagedOptionValueHandler { + private static HashMap defaultMgrStatusMap = new HashMap(32); + private static HashMap mgrStatusMap = new HashMap(32); + private static HashMap no_mgr_relMap = new HashMap(32); + + private static String bspLibDir; + private static String relocationLinkObjs; + + static { + bspLibDir = " " + RtemsEnvironmentVariableSupplier. + getRtemsInstallBspLibDirectory().toPortableString() + "/"; + + defaultMgrStatusMap.put("barrier", Boolean.FALSE); + defaultMgrStatusMap.put("console", Boolean.TRUE); + defaultMgrStatusMap.put("dpmem", Boolean.FALSE); + defaultMgrStatusMap.put("event", Boolean.FALSE); + defaultMgrStatusMap.put("ext", Boolean.FALSE); + defaultMgrStatusMap.put("filesystem", Boolean.FALSE); + defaultMgrStatusMap.put("io", Boolean.TRUE); + defaultMgrStatusMap.put("mp", Boolean.FALSE); + defaultMgrStatusMap.put("msg", Boolean.FALSE); + defaultMgrStatusMap.put("part", Boolean.FALSE); + defaultMgrStatusMap.put("region", Boolean.FALSE); + defaultMgrStatusMap.put("rtmon", Boolean.FALSE); + defaultMgrStatusMap.put("sem", Boolean.FALSE); + defaultMgrStatusMap.put("signal", Boolean.FALSE); + defaultMgrStatusMap.put("timer", Boolean.FALSE); + + no_mgr_relMap.put("barrier" , "no-barrier.rel"); + no_mgr_relMap.put("console" , "no-console.rel"); + no_mgr_relMap.put("dpmem" , "no-dpmem.rel"); + no_mgr_relMap.put("event" , "no-event.rel"); + no_mgr_relMap.put("ext" , "no-ext.rel"); + no_mgr_relMap.put("filesystem", "no-filesystem.rel"); + no_mgr_relMap.put("io" , "no-io.rel"); + no_mgr_relMap.put("mp" , "no-mp.rel"); + no_mgr_relMap.put("msg" , "no-msg.rel"); + no_mgr_relMap.put("part" , "no-part.rel"); + no_mgr_relMap.put("region" , "no-region.rel"); + no_mgr_relMap.put("rtmon" , "no-rtmon.rel"); + no_mgr_relMap.put("sem" , "no-sem.rel"); + no_mgr_relMap.put("signal" , "no-signal.rel"); + no_mgr_relMap.put("timer" , "no-timer.rel"); + } + + public RtemsManagerRelocationLinkHandler() { + } + + /** + * @return the relocationLinkObjs + */ + public static synchronized String getRelocationLinkObjs() { + return relocationLinkObjs; + } + + private static synchronized void updateRelocationLink(String selectedMgrId, + Boolean enabled) { + StringBuilder rel = new StringBuilder(1024); // relocation link builder + mgrStatusMap.put(selectedMgrId, enabled); + + for(Iterator> + i = mgrStatusMap.entrySet().iterator(); i.hasNext(); ) { + Map.Entry entry = (Map.Entry) i.next(); + + String mgrId = (String)entry.getKey(); + Boolean mgrEnabled = (Boolean) entry.getValue(); + + if (!mgrEnabled.booleanValue()) { + rel = rel.append(bspLibDir).append( no_mgr_relMap.get(mgrId) ); + } + } + + relocationLinkObjs = rel.toString(); + } + + /** + * Handles transfer between values between UI element and + * back-end in different circumstances. + * + * @param configuration build configuration of option + * (may be IConfiguration or IResourceConfiguration) + * @param holder contains the holder of the option + * @param option the option that is handled + * @param extraArgument extra argument for handler + * @param event event to be handled, one of the following: + * (EVENT_OPEN = 1, EVENT_CLOSE = 2, + * EVENT_SETDEFAULT = 3, + * EVENT_APPLY = 4, EVENT_LOAD = 5) + * + * @return True when the event was handled, false otherwise. + * This enables default event handling can take place. + */ + public boolean handleValue(IBuildObject configuration, IHoldsOptions holder, + IOption option, String extraArgument, int event) { + if (event == EVENT_CLOSE) return false; + + try { + String mgrId = extraArgument; + Boolean enabled = (Boolean) option.getValue(); + + if (enabled==null) { + enabled = defaultMgrStatusMap.get(mgrId); + option.setValue(enabled.booleanValue()); + } + + updateRelocationLink(mgrId, enabled); + } catch (Exception e) { + return false; + } + + return true; + } + + /** + * Checks whether the value of an option is its default value. + * + * @param configuration build configuration of option + * (may be IConfiguration or IResourceConfiguration) + * @param holder contains the holder of the option + * @param option the option that is handled + * @param extraArgument extra argument for handler + * + * The additional options besides configuration are supplied to + * provide enough information for querying the default value from + * a potential data storage back-end. + * + * @return True if the options value is its default value and + * False otherwise. This enables that default event handling can + * take place. + */ + public boolean isDefaultValue(IBuildObject configuration, + IHoldsOptions holder, IOption option, String extraArgument) { + String mgrId = extraArgument; + return defaultMgrStatusMap.get(mgrId).equals(option.getValue()); + } + + /** + * Checks whether an enumeration value of an option is currently a + * valid choice. The use-case for this method is the case, where + * the set of valid enumerations in the plugin.xml file changes. + * The UI will remove entries from selection lists if the value + * returns false. + * + * @param configuration build configuration of option + * (may be IConfiguration or IResourceConfiguration) + * @param holder contains the holder of the option + * @param option the option that is handled + * @param extraArgument extra argument for handler + * @param enumValue enumeration value that is to be checked + * + * The additional options besides configuration are supplied to + * provide enough information for querying information from a + * a potential data storage back-end. + * + * @return True if the enumeration value is valid and False + * otherwise. + */ + public boolean isEnumValueAppropriate(IBuildObject configuration, + IHoldsOptions holder, IOption option, String extraArgument, + String enumValue) { + // By default return true for all the enum values. + return true; + } + +} diff --git a/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsScannerInfoCollector.java b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsScannerInfoCollector.java new file mode 100644 index 0000000..e074544 --- /dev/null +++ b/org.rtems.cdt.toolchain/src/org/rtems/cdt/toolchain/RtemsScannerInfoCollector.java @@ -0,0 +1,127 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 RobertF + * 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: + * RobertF - Initial API and implementation + *******************************************************************************/ +package org.rtems.cdt.toolchain; + +import java.util.Iterator; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; + +import org.eclipse.cdt.make.core.scannerconfig.InfoContext; +import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.Path; +import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector3; +import org.eclipse.cdt.make.internal.core.scannerconfig2.PerProjectSICollector; +import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil; +import org.eclipse.cdt.managedbuilder.scannerconfig.IManagedScannerInfoCollector; +import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil; + +/** + * Implementation class for gathering the built-in compiler settings for + * Rtems-based targets. + * + * @since 5.0.1 + */ +public class RtemsScannerInfoCollector extends PerProjectSICollector + implements IScannerInfoCollector3, IManagedScannerInfoCollector { + // extends DefaultGCCScannerInfoCollector <- has restriction, cannot be used + public static final String ENV_RTEMS_BSP_DEFINED_SYMBOLS = "RTEMS_BSP_DEFINED_SYMBOLS"; + + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector#contributeToScannerConfig(java.lang.Object, java.util.Map) + */ + public void contributeToScannerConfig(Object resource, Map scannerInfo) { + + List filteredIncludes = (List) scannerInfo.get(ScannerInfoTypes.INCLUDE_PATHS); + + // This method will be called by the parser each time there is a new value + Iterator pathIter = filteredIncludes.listIterator(); + while (pathIter.hasNext()) { + String incPath = (String) pathIter.next(); + // Could find the switch to disable auto discovery, so filtered + // out MinGW and Cygwin default includes + if (incPath.contains("MinGW") || incPath.contains("mingw") + || incPath.contains("Cygwin") || incPath.contains("cygwin")) { + pathIter.remove(); + } + } + //scannerInfo.put(ScannerInfoTypes.INCLUDE_PATHS, filteredIncludes); + + List definedSymbols = (List) scannerInfo.get(ScannerInfoTypes.SYMBOL_DEFINITIONS); + + addBspDefinedSymbols(definedSymbols); + + //scannerInfo.put(ScannerInfoTypes.SYMBOL_DEFINITIONS, definedSymbols); + + super.contributeToScannerConfig(resource, scannerInfo); + } + + private static void addBspDefinedSymbols(List definedSymbols) { + if (definedSymbols==null) return; + + String bspSymbols = System.getenv(ENV_RTEMS_BSP_DEFINED_SYMBOLS); + // e.g., "STDC_HEADERS,HAVE_SYS_TYPES_H,HAVE_SYS_STAT_H,HAVE_STDLIB_H..." + if (bspSymbols != null) { + String[] macro = bspSymbols.split(","); + for (int i=0; i getBspDefinedSymbols() { + ArrayList definedSymbols = new ArrayList(); + + addBspDefinedSymbols(definedSymbols); + + return definedSymbols; + } + + /** + * Answers a map of collected defines that the the compiler uses by default. + * The symbols are defined in the map as a (macro, value) pair as follows + *

-DFOO will be stored as ("FOO","") + *

-DFOO=BAR will be stored as ("FOO","BAR") + *

Duplicates will not be stored in the map and any whitespaces in + * the macro or value will be trimmed out. + * + * @return a Map of defined symbols and values + */ + /* + public Map getDefinedSymbols() { + HashMap symbolMap = new HashMap(); + + String bspSymbols = System.getenv(ENV_RTEMS_BSP_DEFINED_SYMBOLS); + //String bspSymbols ="STDC_HEADERS,HAVE_SYS_TYPES_H,HAVE_SYS_STAT_H,HAVE_STDLIB_H,HAVE_STRING_H,HAVE_INTTYPES_H,HAVE_STDINT_H,HAVE_UNISTD_H,HAVE_CSTDIO,HAVE_CSTDLIB,HAVE_IOSTREAM"; + + if (bspSymbols != null) { + String[] macro = bspSymbols.split(","); + for (int i=0; i +#include + +#include /* String function definitions */ +#include /* UNIX standard function definitions */ +#include /* File control definitions */ +#include /* Error number definitions */ +#include /* POSIX terminal control definitions */ + +#include +#include + +// BSP specific include +#include +#include +#include + + +extern rtems_task Init(rtems_task_argument argument); + +#define CONFIGURE_APPLICATION_EXTRA_DRIVERS TTY1_DRIVER_TABLE_ENTRY + +#ifdef RTEMS_BSP_HAS_IDE_DRIVER +#include /* for ata driver prototype */ +#include /* for general ide driver prototype */ +#endif + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#ifdef RTEMS_BSP_HAS_IDE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER +#endif +#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK +#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM + +/* + * these values are higher than needed... + */ +#define CONFIGURE_MAXIMUM_TASKS 20 +#define CONFIGURE_MAXIMUM_SEMAPHORES 20 +#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 20 +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 20 +#define STACK_CHECKER_ON +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_EXTRA_TASK_STACKS (6 * RTEMS_MINIMUM_STACK_SIZE) + +#define CONFIGURE_MALLOC_STATISTICS + + +#include + + +#define CONFIGURE_SHELL_COMMANDS_INIT +#define CONFIGURE_SHELL_COMMANDS_ALL + +#include + +extern int BSPConsolePort; + +/* Temporarily worked around the issue with remote_debug in i386. + "int remote_debug;" is defined in m68k-stub.c, but only declared + in i386-stub.c. Also except "remote_debug = !(remote_debug);", nowhere else + value is assigned to remote_debug. + */ +int remote_debug = 1; + +/* + * Setup GDB as described in c\src\lib\libbsp\i386\shared\comm\GDB.HOWTO. + * + * Later found similar function: init_remote_gdb in + * c\src\lib\libbsp\i386\shared\comm\gdb_glue.c. But it does not fit with the + * following hardware configuration: + * there exist VGA console and COM1, but not COM2. + */ +void setupRemoteGDB(void) { + // Initialize GDB glue + /* + if(BSPConsolePort != BSP_UART_COM2) { + // If com2 is not used as console use it for debugging + i386_stub_glue_init(BSP_UART_COM2); + } else { // Otherwise use com1 */ + i386_stub_glue_init(BSP_UART_COM1); + //} + + // Initialize GDB stub itself + set_debug_traps(); + + // Initialize GDB break in capability + // It has to be called after set_debug_traps + i386_stub_glue_init_breakin(); + + // Put breakpoint in + breakpoint(); +} + +void testIO(char *devName) { + char buffer[256]; + + #ifdef TEST_COM1 + printf("*** Simple COM1 Test (9600 8N1) ***\n"); + #else + printf("*** Simple Remote Debug Test ***\n"); + #endif + + int fd = open(devName, O_RDWR | O_NOCTTY | _FNDELAY); + + int numBytes = write(fd, "Hello, I'm waiting for input...\r\n", 33); + if (numBytes < 0) { + printf("\nFailed to write to %s!\n", devName); + } + + numBytes = read(fd, buffer, 255); + if (numBytes < 0) { + printf("\nFailed to read from %s!\n", devName); + + } else { + buffer[numBytes] = 0; // terminate + printf(buffer); + } + + close(fd); + } + +void startShell(void) { + printf("\n====== starting shell ======\n"); + rtems_shell_init( + "SHLL", /* task_name */ + RTEMS_MINIMUM_STACK_SIZE * 4, /* task_stacksize */ + 100, /* task_priority */ + "/dev/console", /* devname */ + 0, /* forever */ + 1 /* wait */ + ); +} + +rtems_task Init(rtems_task_argument ignored) { +#ifdef TEST_COM1 + char devName[] = "/dev/ttyS1"; +#else + char devName[] = "/dev/console"; + + setupRemoteGDB(); +#endif + + testIO(devName); + + startShell(); + + exit( 0 ); +} diff --git a/org.rtems.cdt.toolchain/templates/serial/template.properties b/org.rtems.cdt.toolchain/templates/serial/template.properties new file mode 100644 index 0000000..17bc9b2 --- /dev/null +++ b/org.rtems.cdt.toolchain/templates/serial/template.properties @@ -0,0 +1,3 @@ +#Template Default Values +RTEMS.Serial.Template.Label=RTEMS Serial Remote Debug Project +RTEMS.Serial.Template.Label.Description=A skeletal RTEMS serial remote debug project. Creates a folder for sources and another for include. diff --git a/org.rtems.cdt.toolchain/templates/serial/template.xml b/org.rtems.cdt.toolchain/templates/serial/template.xml new file mode 100644 index 0000000..39f32b1 --- /dev/null +++ b/org.rtems.cdt.toolchain/templates/serial/template.xml @@ -0,0 +1,69 @@ + + + -- cgit v1.2.3