Skip to content

Commit

Permalink
Modernize Arduino plug-ins. Adjust APIs to suite.
Browse files Browse the repository at this point in the history
Change-Id: Ic877c8f0992874e647d4b464502165d7bd3ebe0e
  • Loading branch information
dschaefer committed Apr 28, 2016
1 parent b2300cb commit 7139dc2
Show file tree
Hide file tree
Showing 60 changed files with 1,248 additions and 1,848 deletions.
13 changes: 4 additions & 9 deletions build/org.eclipse.cdt.build.gcc.core/plugin.xml
@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.cdt.core.toolChainType">
<toolChainType
class="org.eclipse.cdt.build.gcc.core.GCCToolChainType"
id="org.eclipse.cdt.build.gcc">
</toolChainType>
</extension>
<extension
point="org.eclipse.cdt.core.toolChainProvider">
<provider
class="org.eclipse.cdt.build.gcc.core.internal.GCCPathToolChainProvider">
class="org.eclipse.cdt.build.gcc.core.internal.GCCPathToolChainProvider"
id="org.eclipse.cdt.build.gcc.core.gccPathProvider">
</provider>
<provider
class="org.eclipse.cdt.build.gcc.core.internal.Msys2ToolChainProvider">
class="org.eclipse.cdt.build.gcc.core.internal.Msys2ToolChainProvider"
id="org.eclipse.cdt.build.gcc.core.msys2Provider">
</provider>
</extension>

Expand Down
Expand Up @@ -26,7 +26,7 @@
import org.eclipse.cdt.build.gcc.core.internal.Activator;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.cdt.core.build.IToolChainType;
import org.eclipse.cdt.core.build.IToolChainProvider;
import org.eclipse.cdt.core.envvar.EnvironmentVariable;
import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
import org.eclipse.cdt.core.parser.ExtendedScannerInfo;
Expand All @@ -41,45 +41,47 @@
import org.eclipse.core.runtime.PlatformObject;

