diff --git a/build/org.eclipse.cdt.make.core/plugin.xml b/build/org.eclipse.cdt.make.core/plugin.xml
index 7b35b67148b..bee6f6a1a97 100644
--- a/build/org.eclipse.cdt.make.core/plugin.xml
+++ b/build/org.eclipse.cdt.make.core/plugin.xml
@@ -151,6 +151,13 @@
+
+
+
+
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java
index 9a4e38e2723..803f06dbcd7 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java
@@ -88,6 +88,9 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
IResource resource = event.getResource();
switch (event.getType()) {
+ case IResourceChangeEvent.POST_CHANGE :
+ ScannerConfigUtil.updateScannerConfigStore(event.getDelta());
+ break;
case IResourceChangeEvent.PRE_DELETE :
case IResourceChangeEvent.PRE_CLOSE :
if (resource.getType() == IResource.PROJECT) {
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigUtil.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigUtil.java
index 13cc77baae3..752ac579acd 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigUtil.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigUtil.java
@@ -23,6 +23,9 @@ import java.util.Set;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.QualifiedName;
@@ -297,29 +300,107 @@ public final class ScannerConfigUtil {
}
public static IPath getDiscoveredScannerConfigStore(IProject project, boolean delete) {
- String fileName = null;
+ String fileName = project.getName() + ".sc"; //$NON-NLS-1$
+ String storedFileName = null;
try {
- fileName = project.getPersistentProperty(discoveredScannerConfigFileNameProperty);
+ storedFileName = project.getPersistentProperty(discoveredScannerConfigFileNameProperty);
} catch (CoreException e) {
MakeCorePlugin.log(e.getStatus());
}
- if (fileName == null) {
- fileName = String.valueOf(sRandom.nextLong()) + ".sc"; //$NON-NLS-1$
- try {
- project.setPersistentProperty(discoveredScannerConfigFileNameProperty, fileName);
- } catch (CoreException e) {
- MakeCorePlugin.log(e.getStatus());
- }
- }
+ if (storedFileName != null && !storedFileName.equals(fileName)) {
+ // try to move 2.x file name format to 3.x file name format
+ movePluginStateFile(storedFileName, fileName);
+ }
+ try {
+ project.setPersistentProperty(discoveredScannerConfigFileNameProperty, fileName);
+ } catch (CoreException e) {
+ MakeCorePlugin.log(e.getStatus());
+ }
- IPath path = MakeCorePlugin.getWorkingDirectory();
- path = path.append(fileName);
if (delete) {
- File file = path.toFile();
- if (file.exists()) {
- file.delete();
- }
+ deletePluginStateFile(fileName);
}
- return path;
+ return MakeCorePlugin.getWorkingDirectory().append(fileName);
}
+
+ /**
+ * @param delta
+ */
+ public static void updateScannerConfigStore(IResourceDelta delta) {
+ try {
+ delta.accept(new IResourceDeltaVisitor() {
+
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ IResource resource = delta.getResource();
+ if (resource instanceof IProject) {
+ IProject project = (IProject) resource;
+ int kind = delta.getKind();
+ switch (kind) {
+ case IResourceDelta.REMOVED:
+ if ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
+ // project renamed
+ IPath newPath = delta.getMovedToPath();
+ IProject newProject = delta.getResource().getWorkspace().
+ getRoot().getProject(newPath.toString());
+ scProjectRenamed(project, newProject);
+ }
+ else {
+ // project deleted
+ scProjectDeleted(project);
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ });
+ }
+ catch (CoreException e) {
+ MakeCorePlugin.log(e);
+ }
+ }
+
+ private static void scProjectDeleted(IProject project) {
+ String scFileName = project.getName() + ".sc"; //$NON-NLS-1$
+ deletePluginStateFile(scFileName);
+ }
+
+ /**
+ * @param scFileName
+ */
+ private static void deletePluginStateFile(String scFileName) {
+ IPath path = MakeCorePlugin.getWorkingDirectory().append(scFileName);
+ File file = path.toFile();
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+
+ private static void scProjectRenamed(IProject project, IProject newProject) {
+ String scOldFileName = project.getName() + ".sc"; //$NON-NLS-1$
+ String scNewFileName = newProject.getName() + ".sc"; //$NON-NLS-1$
+ movePluginStateFile(scOldFileName, scNewFileName);
+ try {
+ newProject.setPersistentProperty(discoveredScannerConfigFileNameProperty, scNewFileName);
+ }
+ catch (CoreException e) {
+ MakeCorePlugin.log(e);
+ }
+ }
+
+ /**
+ * @param oldFileName
+ * @param newFileName
+ */
+ private static void movePluginStateFile(String oldFileName, String newFileName) {
+ IPath oldPath = MakeCorePlugin.getWorkingDirectory().append(oldFileName);
+ IPath newPath = MakeCorePlugin.getWorkingDirectory().append(newFileName);
+ File oldFile = oldPath.toFile();
+ File newFile = newPath.toFile();
+ if (oldFile.exists()) {
+ oldFile.renameTo(newFile);
+ }
+ }
+
}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java
index 7af11b0b8eb..9fa2175452c 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java
@@ -128,7 +128,7 @@ public class GCCPerFileBOPConsoleParser extends AbstractGCCBOPConsoleParser {
String genericLine = line.replaceAll(filePath, "LONG_NAME");
genericLine = genericLine.replaceAll(shortFileName+"\\.", "SHORT_NAME\\.");
- CCommandDSC cmd = fUtil.getNewCCommandDSC(genericLine);
+ CCommandDSC cmd = fUtil.getNewCCommandDSC(genericLine, extensionsIndex > 0);
List cmdList = new ArrayList();
cmdList.add(cmd);
Map sc = new HashMap(1);
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParserUtility.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParserUtility.java
index 30e343e3f01..6442203142e 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParserUtility.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParserUtility.java
@@ -110,7 +110,7 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
return;
compiledFileList.add(longFileName);
- CCommandDSC command = getNewCCommandDSC(genericLine);
+ CCommandDSC command = getNewCCommandDSC(genericLine, false); // assume .c file type
int index = commandsList2.indexOf(command);
if (index == -1) {
commandsList2.add(command);
@@ -126,9 +126,10 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
/**
* @param genericLine
+ * @param cppFileType
*/
- public CCommandDSC getNewCCommandDSC(String genericLine) {
- CCommandDSC command = new CCommandDSC();
+ public CCommandDSC getNewCCommandDSC(String genericLine, boolean cppFileType) {
+ CCommandDSC command = new CCommandDSC(cppFileType);
String[] tokens = genericLine.split("\\s+");
command.addSCOption(new KVPair(SCDOptionsEnum.COMMAND, tokens[0]));
for (int i = 1; i < tokens.length; ++i) {
@@ -179,7 +180,11 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
}
else {
// relative path
- pFilePath = getWorkingDirectory().append(filePath);
+ IPath cwd = getWorkingDirectory();
+ if (!cwd.isAbsolute()) {
+ cwd = getBaseDirectory().append(cwd);
+ }
+ pFilePath = cwd.append(filePath);
}
return pFilePath;
}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileSIPConsoleParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileSIPConsoleParser.java
new file mode 100644
index 00000000000..89f2721aec0
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileSIPConsoleParser.java
@@ -0,0 +1,118 @@
+/***********************************************************************
+ * Copyright (c) 2004 IBM Corporation 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:
+ * IBM - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.make.internal.core.scannerconfig.gnu;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.cdt.core.IMarkerGenerator;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
+import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Console parser for generated makefile output
+ *
+ * @author vhirsl
+ */
+public class GCCPerFileSIPConsoleParser implements IScannerInfoConsoleParser {
+ private final String INCLUDE = "#include"; //$NON-NLS-1$
+ private final String DEFINE = "#define"; //$NON-NLS-1$
+ private final String COMMAND_ID_BEGIN = "begin generating scanner info for scd_cmd_"; //$NON-NLS-1$
+ private final String COMMAND_ID_END = "end generating scanner info for scd_cmd_"; //$NON-NLS-1$
+
+ private IProject fProject = null;
+ private IScannerInfoCollector fCollector = null;
+
+ private boolean expectingIncludes = false;
+ private List symbols;
+ private List includes;
+ private int commandId = -1;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#startup(org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IPath, org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector, org.eclipse.cdt.core.IMarkerGenerator)
+ */
+ public void startup(IProject project, IPath workingDirectory, IScannerInfoCollector collector, IMarkerGenerator markerGenerator) {
+ this.fProject = project;
+ this.fCollector = collector;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParser#processLine(java.lang.String)
+ */
+ public boolean processLine(String line) {
+ boolean rc = false;
+ TraceUtil.outputTrace("GCCPerFileSIPConsoleParser parsing line:", TraceUtil.EOL, line); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if (line.startsWith(COMMAND_ID_BEGIN)) {
+ commandId = Integer.parseInt(line.substring(COMMAND_ID_BEGIN.length()));
+ symbols = new ArrayList();
+ includes = new ArrayList();
+ }
+ else if (line.startsWith(COMMAND_ID_END)) {
+ Map scannerInfo = new HashMap();
+ scannerInfo.put(ScannerInfoTypes.INCLUDE_PATHS, includes);
+ scannerInfo.put(ScannerInfoTypes.SYMBOL_DEFINITIONS, symbols);
+ fCollector.contributeToScannerConfig(new Integer(commandId), scannerInfo);
+ commandId = -1;
+ rc = true;
+ }
+ // contribution of -dD option
+ else if (line.startsWith(DEFINE)) {
+ String[] defineParts = line.split("\\s+", 3); //$NON-NLS-1$
+ if (defineParts[0].equals(DEFINE)) {
+ String symbol = null;
+ switch (defineParts.length) {
+ case 2:
+ symbol = defineParts[1];
+ break;
+ case 3:
+ symbol = defineParts[1] + "=" + defineParts[2]; //$NON-NLS-1$
+ break;
+ }
+ if (symbol != null && !symbols.contains(symbol)) { //$NON-NLS-1$
+ symbols.add(symbol);
+ }
+ }
+ }
+ // now get all the includes
+ else if (line.startsWith(INCLUDE) && line.endsWith("search starts here:")) { //$NON-NLS-1$
+ expectingIncludes = true;
+ }
+ else if (line.startsWith("End of search list.")) { //$NON-NLS-1$
+ expectingIncludes = false;
+ }
+ else if (expectingIncludes) {
+ if (!includes.contains(line))
+ includes.add(line);
+ }
+
+ return rc;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParser#shutdown()
+ */
+ public void shutdown() {
+// Map scannerInfo = new HashMap();
+// scannerInfo.put(ScannerInfoTypes.INCLUDE_PATHS, includes);
+// scannerInfo.put(ScannerInfoTypes.SYMBOL_DEFINITIONS, symbols);
+// fCollector.contributeToScannerConfig(fProject, scannerInfo);
+// TraceUtil.outputTrace("Scanner info from \'specs\' file", //$NON-NLS-1$
+// "Include paths", includes, new ArrayList(), "Defined symbols", symbols); //$NON-NLS-1$ //$NON-NLS-2$);
+ }
+
+}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCSpecsConsoleParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCSpecsConsoleParser.java
index 0bdb11e6d2e..5e99e58ac58 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCSpecsConsoleParser.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCSpecsConsoleParser.java
@@ -66,7 +66,7 @@ public class GCCSpecsConsoleParser implements IScannerInfoConsoleParser {
symbol = defineParts[1];
break;
case 3:
- symbol = defineParts[1] + "=" + defineParts[2];
+ symbol = defineParts[1] + "=" + defineParts[2]; //$NON-NLS-1$
break;
}
if (symbol != null && !symbols.contains(symbol)) { //$NON-NLS-1$
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/CCommandDSC.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/CCommandDSC.java
index 3a5752567e8..a4c667089c6 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/CCommandDSC.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/CCommandDSC.java
@@ -28,18 +28,25 @@ public class CCommandDSC {
private boolean discovered;
// private List files; // list of files this command applies to
private boolean cppFileType; // C or C++ file type
- // TODO add discovered scanner config
- /**
- *
+
+ private List symbols;
+ private List includes;
+
+ /**
+ * @param cppFileType2
*/
- public CCommandDSC() {
+ public CCommandDSC(boolean cppFileType) {
compilerCommand = new ArrayList();
discovered = false;
// files = null;
- cppFileType = false; // assume C file type
+ this.cppFileType = cppFileType;
commandId = ++ids;
}
+ public boolean appliesToCFileType() {
+ return !cppFileType;
+ }
+
public void addSCOption(KVPair option) {
compilerCommand.add(option);
}
@@ -142,7 +149,9 @@ public class CCommandDSC {
*/
public boolean equals(Object arg0) {
if (arg0 != null && arg0.getClass().equals(this.getClass())) {
- return compilerCommand.equals(((CCommandDSC)arg0).compilerCommand);
+ CCommandDSC other = (CCommandDSC)arg0;
+ return (compilerCommand.equals(other.compilerCommand) &&
+ cppFileType == other.cppFileType);
}
return false;
}
@@ -153,4 +162,40 @@ public class CCommandDSC {
return compilerCommand.hashCode();
}
+ /**
+ * @return Returns the includes.
+ */
+ public List getIncludes() {
+ return includes;
+ }
+ /**
+ * @param includes The includes to set.
+ */
+ public void setIncludes(List includes) {
+ this.includes = includes;
+ }
+ /**
+ * @return Returns the symbols.
+ */
+ public List getSymbols() {
+ return symbols;
+ }
+ /**
+ * @param symbols The symbols to set.
+ */
+ public void setSymbols(List symbols) {
+ this.symbols = symbols;
+ }
+ /**
+ * @return Returns the discovered.
+ */
+ public boolean isDiscovered() {
+ return discovered;
+ }
+ /**
+ * @param discovered The discovered to set.
+ */
+ public void setDiscovered(boolean discovered) {
+ this.discovered = discovered;
+ }
}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java
index dac9bc70e64..065d1288469 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java
@@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -24,29 +25,30 @@ import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
/**
- * TODO Provide description
+ * Per file scanner info collector
*
* @author vhirsl
*/
public class PerFileSICollector implements IScannerInfoCollector2 {
private IProject project;
- private Map commandIdToFilesMap; // command id and list of files it applies to
+ private Map commandIdToFilesMap; // command id and list of files it applies to
private Map fileToCommandIdsMap; // maps each file to the list of corresponding command ids
-
private Map commandIdCommandMap; // map of all commands
+
private int commandIdCounter = 0;
/**
*
*/
public PerFileSICollector() {
- commandIdToFilesMap = new HashMap();
- fileToCommandIdsMap = new HashMap();
- commandIdCommandMap = new HashMap();
+ commandIdToFilesMap = new HashMap(); // [commandId, List of files]
+ fileToCommandIdsMap = new HashMap(); // [file, List of commands]
+ commandIdCommandMap = new LinkedHashMap(); // [commandId, command]
}
/* (non-Javadoc)
@@ -64,7 +66,11 @@ public class PerFileSICollector implements IScannerInfoCollector2 {
String errorMessage = null;
if (resource == null) {
errorMessage = "resource is null";//$NON-NLS-1$
- }
+ }
+ else if (resource instanceof Integer) {
+ addScannerInfo(((Integer)resource), scannerInfo);
+ return;
+ }
else if (!(resource instanceof IFile)) {
errorMessage = "resource is not an IFile";//$NON-NLS-1$
}
@@ -75,7 +81,7 @@ public class PerFileSICollector implements IScannerInfoCollector2 {
errorMessage = "wrong project";//$NON-NLS-1$
}
if (errorMessage != null) {
- TraceUtil.outputError("PerProjectSICollector.contributeToScannerConfig : ", errorMessage); //$NON-NLS-1$
+ TraceUtil.outputError("PerFileSICollector.contributeToScannerConfig : ", errorMessage); //$NON-NLS-1$
return;
}
IFile file = (IFile) resource;
@@ -86,11 +92,26 @@ public class PerFileSICollector implements IScannerInfoCollector2 {
addCompilerCommands(file, (List) scannerInfo.get(type));
}
else {
- addScannerInfo(type, scannerInfo.get(type));
+ addScannerInfo(type, (List) scannerInfo.get(type));
}
}
}
+ /**
+ * @param commandId
+ * @param scannerInfo
+ */
+ private void addScannerInfo(Integer commandId, Map scannerInfo) {
+ CCommandDSC cmd = (CCommandDSC) commandIdCommandMap.get(commandId);
+ if (cmd != null) {
+ List symbols = (List) scannerInfo.get(ScannerInfoTypes.SYMBOL_DEFINITIONS);
+ List includes = (List) scannerInfo.get(ScannerInfoTypes.INCLUDE_PATHS);
+ cmd.setSymbols(symbols);
+ cmd.setIncludes(includes);
+ cmd.setDiscovered(true);
+ }
+ }
+
/**
* @param file
* @param object
@@ -133,7 +154,7 @@ public class PerFileSICollector implements IScannerInfoCollector2 {
* @param type
* @param object
*/
- private void addScannerInfo(ScannerInfoTypes type, Object object) {
+ private void addScannerInfo(ScannerInfoTypes type, List delta) {
// TODO Auto-generated method stub
}
@@ -141,8 +162,7 @@ public class PerFileSICollector implements IScannerInfoCollector2 {
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2#updateScannerConfiguration(org.eclipse.core.runtime.IProgressMonitor)
*/
- public void updateScannerConfiguration(IProgressMonitor monitor)
- throws CoreException {
+ public void updateScannerConfiguration(IProgressMonitor monitor) throws CoreException {
// TODO Auto-generated method stub
}
@@ -151,8 +171,31 @@ public class PerFileSICollector implements IScannerInfoCollector2 {
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector#getCollectedScannerInfo(java.lang.Object, org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes)
*/
public List getCollectedScannerInfo(Object resource, ScannerInfoTypes type) {
- // TODO Auto-generated method stub
- return null;
+ List rv = null;
+ // check the resource
+ String errorMessage = null;
+ if (resource == null) {
+ errorMessage = "resource is null";//$NON-NLS-1$
+ }
+ else if (!(resource instanceof IResource)) {
+ errorMessage = "resource is not an IResource";//$NON-NLS-1$
+ }
+ else if (((IResource) resource).getProject() == null) {
+ errorMessage = "project is null";//$NON-NLS-1$
+ }
+ else if (((IResource) resource).getProject() != project) {
+ errorMessage = "wrong project";//$NON-NLS-1$
+ }
+
+ if (errorMessage != null) {
+ TraceUtil.outputError("PerProjectSICollector.getCollectedScannerInfo : ", errorMessage); //$NON-NLS-1$
+ }
+ else if (project.equals(((IResource)resource).getProject())) {
+ if (type.equals(ScannerInfoTypes.COMPILER_COMMAND)) {
+ rv = new ArrayList(commandIdCommandMap.values());
+ }
+ }
+ return rv;
}
}
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerProjectSICollector.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerProjectSICollector.java
index 2e4fbecf2ec..9b1dc746608 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerProjectSICollector.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerProjectSICollector.java
@@ -173,35 +173,26 @@ public class PerProjectSICollector implements IScannerInfoCollector2, IScannerIn
if (monitor == null) {
monitor = new NullProgressMonitor();
}
- // check TSO for the project
- updateScannerConfig(monitor);
+ IDiscoveredPathInfo pathInfo = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
+ monitor.beginTask(MakeMessages.getString("ScannerInfoCollector.Processing"), 100); //$NON-NLS-1$
+ if (pathInfo != null) {
+ monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Processing")); //$NON-NLS-1$
+ if (scannerConfigNeedsUpdate(pathInfo)) {
+ monitor.worked(50);
+ monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Updating") + project.getName()); //$NON-NLS-1$
+ try {
+ // update scanner configuration
+ MakeCorePlugin.getDefault().getDiscoveryManager().updateDiscoveredInfo(pathInfo);
+ monitor.worked(50);
+ } catch (CoreException e) {
+ MakeCorePlugin.log(e);
+ }
+ }
+ }
+ monitor.done();
scPersisted = true;
}
- /**
- * @param monitor
- * @throws CoreException
- */
- private void updateScannerConfig(IProgressMonitor monitor) throws CoreException {
- IDiscoveredPathInfo pathInfo = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
- monitor.beginTask(MakeMessages.getString("ScannerInfoCollector.Processing"), 100); //$NON-NLS-1$
- if (pathInfo != null) {
- monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Processing")); //$NON-NLS-1$
- if (scannerConfigNeedsUpdate(pathInfo)) {
- monitor.worked(50);
- monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Updating") + project.getName()); //$NON-NLS-1$
- try {
- // update scanner configuration
- MakeCorePlugin.getDefault().getDiscoveryManager().updateDiscoveredInfo(pathInfo);
- monitor.worked(50);
- } catch (CoreException e) {
- MakeCorePlugin.log(e);
- }
- }
- }
- monitor.done();
- }
-
/**
* Compare discovered include paths and symbol definitions with the ones from scanInfo.
*
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCDMakefileGenerator.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCDMakefileGenerator.java
new file mode 100644
index 00000000000..6c999fe6142
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCDMakefileGenerator.java
@@ -0,0 +1,110 @@
+/***********************************************************************
+ * Copyright (c) 2004 IBM Corporation 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:
+ * IBM - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.make.internal.core.scannerconfig2;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.cdt.make.core.MakeCorePlugin;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
+import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
+
+
+/**
+ * A 'provider' that will generate a special makefile to generate scanner config
+ *
+ * @author vhirsl
+ */
+public class SCDMakefileGenerator extends DefaultRunSIProvider {
+ private static final String ENDL = System.getProperty("line.separator"); //$NON-NLS-1$
+ private static final String DENDL = ENDL+ENDL;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.make.internal.core.scannerconfig2.DefaultRunSIProvider#initialize()
+ */
+ protected boolean initialize() {
+ boolean rc = super.initialize();
+
+ if (rc) {
+ fWorkingDirectory = MakeCorePlugin.getWorkingDirectory();
+ // replace string variables in compile arguments
+ // TODO Vmir - use string variable replacement
+ for (int i = 0; i < fCompileArguments.length; ++i) {
+ fCompileArguments[i] = fCompileArguments[i].replaceAll("\\$\\{project_name\\}", //$NON-NLS-1$
+ resource.getProject().getName());
+ }
+ rc = generateMakefile(resource.getProject().getName());
+ }
+ return rc;
+ }
+
+ /**
+ * @param name
+ * @return
+ */
+ private boolean generateMakefile(String projectName) {
+ boolean rc = false;
+ if (collector instanceof IScannerInfoCollector2) {
+ IScannerInfoCollector2 collector2 = (IScannerInfoCollector2) collector;
+ List commands = collector2.getCollectedScannerInfo(
+ resource.getProject(), ScannerInfoTypes.COMPILER_COMMAND);
+ if (commands != null && commands.size() > 0) {
+
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("# This is a generated file. Please do not edit."); //$NON-NLS-1$
+ buffer.append(DENDL);
+ buffer.append(".PHONY: all"); //$NON-NLS-1$
+ buffer.append(DENDL);
+ buffer.append("COMMANDS := "); //$NON-NLS-1$
+ for (Iterator i = commands.iterator(); i.hasNext(); ) {
+ CCommandDSC cmd = (CCommandDSC) i.next();
+ buffer.append("\t\\"+ENDL+"\t scd_cmd_"); //$NON-NLS-1$ //$NON-NLS-2$
+ buffer.append(cmd.getCommandId());
+ }
+ buffer.append(DENDL);
+ buffer.append("all: $(COMMANDS)"); //$NON-NLS-1$
+ buffer.append(DENDL);
+ for (Iterator i = commands.iterator(); i.hasNext(); ) {
+ CCommandDSC cmd = (CCommandDSC) i.next();
+ buffer.append("scd_cmd_"); //$NON-NLS-1$
+ buffer.append(cmd.getCommandId());
+ buffer.append(':');
+ buffer.append(ENDL);
+ buffer.append("\t@echo begin generating scanner info for $@"+ENDL+"\t"); //$NON-NLS-1$ //$NON-NLS-2$
+ buffer.append(cmd);
+ buffer.append(" -E -P -v -dD "); //$NON-NLS-1$
+ buffer.append(cmd.appliesToCFileType() ? "specs.c" : "specs.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
+ buffer.append(ENDL);
+ buffer.append("\t@echo end generating scanner info for $@"); //$NON-NLS-1$
+ buffer.append(DENDL);
+ }
+
+ File makefile = new File(fWorkingDirectory.toFile(), projectName+"_scd.mk"); //$NON-NLS-1$
+ try {
+ PrintStream ps = new PrintStream(new FileOutputStream(makefile));
+ ps.println(buffer.toString());
+ ps.close();
+ rc = true;
+ }
+ catch (FileNotFoundException e) {
+ MakeCorePlugin.log(e);
+ }
+ }
+ }
+
+ return rc;
+ }
+}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/GCCPerFileSCDProfilePage.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/GCCPerFileSCDProfilePage.java
index 20dc4548749..9b2bc09ceb6 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/GCCPerFileSCDProfilePage.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/GCCPerFileSCDProfilePage.java
@@ -52,6 +52,8 @@ public class GCCPerFileSCDProfilePage extends AbstractDiscoveryPage {
private static final String BO_PROVIDER_OPEN_FILE_DIALOG = PREFIX + ".boProvider.browse.openFileDialog"; //$NON-NLS-1$
private static final String BO_PROVIDER_LOAD_BUTTON = PREFIX + ".boProvider.load.button"; //$NON-NLS-1$
+ private static final String providerId = "makefileGenerator"; //$NON-NLS-1$
+
private Button bopEnabledButton;
private Text bopOpenFileText;
private Button bopLoadButton;
@@ -265,6 +267,7 @@ public class GCCPerFileSCDProfilePage extends AbstractDiscoveryPage {
buildInfo.setBuildOutputFileActionEnabled(true);
buildInfo.setBuildOutputFilePath(getBopOpenFileText());
buildInfo.setBuildOutputParserEnabled(bopEnabledButton.getSelection());
+ buildInfo.setProviderOutputParserEnabled(providerId, bopEnabledButton.getSelection());
}
}