[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Scanner config discovery - fix for PR 59971
|
This is a fix for:
PR 59971 - [Scanner Config] Cannot change default scanner info command,
No PR - improvement in transformation of relative to absolute paths
Also a change in IScannerInfoCollector interface to allow console parsers
to contribute arbitrary information (like compiler version info, imacros,
target specific options, ...) to the collector.
Thanks,
Vmir
Index: plugin.xml
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/plugin.xml,v
retrieving revision 1.15
diff -u -r1.15 plugin.xml
--- plugin.xml 15 Apr 2004 19:02:00 -0000 1.15
+++ plugin.xml 7 May 2004 19:52:13 -0000
@@ -119,7 +119,7 @@
</parameter>
<parameter
name="defaultAttributes"
- value="-c -v">
+ value="-E -v ${plugin_state_location}/${specs_file}">
</parameter>
</run>
</externalScannerInfoProvider>
Index: src/org/eclipse/cdt/make/core/MakeCorePlugin.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java,v
retrieving revision 1.18
diff -u -r1.18 MakeCorePlugin.java
--- src/org/eclipse/cdt/make/core/MakeCorePlugin.java 5 May 2004 02:46:50 -0000 1.18
+++ src/org/eclipse/cdt/make/core/MakeCorePlugin.java 7 May 2004 19:52:14 -0000
@@ -128,7 +128,7 @@
scInfo.setESIProviderCommandEnabled(true);
scInfo.setUseDefaultESIProviderCmd(true);
scInfo.setESIProviderCommand(new Path("gcc")); //$NON-NLS-1$
- scInfo.setESIProviderArguments("-c -v"); //$NON-NLS-1$
+ scInfo.setESIProviderArguments("-E -v ${plugin_state_location}/${specs_file}"); //$NON-NLS-1$
scInfo.setESIProviderConsoleParserId(GCC_SPECS_CONSOLE_PARSER_ID);
scInfo.setMakeBuilderConsoleParserId(GCC_SCANNER_INFO_CONSOLE_PARSER_ID);
} catch (CoreException e) {
Index: src/org/eclipse/cdt/make/core/scannerconfig/IScannerInfoCollector.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IScannerInfoCollector.java,v
retrieving revision 1.1
diff -u -r1.1 IScannerInfoCollector.java
--- src/org/eclipse/cdt/make/core/scannerconfig/IScannerInfoCollector.java 5 May 2004 18:29:42 -0000 1.1
+++ src/org/eclipse/cdt/make/core/scannerconfig/IScannerInfoCollector.java 7 May 2004 19:52:14 -0000
@@ -11,6 +11,7 @@
package org.eclipse.cdt.make.core.scannerconfig;
import java.util.List;
+import java.util.Map;
import org.eclipse.core.resources.IResource;
@@ -21,16 +22,22 @@
* @author vhirsl
*/
public interface IScannerInfoCollector {
+ // for a list of target specific options i.e. -pthread, -ansi, -no_
+ public static Integer TARGET_SPECIFIC_OPTION = new Integer(1) ;
+ public static Integer IMACROS = new Integer(2);
+ public static Integer COMPILER_VERSION_INFO = new Integer(3);
+
/**
* Contribute to resource's scanner configuration
*
* @param resource
* @param includes
* @param symbols
- * @param targetSpecificOptions
+ * @param extraInfo - a map of key - list pairs, where key is the type of extra info
+ * i.e. target specific options or imacros commands,...
*/
public void contributeToScannerConfig(IResource resource,
List includes,
List symbols,
- List targetSpecificOptions);
+ Map extraInfo);
}
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java,v
retrieving revision 1.6
diff -u -r1.6 DefaultExternalScannerInfoProvider.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java 5 May 2004 18:29:42 -0000 1.6
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java 7 May 2004 19:52:14 -0000
@@ -16,7 +16,6 @@
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
-import java.util.StringTokenizer;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin;
@@ -32,6 +31,7 @@
import org.eclipse.cdt.make.internal.core.MakeMessages;
import org.eclipse.cdt.make.internal.core.StreamMonitor;
import org.eclipse.cdt.make.internal.core.scannerconfig.gnu.GCCScannerConfigUtil;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@@ -54,7 +54,7 @@
private IPath fWorkingDirectory;
private IPath fCompileCommand;
- private String fCompileArguments;
+ private String[] fCompileArguments;
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider#invokeProvider(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.resources.IProject, org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo, java.util.List, org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector)
@@ -144,32 +144,31 @@
private boolean initialize(IProject currentProject, IScannerConfigBuilderInfo buildInfo, List targetSpecificOptions) {
boolean rc = false;
- if (buildInfo.isDefaultESIProviderCmd()) {
- fWorkingDirectory = MakeCorePlugin.getWorkingDirectory();
- String targetFile = "dummy"; //$NON-NLS-1$
- try {
- if (currentProject.hasNature(CCProjectNature.CC_NATURE_ID)) {
- targetFile = GCCScannerConfigUtil.CPP_SPECS_FILE;
- }
- else if (currentProject.hasNature(CProjectNature.C_NATURE_ID)) {
- targetFile = GCCScannerConfigUtil.C_SPECS_FILE;
- }
- } catch (CoreException e) {
- //TODO VMIR better error handling
- MakeCorePlugin.log(e.getStatus());
- }
- IPath path2File = fWorkingDirectory.append(targetFile);
- if (!path2File.toFile().exists()) {
- GCCScannerConfigUtil.createSpecs();
+ fWorkingDirectory = currentProject.getLocation();
+ String targetFile = "dummy"; //$NON-NLS-1$
+ try {
+ if (currentProject.hasNature(CCProjectNature.CC_NATURE_ID)) {
+ targetFile = GCCScannerConfigUtil.CPP_SPECS_FILE;
}
- targetSpecificOptions.add(targetFile);
- }
- else {
- fWorkingDirectory = currentProject.getLocation();
+ else if (currentProject.hasNature(CProjectNature.C_NATURE_ID)) {
+ targetFile = GCCScannerConfigUtil.C_SPECS_FILE;
+ }
+ } catch (CoreException e) {
+ //TODO VMIR better error handling
+ MakeCorePlugin.log(e.getStatus());
+ }
+ IPath path2File = fWorkingDirectory.append(targetFile);
+ if (!path2File.toFile().exists()) {
+ GCCScannerConfigUtil.createSpecs();
}
fCompileCommand = buildInfo.getESIProviderCommand();
if (fCompileCommand != null) {
- fCompileArguments = buildInfo.getESIProviderArguments();
+ fCompileArguments = ScannerConfigUtil.tokenizeStringWithQuotes(buildInfo.getESIProviderArguments());
+ for (int i = 0; i < fCompileArguments.length; ++i) {
+ fCompileArguments[i] = fCompileArguments[i].replaceAll("\\$\\{plugin_state_location\\}", //$NON-NLS-1$
+ MakeCorePlugin.getWorkingDirectory().toString());
+ fCompileArguments[i] = fCompileArguments[i].replaceAll("\\$\\{specs_file\\}", targetFile); //$NON-NLS-1$
+ }
rc = true;
}
return rc;
@@ -183,17 +182,12 @@
String[] rv = null;
// commandArguments may have multiple arguments; tokenizing
int nTokens = 0;
- if (fCompileArguments != null && fCompileArguments.length() > 0) {
- StringTokenizer tokenizer = new StringTokenizer(fCompileArguments, " ");//$NON-NLS-1$
- nTokens = tokenizer.countTokens();
- if (nTokens > 0) {
- rv = new String[nTokens + tso.size()];
- for (int i = 0; tokenizer.hasMoreTokens(); ++i) {
- rv[i] = tokenizer.nextToken();
- }
- }
+ if (fCompileArguments != null && fCompileArguments.length > 0) {
+ nTokens = fCompileArguments.length;
+ rv = new String[nTokens + tso.size()];
+ System.arraycopy(fCompileArguments, 0, rv, 0, nTokens);
}
- if (rv == null) {
+ else {
rv = new String[tso.size()];
}
for (int i = 0; i < tso.size(); ++i) {
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigInfoFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigInfoFactory.java,v
retrieving revision 1.2
diff -u -r1.2 ScannerConfigInfoFactory.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigInfoFactory.java 5 May 2004 02:46:50 -0000 1.2
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerConfigInfoFactory.java 7 May 2004 19:52:14 -0000
@@ -166,7 +166,7 @@
if (isDefaultESIProviderCmd()) {
String attributes = getESIProviderParameter("defaultAttributes"); //$NON-NLS-1$
if (attributes == null) {
- attributes = "-c -v"; //$NON-NLS-1$
+ attributes = "-E -v ${plugin_state_location}/{specs_file}"; //$NON-NLS-1$
}
return attributes;
}
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java,v
retrieving revision 1.8
diff -u -r1.8 ScannerInfoCollector.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java 7 May 2004 13:02:09 -0000 1.8
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java 7 May 2004 19:52:14 -0000
@@ -80,9 +80,9 @@
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector#contributeToScannerConfig(org.eclipse.core.resources.IResource, java.util.List, java.util.List, java.util.List)
+ * @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector#contributeToScannerConfig(org.eclipse.core.resources.IResource, java.util.List, java.util.List, java.util.Map)
*/
- public synchronized void contributeToScannerConfig(IResource resource, List includes, List symbols, List targetSpecificOptions) {
+ public void contributeToScannerConfig(IResource resource, List includes, List symbols, Map extraInfo) {
IProject project;
if (resource == null || (project = resource.getProject()) == null) {
TraceUtil.outputError("IScannerInfoCollector.contributeToScannerConfig : ", "resource or project is null"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -96,7 +96,10 @@
String projectName = project.getName();
contribute(projectName, discoveredIncludes, includes, true);
contribute(projectName, discoveredSymbols, symbols, false);
- contribute(projectName, discoveredTSO, targetSpecificOptions, false);
+ contribute(projectName,
+ discoveredTSO,
+ (extraInfo == null) ? null : (List) extraInfo.get(IScannerInfoCollector.TARGET_SPECIFIC_OPTION),
+ false);
}
}
catch (CoreException e) {
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java,v
retrieving revision 1.7
diff -u -r1.7 GCCScannerInfoConsoleParser.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java 7 May 2004 13:02:09 -0000 1.7
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java 7 May 2004 19:52:15 -0000
@@ -16,12 +16,15 @@
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
import org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
/**
* Parses gcc and g++ output for -I and -D parameters.
@@ -67,17 +70,7 @@
}
// Known patterns:
// (a) gcc|g++ ... -Dxxx -Iyyy ...
- ArrayList allTokens = new ArrayList();
- String[] tokens = line.split("\"");
- for (int i = 0; i < tokens.length; ++i) {
- if (i % 2 == 0) { // even tokens need further tokenization
- String[] sTokens = tokens[i].split("\\s");
- allTokens.addAll(Arrays.asList(sTokens));
- }
- else {
- allTokens.add(tokens[i]);
- }
- }
+ ArrayList allTokens = new ArrayList(Arrays.asList(ScannerConfigUtil.tokenizeStringWithQuotes(line)));
if (allTokens.size() <= 1)
return false;
Iterator I = allTokens.iterator();
@@ -181,7 +174,9 @@
}
// Contribute discovered includes and symbols to the ScannerInfoCollector
if (translatedIncludes.size() > 0 || symbols.size() > 0) {
- fCollector.contributeToScannerConfig(project, translatedIncludes, symbols, targetSpecificOptions);
+ Map extraInfo = new HashMap();
+ extraInfo.put(IScannerInfoCollector.TARGET_SPECIFIC_OPTION, targetSpecificOptions);
+ fCollector.contributeToScannerConfig(project, translatedIncludes, symbols, extraInfo);
TraceUtil.outputTrace("Discovered scanner info for file \'" + fileName + '\'', //$NON-NLS-1$
"Include paths", includes, translatedIncludes, "Defined symbols", symbols); //$NON-NLS-1$ //$NON-NLS-2$
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java,v
retrieving revision 1.4
diff -u -r1.4 ScannerConfigUtil.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java 30 Apr 2004 00:35:14 -0000 1.4
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java 7 May 2004 19:52:15 -0000
@@ -11,6 +11,7 @@
package org.eclipse.cdt.make.internal.core.scannerconfig.util;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -247,5 +248,26 @@
newSumPaths.put(key, sumPaths.get(key));
}
return newSumPaths;
+ }
+
+ /**
+ * Tokenizes string with quuotes
+ *
+ * @param String
+ * @return String[]
+ */
+ public static String[] tokenizeStringWithQuotes(String line) {
+ ArrayList allTokens = new ArrayList();
+ String[] tokens = line.split("\""); //$NON-NLS-1$
+ for (int i = 0; i < tokens.length; ++i) {
+ if (i % 2 == 0) { // even tokens need further tokenization
+ String[] sTokens = tokens[i].split("\\s"); //$NON-NLS-1$
+ allTokens.addAll(Arrays.asList(sTokens));
+ }
+ else {
+ allTokens.add(tokens[i]);
+ }
+ }
+ return (String[]) allTokens.toArray(new String[allTokens.size()]);
}
}
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java,v
retrieving revision 1.4
diff -u -r1.4 ScannerInfoConsoleParserUtility.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java 5 May 2004 18:29:42 -0000 1.4
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java 7 May 2004 19:52:15 -0000
@@ -323,51 +323,46 @@
String include = (String) i.next();
IPath includePath = new Path(include);
if (!includePath.isAbsolute()) {
- // check if it is a relative path
- if (include.startsWith("..") || include.startsWith(".")) { //$NON-NLS-1$ //$NON-NLS-2$
- // First try the current working directory
- IPath cwd = getWorkingDirectory();
- if (!cwd.isAbsolute()) {
- cwd = fProject.getLocation().append(cwd);
+ // First try the current working directory
+ IPath cwd = getWorkingDirectory();
+ if (!cwd.isAbsolute()) {
+ cwd = fProject.getLocation().append(cwd);
+ }
+ // check if the cwd is the right one
+ // appending fileName to cwd should yield file path
+ IPath filePath = cwd.append(fileName);
+ if (!filePath.toString().equalsIgnoreCase(file.getLocation().toString())) {
+ // must be the cwd is wrong
+ // check if file name starts with ".."
+ if (fileName.startsWith("..")) { //$NON-NLS-1$
+ // probably multiple choices for cwd, hopeless
+ TraceUtil.outputError("Unable to determine working directory for ", fileName); //$NON-NLS-1$
+ generateMarker(file, -1, "Unable to determine working directory for", //$NON-NLS-1$
+ IMarkerGenerator.SEVERITY_WARNING, fileName);
+ break;
}
- // check if the cwd is the right one
- // appending fileName to cwd should yield file path
- IPath filePath = cwd.append(fileName);
- if (!filePath.toString().equalsIgnoreCase(file.getLocation().toString())) {
- // must be the cwd is wrong
- // check if file name starts with ".."
- if (fileName.startsWith("..")) { //$NON-NLS-1$
- // probably multiple choices for cwd, hopeless
- TraceUtil.outputError("Unable to determine working directory for ", fileName); //$NON-NLS-1$
- generateMarker(file, -1, "Unable to determine working directory for", //$NON-NLS-1$
- IMarkerGenerator.SEVERITY_WARNING, fileName);
- break;
+ else {
+ // remove common segments at the end
+ IPath tPath = new Path(fileName);
+ if (fileName.startsWith(".")) { //$NON-NLS-1$
+ tPath = tPath.removeFirstSegments(1);
}
- else {
- // remove common segments at the end
- IPath tPath = new Path(fileName);
- if (fileName.startsWith(".")) { //$NON-NLS-1$
- tPath = tPath.removeFirstSegments(1);
- }
- // get the file path from the file
- filePath = file.getLocation();
- IPath lastFileSegment = filePath.removeFirstSegments(filePath.segmentCount() - tPath.segmentCount());
- if (lastFileSegment.matchingFirstSegments(tPath) == tPath.segmentCount()) {
- cwd = filePath.removeLastSegments(tPath.segmentCount());
- }
+ // get the file path from the file
+ filePath = file.getLocation();
+ IPath lastFileSegment = filePath.removeFirstSegments(filePath.segmentCount() - tPath.segmentCount());
+ if (lastFileSegment.matchingFirstSegments(tPath) == tPath.segmentCount()) {
+ cwd = filePath.removeLastSegments(tPath.segmentCount());
}
}
-
- IPath candidatePath = cwd.append(includePath);
- File dir = candidatePath.toFile();
- if (dir.exists()) {
- translatedIncludes.add(candidatePath.toString());
- continue;
- }
- else {
- generateMarker(file, -1, "Nonexistent include path: "+include,
- IMarkerGenerator.SEVERITY_WARNING, fileName);
- }
+ }
+
+ IPath candidatePath = cwd.append(includePath);
+ File dir = candidatePath.toFile();
+ include = candidatePath.toString();
+ if (!dir.exists()) {
+ TraceUtil.outputError("Nonexistent include path: ", include); //$NON-NLS-1$
+ generateMarker(file, -1, "Nonexistent include path: "+include, //$NON-NLS-1$
+ IMarkerGenerator.SEVERITY_WARNING, fileName);
}
}
// TODO VMIR for now add unresolved paths as well