/**
* The GCC toolchain. Placing it in cdt.core for now.
*
* TODO move to it's own plug-in.
*
* @since 5.12
* The GCC toolchain. This is the base class for all GCC toolchains. It represents GCC as found on
* the user's PATH. It can be overriden to change environment variable settings.
*/
public class GCCToolChain extends PlatformObject implements IToolChain {

private final IToolChainType type;
private final IToolChainProvider provider;
private final String name;
private final String command;
private String version;
private String target;
private Path path;
private IEnvironmentVariable pathVar;
private IEnvironmentVariable[] envVars;

public GCCToolChain(IToolChainType type, Path path, String command) {
this.type = type;
this.command = command;
getVersion(path.resolve(command).toString());
this.name = command + '-' + version;
this.path = path;
private final Path path;
private final String prefix;
private final IEnvironmentVariable pathVar;
private final IEnvironmentVariable[] envVars;

protected String[] compileCommands;

public GCCToolChain(IToolChainProvider provider, String name) {
this(provider, name, null, null);
}

pathVar = new EnvironmentVariable("PATH", path.toString(), IEnvironmentVariable.ENVVAR_PREPEND, //$NON-NLS-1$
File.pathSeparator);
envVars = new IEnvironmentVariable[] { pathVar };
public GCCToolChain(IToolChainProvider provider, String name, Path path) {
this(provider, name, path, null);
}

protected GCCToolChain(IToolChainType type, String name, String command) {
this.type = type;
public GCCToolChain(IToolChainProvider provider, String name, Path path, String prefix) {
this.provider = provider;
this.name = name;
this.command = command;
// TODO need to pull the other info out of preferences
this.path = path;
this.prefix = prefix;

if (path != null) {
pathVar = new EnvironmentVariable("PATH", path.toString(), IEnvironmentVariable.ENVVAR_PREPEND, //$NON-NLS-1$
File.pathSeparator);
envVars = new IEnvironmentVariable[] { pathVar };
} else {
pathVar = null;
envVars = new IEnvironmentVariable[0];
}
}

@Override
public IToolChainType getType() {
return type;
public IToolChainProvider getProvider() {
return provider;
}

@Override
Expand All @@ -89,8 +91,7 @@ public String getName() {

@Override
public String getProperty(String key) {
// TODO for now assume it's a local gcc
// Later use the target, especially to find out arch
// this class represents a local toolchain
switch (key) {
case ATTR_OS:
return Platform.getOS();
Expand All @@ -100,36 +101,6 @@ public String getProperty(String key) {
return null;
}

private static Pattern versionPattern = Pattern.compile(".*(gcc|LLVM) version .*"); //$NON-NLS-1$
private static Pattern targetPattern = Pattern.compile("Target: (.*)"); //$NON-NLS-1$

private void getVersion(String command) {
try {
Process proc = new ProcessBuilder(new String[] { command, "-v" }).redirectErrorStream(true) //$NON-NLS-1$
.start();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()))) {
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
Matcher versionMatcher = versionPattern.matcher(line);
if (versionMatcher.matches()) {
version = line.trim();
continue;
}
Matcher targetMatcher = targetPattern.matcher(line);
if (targetMatcher.matches()) {
target = targetMatcher.group(1);
continue;
}
}
}
} catch (IOException e) {
Activator.log(e);
}
}

public String getTarget() {
return target;
}

protected void addDiscoveryOptions(List<String> command) {
command.add("-E"); //$NON-NLS-1$
command.add("-P"); //$NON-NLS-1$
Expand All @@ -142,12 +113,12 @@ public IExtendedScannerInfo getScannerInfo(IBuildConfiguration buildConfig, Path
IExtendedScannerInfo baseScannerInfo, IResource resource, URI buildDirectoryURI) {
try {
Path buildDirectory = Paths.get(buildDirectoryURI);

List<String> commandLine = new ArrayList<>();
if (command.isAbsolute()) {
commandLine.add(command.toString());
} else {
commandLine.add(path.resolve(command).toString());
commandLine.add(getCommandPath(command).toString());
}

if (baseScannerInfo != null && baseScannerInfo.getIncludePaths() != null) {
Expand All @@ -160,12 +131,18 @@ public IExtendedScannerInfo getScannerInfo(IBuildConfiguration buildConfig, Path
commandLine.addAll(Arrays.asList(args));

// Change output to stdout
boolean haveOut = false;
for (int i = 0; i < commandLine.size() - 1; ++i) {
if (commandLine.get(i).equals("-o")) { //$NON-NLS-1$
commandLine.set(i + 1, "-"); //$NON-NLS-1$
haveOut = true;
break;
}
}
if (!haveOut) {
commandLine.add("-o"); //$NON-NLS-1$
commandLine.add("-"); //$NON-NLS-1$
}

// Change source file to a tmp file (needs to be empty)
Path tmpFile = null;
Expand Down Expand Up @@ -259,7 +236,7 @@ public String[] getErrorParserIds() {

@Override
public IEnvironmentVariable getVariable(String name) {
if (pathVar.getName().equals(name)) {
if (path != null && name.equals("PATH")) { //$NON-NLS-1$
return pathVar;
}
return null;
Expand All @@ -271,30 +248,46 @@ public IEnvironmentVariable[] getVariables() {
}

@Override
public Path getCommandPath(String command) {
return path.resolve(command);
public Path getCommandPath(Path command) {
if (command.isAbsolute()) {
return command;
}

if (path != null) {
return path.resolve(command);
}

// Look for it in the path environment var
String path = System.getenv("PATH"); //$NON-NLS-1$
for (String entry : path.split(File.pathSeparator)) {
Path entryPath = Paths.get(entry);
Path cmdPath = entryPath.resolve(command);
if (Files.isExecutable(cmdPath)) {
return cmdPath;
}
}

return null;
}

@Override
public IResource[] getResourcesFromCommand(String[] cmd, URI buildDirectoryURI) {
// Make sure this is our command
boolean found = false;
for (String arg : cmd) {
if (arg.startsWith("-")) { //$NON-NLS-1$
break;
}
Path cmdPath = Paths.get(arg);
if (cmdPath.getFileName().toString().equals(command)) {
found = true;
break;
public String[] getCompileCommands() {
if (compileCommands == null) {
List<String> cmds = new ArrayList<>();
for (String cmd : new String[] { "gcc", "g++", "clang", "clang++" }) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
cmd = prefix != null ? cmd : prefix + cmd;
Path cmdPath = getCommandPath(Paths.get(cmd));
if (cmdPath != null) {
cmds.add(cmd);
}
}
compileCommands = cmds.toArray(new String[compileCommands.length]);
}

if (!found) {
// not our command
return null;
}

return compileCommands;
}

@Override
public IResource[] getResourcesFromCommand(String[] cmd, URI buildDirectoryURI) {
// Start at the back looking for arguments
List<IResource> resources = new ArrayList<>();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
Expand All @@ -308,7 +301,7 @@ public IResource[] getResourcesFromCommand(String[] cmd, URI buildDirectoryURI)
resources.add(resource);
}
}

return resources.toArray(new IResource[resources.size()]);
}

Expand Down

This file was deleted.

0 comments on commit 7139dc2

Please sign in to comment.