mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-15 12:15:47 +02:00
applied patch from vhirsl@ca.ibm.com implementing new auto scanner configuration detection mechanism
This commit is contained in:
parent
35ebf046cf
commit
7d48a4fcc6
32 changed files with 3724 additions and 7 deletions
|
@ -3,4 +3,13 @@ providerName=Eclipse.org
|
||||||
|
|
||||||
extensionTargetBuilder.name=Target Builder Extension
|
extensionTargetBuilder.name=Target Builder Extension
|
||||||
natureMake.name=CDT Make Nature
|
natureMake.name=CDT Make Nature
|
||||||
builderMake.name=CDT Makefile Builder
|
builderMake.name=CDT Makefile Builder
|
||||||
|
|
||||||
|
epScannerConfigNature.name=Scanner Configuration Nature
|
||||||
|
epScannerConfigBuilder.name=Scanner Configuration Builder
|
||||||
|
extensionExternalScannerInfoProvider.name=C/C++ External Scanner Info Provider Extension
|
||||||
|
epDefaultExternalScannerInfoProvider.name=Default External Scanner Info Provider
|
||||||
|
|
||||||
|
extensionScannerInfoConsoleParser.name=C/C++ Scanner Info Console Parser Extension
|
||||||
|
epGCCCommandLineParser.name=GNU C/C++ Scanner Info Parser
|
||||||
|
epGCCSpecsParser.name=GNU C/C++ Compiler Specs Parser
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
|
|
||||||
<extension-point id="MakeTargetBuilder" name="%extensionTargetBuilder.name" schema="schema/MakeTargetBuilder.exsd"/>
|
<extension-point id="MakeTargetBuilder" name="%extensionTargetBuilder.name" schema="schema/MakeTargetBuilder.exsd"/>
|
||||||
|
<extension-point id="ExternalScannerInfoProvider" name="%extensionExternalScannerInfoProvider.name" schema="schema/ExternalScannerInfoProvider.exsd"/>
|
||||||
|
<extension-point id="ScannerInfoConsoleParser" name="%extensionScannerInfoConsoleParser.name" schema="schema/ScannerInfoConsoleParser.exsd"/>
|
||||||
|
|
||||||
<extension
|
<extension
|
||||||
id="MakeScannerProvider"
|
id="MakeScannerProvider"
|
||||||
|
@ -77,5 +79,68 @@
|
||||||
id="org.eclipse.cdt.make.MakeTargetBuilder">
|
id="org.eclipse.cdt.make.MakeTargetBuilder">
|
||||||
</builder>
|
</builder>
|
||||||
</extension>
|
</extension>
|
||||||
|
<extension
|
||||||
|
id="ScannerConfigNature"
|
||||||
|
name="%epScannerConfigNature.name"
|
||||||
|
point="org.eclipse.core.resources.natures">
|
||||||
|
<requires-nature
|
||||||
|
id="org.eclipse.cdt.make.core.makeNature">
|
||||||
|
</requires-nature>
|
||||||
|
<runtime>
|
||||||
|
<run
|
||||||
|
class="org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature">
|
||||||
|
</run>
|
||||||
|
</runtime>
|
||||||
|
<builder
|
||||||
|
id="org.eclipse.cdt.make.core.ScannerConfigBuilder">
|
||||||
|
</builder>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
id="ScannerConfigBuilder"
|
||||||
|
name="%epScannerConfigBuilder.name"
|
||||||
|
point="org.eclipse.core.resources.builders">
|
||||||
|
<builder
|
||||||
|
hasNature="true">
|
||||||
|
<run
|
||||||
|
class="org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder">
|
||||||
|
</run>
|
||||||
|
</builder>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
id="DefaultExternalScannerInfoProvider"
|
||||||
|
name="%epDefaultExternalScannerInfoProvider.name"
|
||||||
|
point="org.eclipse.cdt.make.core.ExternalScannerInfoProvider">
|
||||||
|
<externalScannerInfoProvider>
|
||||||
|
<run
|
||||||
|
class="org.eclipse.cdt.make.internal.core.scannerconfig.DefaultExternalScannerInfoProvider">
|
||||||
|
<parameter
|
||||||
|
name="defaultCommand"
|
||||||
|
value="gcc">
|
||||||
|
</parameter>
|
||||||
|
<parameter
|
||||||
|
name="defaultAttributes"
|
||||||
|
value="-c -v">
|
||||||
|
</parameter>
|
||||||
|
</run>
|
||||||
|
</externalScannerInfoProvider>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
id="GCCScannerInfoConsoleParser"
|
||||||
|
name="%epGCCCommandLineParser.name"
|
||||||
|
point="org.eclipse.cdt.make.core.ScannerInfoConsoleParser">
|
||||||
|
<scannerInfoConsoleParser
|
||||||
|
commandId="makeBuilder"
|
||||||
|
class="org.eclipse.cdt.make.internal.core.scannerconfig.gnu.GCCScannerInfoConsoleParser">
|
||||||
|
</scannerInfoConsoleParser>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
id="GCCSpecsConsoleParser"
|
||||||
|
name="%epGCCSpecsParser.name"
|
||||||
|
point="org.eclipse.cdt.make.core.ScannerInfoConsoleParser">
|
||||||
|
<scannerInfoConsoleParser
|
||||||
|
commandId="externalScannerInfoProvider"
|
||||||
|
class="org.eclipse.cdt.make.internal.core.scannerconfig.gnu.GCCSpecsConsoleParser">
|
||||||
|
</scannerInfoConsoleParser>
|
||||||
|
</extension>
|
||||||
|
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Schema file written by PDE -->
|
||||||
|
<schema targetNamespace="org.eclipse.cdt.make.core">
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.schema plugin="org.eclipse.cdt.make.core" id="ExternalScannerInfoProvider" name="C/C++ Scanner Info Provider"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
This extension point is used to plug in particular compiler scanner info provider.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<element name="extension">
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="externalScannerInfoProvider" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="point" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="id" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="name" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="externalScannerInfoProvider">
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="run"/>
|
||||||
|
</sequence>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="run">
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="class" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
A fully qualified name of the Java class that implements <samp>org.eclipse.cdt.make.core.scannerconfig.ICompilerScannerInfoProvider</samp> interface.
|
||||||
|
</documentation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.attribute kind="java" basedOn="org.eclipse.cdt.make.core.scannerconfig.ISpecsBuilder"/>
|
||||||
|
</appInfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="parameter">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
Parameters passed to the compiler scanner info provider.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
<complexType>
|
||||||
|
<attribute name="name" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
Name of a parameter.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="value" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
Value of a parameter.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="since"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter the first release in which this extension point appears.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="examples"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter extension point usage example here.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="apiInfo"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
Plug-ins that want to extend this extension point must implement <samp>org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider</samp> interface.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="implementation"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
org.eclipse.cdt.make.core plugin provides default implementation of the GNU C/C++ compiler specs scanner info provider.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="copyright"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
</schema>
|
|
@ -0,0 +1,119 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Schema file written by PDE -->
|
||||||
|
<schema targetNamespace="org.eclipse.cdt.make.core">
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.schema plugin="org.eclipse.cdt.make.core" id="ScannerInfoConsoleParser" name="%extensionScannerInfoConsoleParser.name"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter description of this extension point.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<element name="extension">
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="scannerInfoConsoleParser"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="point" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="id" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="name" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="scannerInfoConsoleParser">
|
||||||
|
<complexType>
|
||||||
|
<attribute name="commandId" use="default" value="all">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
Id of the command the console parser is associated with. Can be 'all', 'makeBuilder' or 'externalScannerInfoProvider'.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
<simpleType>
|
||||||
|
<restriction base="string">
|
||||||
|
<enumeration value="all">
|
||||||
|
</enumeration>
|
||||||
|
<enumeration value="makeBuilder">
|
||||||
|
</enumeration>
|
||||||
|
<enumeration value="externalScannerInfoProvider">
|
||||||
|
</enumeration>
|
||||||
|
</restriction>
|
||||||
|
</simpleType>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="class" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
Java class that implements IScannerInfoConsoleParser interface.
|
||||||
|
</documentation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.attribute kind="java" basedOn="org.eclipse.cdt.make.core.IScannerInfoConsoleParser"/>
|
||||||
|
</appInfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="since"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter the first release in which this extension point appears.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="examples"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter extension point usage example here.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="apiInfo"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter API information here.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="implementation"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter information about supplied implementation of this extension point.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.section type="copyright"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
</schema>
|
|
@ -24,6 +24,7 @@ import org.eclipse.cdt.core.model.ICModelMarker;
|
||||||
import org.eclipse.cdt.core.resources.ACBuilder;
|
import org.eclipse.cdt.core.resources.ACBuilder;
|
||||||
import org.eclipse.cdt.core.resources.IConsole;
|
import org.eclipse.cdt.core.resources.IConsole;
|
||||||
import org.eclipse.cdt.make.internal.core.StreamMonitor;
|
import org.eclipse.cdt.make.internal.core.StreamMonitor;
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoConsoleParserFactory;
|
||||||
import org.eclipse.core.resources.IContainer;
|
import org.eclipse.core.resources.IContainer;
|
||||||
import org.eclipse.core.resources.IMarker;
|
import org.eclipse.core.resources.IMarker;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
@ -179,6 +180,9 @@ public class MakeBuilder extends ACBuilder {
|
||||||
epm.setOutputStream(streamMon);
|
epm.setOutputStream(streamMon);
|
||||||
OutputStream stdout = epm.getOutputStream();
|
OutputStream stdout = epm.getOutputStream();
|
||||||
OutputStream stderr = epm.getOutputStream();
|
OutputStream stderr = epm.getOutputStream();
|
||||||
|
// Sniff console output for scanner info
|
||||||
|
OutputStream sniffer = ScannerInfoConsoleParserFactory.getMakeBuilderOutputSniffer(
|
||||||
|
epm.getOutputStream(), getProject(), workingDirectory, this);
|
||||||
Process p = launcher.execute(buildCommand, buildArguments, env, workingDirectory);
|
Process p = launcher.execute(buildCommand, buildArguments, env, workingDirectory);
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -189,7 +193,7 @@ public class MakeBuilder extends ACBuilder {
|
||||||
}
|
}
|
||||||
// Before launching give visual cues via the monitor
|
// Before launching give visual cues via the monitor
|
||||||
monitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Invoking_Command") + launcher.getCommandLine()); //$NON-NLS-1$
|
monitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Invoking_Command") + launcher.getCommandLine()); //$NON-NLS-1$
|
||||||
if (launcher.waitAndRead(stdout, stderr, new SubProgressMonitor(monitor, 0))
|
if (launcher.waitAndRead(sniffer, sniffer, new SubProgressMonitor(monitor, 0))
|
||||||
!= CommandLauncher.OK)
|
!= CommandLauncher.OK)
|
||||||
errMsg = launcher.getErrorMessage();
|
errMsg = launcher.getErrorMessage();
|
||||||
monitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Updating_project")); //$NON-NLS-1$
|
monitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Updating_project")); //$NON-NLS-1$
|
||||||
|
@ -225,6 +229,7 @@ public class MakeBuilder extends ACBuilder {
|
||||||
stderr.close();
|
stderr.close();
|
||||||
|
|
||||||
monitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Creating_Markers")); //$NON-NLS-1$
|
monitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Creating_Markers")); //$NON-NLS-1$
|
||||||
|
sniffer.close();
|
||||||
epm.reportProblems();
|
epm.reportProblems();
|
||||||
cos.close();
|
cos.close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Copyright (c) 2002,2003 QNX Software Systems and others.
|
* Copyright (c) 2002,2004 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v1.0
|
* are made available under the terms of the Common Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -13,19 +13,30 @@ package org.eclipse.cdt.make.core;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.MissingResourceException;
|
import java.util.MissingResourceException;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.make.core.makefile.IMakefile;
|
import org.eclipse.cdt.make.core.makefile.IMakefile;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
|
||||||
import org.eclipse.cdt.make.internal.core.BuildInfoFactory;
|
import org.eclipse.cdt.make.internal.core.BuildInfoFactory;
|
||||||
import org.eclipse.cdt.make.internal.core.MakeTargetManager;
|
import org.eclipse.cdt.make.internal.core.MakeTargetManager;
|
||||||
import org.eclipse.cdt.make.internal.core.makefile.gnu.GNUMakefile;
|
import org.eclipse.cdt.make.internal.core.makefile.gnu.GNUMakefile;
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigInfoFactory;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
import org.eclipse.core.runtime.IExtension;
|
||||||
|
import org.eclipse.core.runtime.IExtensionPoint;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IPluginDescriptor;
|
import org.eclipse.core.runtime.IPluginDescriptor;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
@ -40,6 +51,13 @@ public class MakeCorePlugin extends Plugin {
|
||||||
public static final String MAKE_PROJECT_ID = MakeCorePlugin.getUniqueIdentifier() + ".make"; //$NON-NLS-1$
|
public static final String MAKE_PROJECT_ID = MakeCorePlugin.getUniqueIdentifier() + ".make"; //$NON-NLS-1$
|
||||||
private MakeTargetManager fTargetManager;
|
private MakeTargetManager fTargetManager;
|
||||||
public static final String OLD_BUILDER_ID = "org.eclipse.cdt.core.cbuilder"; //$NON-NLS-1$
|
public static final String OLD_BUILDER_ID = "org.eclipse.cdt.core.cbuilder"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String EXTERNAL_SI_PROVIDER_SIMPLE_ID = "ExternalScannerInfoProvider"; //$NON-NLS-1$
|
||||||
|
public static final String SI_CONSOLE_PARSER_SIMPLE_ID = "ScannerInfoConsoleParser"; //$NON-NLS-1$
|
||||||
|
public static final String DEFAULT_EXTERNAL_SI_PROVIDER_ID = MakeCorePlugin.getUniqueIdentifier() + ".DefaultExternalScannerInfoProvider"; //$NON-NLS-1$
|
||||||
|
public static final String GCC_SPECS_CONSOLE_PARSER_ID = MakeCorePlugin.getUniqueIdentifier() + ".GCCSpecsConsoleParser"; //$NON-NLS-1$
|
||||||
|
public static final String GCC_SCANNER_INFO_CONSOLE_PARSER_ID = MakeCorePlugin.getUniqueIdentifier() + ".GCCScannerInfoConsoleParser"; //$NON-NLS-1$
|
||||||
|
|
||||||
//The shared instance.
|
//The shared instance.
|
||||||
private static MakeCorePlugin plugin;
|
private static MakeCorePlugin plugin;
|
||||||
//Resource bundle.
|
//Resource bundle.
|
||||||
|
@ -131,6 +149,20 @@ public class MakeCorePlugin extends Plugin {
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
}
|
}
|
||||||
getPluginPreferences().setDefault(CCorePlugin.PREF_BINARY_PARSER, CCorePlugin.PLUGIN_ID + ".ELF"); //$NON-NLS-1$
|
getPluginPreferences().setDefault(CCorePlugin.PREF_BINARY_PARSER, CCorePlugin.PLUGIN_ID + ".ELF"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
// default plugin preferences for scanner configuration discovery
|
||||||
|
IScannerConfigBuilderInfo scInfo = createScannerConfigBuildInfo(getPluginPreferences(), ScannerConfigBuilder.BUILDER_ID, true);
|
||||||
|
try {
|
||||||
|
scInfo.setAutoDiscoveryEnabled(false);
|
||||||
|
scInfo.setMakeBuilderConsoleParserEnabled(true);
|
||||||
|
scInfo.setESIProviderCommandEnabled(true);
|
||||||
|
scInfo.setUseDefaultESIProviderCmd(true);
|
||||||
|
scInfo.setESIProviderCommand(new Path("gcc")); //$NON-NLS-1$
|
||||||
|
scInfo.setESIProviderArguments("-c -v"); //$NON-NLS-1$
|
||||||
|
scInfo.setESIProviderConsoleParserId(GCC_SPECS_CONSOLE_PARSER_ID);
|
||||||
|
scInfo.setMakeBuilderConsoleParserId(GCC_SCANNER_INFO_CONSOLE_PARSER_ID);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMakeBuilderInfo createBuildInfo(Preferences prefs, String builderID, boolean useDefaults) {
|
public static IMakeBuilderInfo createBuildInfo(Preferences prefs, String builderID, boolean useDefaults) {
|
||||||
|
@ -179,4 +211,109 @@ public class MakeCorePlugin extends Plugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Following methods create IScannerConfigBuilderInfo
|
||||||
|
* Delegating requests to ScannerConfigInfoFactory
|
||||||
|
*/
|
||||||
|
public static IScannerConfigBuilderInfo createScannerConfigBuildInfo(
|
||||||
|
Preferences prefs, String builderID, boolean useDefaults) {
|
||||||
|
return ScannerConfigInfoFactory.create(prefs, builderID, useDefaults);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IScannerConfigBuilderInfo createScannerConfigBuildInfo(
|
||||||
|
IProject project, String builderID) throws CoreException {
|
||||||
|
return ScannerConfigInfoFactory.create(project, builderID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IScannerConfigBuilderInfo createScannerConfigBuildInfo(
|
||||||
|
Map args, String builderID) {
|
||||||
|
return ScannerConfigInfoFactory.create(args, builderID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IPath getWorkingDirectory() {
|
||||||
|
return MakeCorePlugin.getDefault().getStateLocation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param id - id specifying external scanner info provider
|
||||||
|
* @return provider - new instance of an external scanner info provider
|
||||||
|
*/
|
||||||
|
public IExternalScannerInfoProvider getExternalScannerInfoProvider(String id) {
|
||||||
|
try {
|
||||||
|
IExtensionPoint extension = getDescriptor().getExtensionPoint(EXTERNAL_SI_PROVIDER_SIMPLE_ID);
|
||||||
|
if (extension != null) {
|
||||||
|
IExtension[] extensions = extension.getExtensions();
|
||||||
|
for (int i = 0; i < extensions.length; i++) {
|
||||||
|
String tool = extensions[i].getUniqueIdentifier();
|
||||||
|
if (tool != null && tool.equals(id)) {
|
||||||
|
IConfigurationElement[] configElements = extensions[i].getConfigurationElements();
|
||||||
|
for (int j = 0; j < configElements.length; j++) {
|
||||||
|
IConfigurationElement[] runElement = configElements[j].getChildren("run"); //$NON-NLS-1$
|
||||||
|
if (runElement.length > 0) {
|
||||||
|
IExternalScannerInfoProvider builder = (IExternalScannerInfoProvider) runElement[0].createExecutableExtension("class");
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
log(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param commandId
|
||||||
|
* @return String[] - array of parserIds associated with the commandId or 'all'
|
||||||
|
*/
|
||||||
|
public String[] getScannerInfoConsoleParserIds(String commandId) {
|
||||||
|
String[] empty = new String[0];
|
||||||
|
if (commandId == null || commandId.length() == 0) {
|
||||||
|
commandId = "all"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
IExtensionPoint extension = getDescriptor().getExtensionPoint(SI_CONSOLE_PARSER_SIMPLE_ID);
|
||||||
|
if (extension != null) {
|
||||||
|
IExtension[] extensions = extension.getExtensions();
|
||||||
|
List parserIds = new ArrayList(extensions.length);
|
||||||
|
for (int i = 0; i < extensions.length; i++) {
|
||||||
|
String parserId = extensions[i].getUniqueIdentifier();
|
||||||
|
if (parserId != null) {
|
||||||
|
IConfigurationElement[] configElements = extensions[i].getConfigurationElements();
|
||||||
|
String id = configElements[0].getAttribute("commandId");//$NON-NLS-1$
|
||||||
|
if (id != null && (id.equals(commandId) || id.equals("all"))) { //$NON-NLS-1$
|
||||||
|
parserIds.add(parserId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (String[])parserIds.toArray(empty);
|
||||||
|
}
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param parserId
|
||||||
|
* @return parser - parser object identified by the parserId
|
||||||
|
*/
|
||||||
|
public IScannerInfoConsoleParser getScannerInfoConsoleParser(String parserId) {
|
||||||
|
try {
|
||||||
|
IExtensionPoint extension = getDescriptor().getExtensionPoint(SI_CONSOLE_PARSER_SIMPLE_ID);
|
||||||
|
if (extension != null) {
|
||||||
|
IExtension[] extensions = extension.getExtensions();
|
||||||
|
for (int i = 0; i < extensions.length; i++) {
|
||||||
|
String id = extensions[i].getUniqueIdentifier();
|
||||||
|
if (id != null && id.equals(parserId)) {
|
||||||
|
IConfigurationElement[] configElements = extensions[i].getConfigurationElements();
|
||||||
|
IScannerInfoConsoleParser parser = (IScannerInfoConsoleParser)configElements[0].createExecutableExtension("class");//$NON-NLS-1$
|
||||||
|
return parser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
log(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,4 +13,17 @@ MakeTargetManager.target_exists=Target exists
|
||||||
MakeTargetManager.failed_initializing_targets=Failed initializing build targets
|
MakeTargetManager.failed_initializing_targets=Failed initializing build targets
|
||||||
MakeTargetManager.error_writing_file=Error writing target file
|
MakeTargetManager.error_writing_file=Error writing target file
|
||||||
|
|
||||||
ProjectTargets.error_reading_project_targets=Error reading project targets.
|
ProjectTargets.error_reading_project_targets=Error reading project targets.
|
||||||
|
|
||||||
|
ScannerConfigBuilder.Invoking_Builder=Invoking scanner config builder on project
|
||||||
|
|
||||||
|
ExternalScannerInfoProvider.Provider_Error=Error launching compiler scanner info generator ({0})
|
||||||
|
ExternalScannerInfoProvider.Reading_Specs=Reading specs ...
|
||||||
|
ExternalScannerInfoProvider.Invoking_Command=Invoking Command:
|
||||||
|
ExternalScannerInfoProvider.Parsing_Output=Parsing output ...
|
||||||
|
ExternalScannerInfoProvider.Creating_Markers=Generating markers ...
|
||||||
|
|
||||||
|
ScannerInfoCollector.Processing=Processing discovered scanner configuration ...
|
||||||
|
ScannerInfoCollector.Updating=Updating Scanner Configuration for project
|
||||||
|
|
||||||
|
GCCScannerConfigUtil.Error_Message=Error creating specs file
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.core.scannerconfig;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for providers of C/C++ scanner info
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public interface IExternalScannerInfoProvider {
|
||||||
|
/**
|
||||||
|
* Invokes a C/C++ compiler with target specific options to generate
|
||||||
|
* compiler scanner info.
|
||||||
|
*
|
||||||
|
* @param monitor
|
||||||
|
* @param current project - current project being built
|
||||||
|
* @param buildInfo - settings for ScannerConfigBuilder
|
||||||
|
* @param targetSpecificOptions - array of options affecting compiler specs
|
||||||
|
*/
|
||||||
|
public boolean invokeProvider(IProgressMonitor monitor,
|
||||||
|
IProject currentProject,
|
||||||
|
IScannerConfigBuilderInfo buildInfo,
|
||||||
|
String[] targetSpecificOptions);
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.make.core.scannerconfig;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Settings for ScannerConfigBuilder
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public interface IScannerConfigBuilderInfo {
|
||||||
|
boolean isAutoDiscoveryEnabled();
|
||||||
|
void setAutoDiscoveryEnabled(boolean enabled) throws CoreException;
|
||||||
|
|
||||||
|
String getMakeBuilderConsoleParserId();
|
||||||
|
void setMakeBuilderConsoleParserId(String parserId) throws CoreException;
|
||||||
|
|
||||||
|
boolean isESIProviderCommandEnabled();
|
||||||
|
void setESIProviderCommandEnabled(boolean enabled) throws CoreException;
|
||||||
|
|
||||||
|
boolean isDefaultESIProviderCmd();
|
||||||
|
void setUseDefaultESIProviderCmd(boolean on) throws CoreException;
|
||||||
|
|
||||||
|
IPath getESIProviderCommand();
|
||||||
|
void setESIProviderCommand(IPath command) throws CoreException;
|
||||||
|
|
||||||
|
String getESIProviderArguments();
|
||||||
|
void setESIProviderArguments(String args) throws CoreException;
|
||||||
|
|
||||||
|
String getESIProviderConsoleParserId();
|
||||||
|
void setESIProviderConsoleParserId(String parserId) throws CoreException;
|
||||||
|
|
||||||
|
boolean isMakeBuilderConsoleParserEnabled();
|
||||||
|
void setMakeBuilderConsoleParserEnabled(boolean enabled) throws CoreException;
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.core.scannerconfig;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a line of command output looking for scanner info entries.
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public interface IScannerInfoConsoleParser {
|
||||||
|
/**
|
||||||
|
* Optional one time initialization of a console parser.
|
||||||
|
*
|
||||||
|
* @param project
|
||||||
|
*/
|
||||||
|
public void startup(IProject project, IScannerInfoConsoleParserUtility util);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse one line of output.
|
||||||
|
* @param line
|
||||||
|
* @return true if scanner info entry was found in the line
|
||||||
|
*/
|
||||||
|
public boolean processLine(String line);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional finalization of a console parser.
|
||||||
|
*/
|
||||||
|
public void shutdown();
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.core.scannerconfig;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.resources.ACBuilder;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.*;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs after standard make builder.
|
||||||
|
* Consolidates discovered scanner configuration and updates project's scanner configuration.
|
||||||
|
*
|
||||||
|
* @see IncrementalProjectBuilder
|
||||||
|
*/
|
||||||
|
public class ScannerConfigBuilder extends ACBuilder {
|
||||||
|
public final static String BUILDER_ID = MakeCorePlugin.getUniqueIdentifier() + ".ScannerConfigBuilder"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public ScannerConfigBuilder() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IncrementalProjectBuilder#build
|
||||||
|
*/
|
||||||
|
protected IProject [] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
|
||||||
|
monitor.beginTask("", 100); //$NON-NLS-1$
|
||||||
|
monitor.subTask(MakeCorePlugin.getResourceString("ScannerConfigBuilder.Invoking_Builder") + //$NON-NLS-1$
|
||||||
|
getProject().getName());
|
||||||
|
ScannerInfoCollector.getInstance().updateScannerConfiguration(getProject(), new SubProgressMonitor(monitor, 100));
|
||||||
|
return getProject().getReferencedProjects();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,128 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.core.scannerconfig;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.resources.ICommand;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IProjectDescription;
|
||||||
|
import org.eclipse.core.resources.IProjectNature;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IProjectNature
|
||||||
|
*/
|
||||||
|
public class ScannerConfigNature implements IProjectNature {
|
||||||
|
|
||||||
|
public final static String NATURE_ID = MakeCorePlugin.getUniqueIdentifier() + ".ScannerConfigNature"; //$NON-NLS-1$
|
||||||
|
private IProject fProject;
|
||||||
|
|
||||||
|
public ScannerConfigNature() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IProjectNature#configure
|
||||||
|
*/
|
||||||
|
public void configure() throws CoreException {
|
||||||
|
IProjectDescription description = getProject().getDescription();
|
||||||
|
ICommand[] commands = description.getBuildSpec();
|
||||||
|
for (int i = 0; i < commands.length; ++i) {
|
||||||
|
if (commands[i].getBuilderName().equals(ScannerConfigBuilder.BUILDER_ID)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ICommand command = description.newCommand();
|
||||||
|
command.setBuilderName(ScannerConfigBuilder.BUILDER_ID);
|
||||||
|
ICommand[] newCommands = new ICommand[commands.length + 1];
|
||||||
|
System.arraycopy(commands, 0, newCommands, 0, commands.length);
|
||||||
|
newCommands[commands.length] = command;
|
||||||
|
description.setBuildSpec(newCommands);
|
||||||
|
getProject().setDescription(description, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IProjectNature#deconfigure
|
||||||
|
*/
|
||||||
|
public void deconfigure() throws CoreException {
|
||||||
|
IProjectDescription description = getProject().getDescription();
|
||||||
|
ICommand[] commands = description.getBuildSpec();
|
||||||
|
for (int i = 0; i < commands.length; ++i) {
|
||||||
|
if (commands[i].getBuilderName().equals(ScannerConfigBuilder.BUILDER_ID)) {
|
||||||
|
ICommand[] newCommands = new ICommand[commands.length - 1];
|
||||||
|
System.arraycopy(commands, 0, newCommands, 0, i);
|
||||||
|
System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1);
|
||||||
|
description.setBuildSpec(newCommands);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getProject().setDescription(description, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IProjectNature#getProject
|
||||||
|
*/
|
||||||
|
public IProject getProject() {
|
||||||
|
return fProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IProjectNature#setProject
|
||||||
|
*/
|
||||||
|
public void setProject(IProject project) {
|
||||||
|
fProject = project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addScannerConfigNature(IProject project) throws CoreException {
|
||||||
|
if (project.hasNature(NATURE_ID))
|
||||||
|
return;
|
||||||
|
|
||||||
|
IProjectDescription description = project.getDescription();
|
||||||
|
String[] ids = description.getNatureIds();
|
||||||
|
String[] newIds = new String[ids.length + 1];
|
||||||
|
System.arraycopy(ids, 0, newIds, 0, ids.length);
|
||||||
|
newIds[ids.length] = NATURE_ID;
|
||||||
|
description.setNatureIds(newIds);
|
||||||
|
project.setDescription(description, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeScannerConfigNature(IProject project) throws CoreException {
|
||||||
|
IProjectDescription description = project.getDescription();
|
||||||
|
String[] ids = description.getNatureIds();
|
||||||
|
for (int i = 0; i < ids.length; ++i) {
|
||||||
|
if (ids[i].equals(NATURE_ID)) {
|
||||||
|
String[] newIds = new String[ids.length - 1];
|
||||||
|
System.arraycopy(ids, 0, newIds, 0, i);
|
||||||
|
System.arraycopy(ids, i + 1, newIds, i, ids.length - i - 1);
|
||||||
|
description.setNatureIds(newIds);
|
||||||
|
project.setDescription(description, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns build command as stored in .project file
|
||||||
|
*
|
||||||
|
* @param project
|
||||||
|
* @param builderID
|
||||||
|
* @return ICommand
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
public static ICommand getBuildSpec(IProject project, String builderID) throws CoreException {
|
||||||
|
IProjectDescription description = project.getDescription();
|
||||||
|
ICommand[] commands = description.getBuildSpec();
|
||||||
|
for (int i = 0; i < commands.length; ++i) {
|
||||||
|
if (commands[i].getBuilderName().equals(builderID)) {
|
||||||
|
return commands[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intercepts an output to console and forwards it to line parsers for processing
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ConsoleOutputStreamSniffer extends OutputStream {
|
||||||
|
|
||||||
|
private StringBuffer currentLine = new StringBuffer();
|
||||||
|
private OutputStream outputStream;
|
||||||
|
private int nOpens = 0;
|
||||||
|
private IScannerInfoConsoleParser[] parsers;
|
||||||
|
|
||||||
|
public ConsoleOutputStreamSniffer(IScannerInfoConsoleParser[] parsers) {
|
||||||
|
this.parsers = parsers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConsoleOutputStreamSniffer(OutputStream outputStream, IScannerInfoConsoleParser[] parsers) {
|
||||||
|
this(parsers);
|
||||||
|
nOpens = 1;
|
||||||
|
this.outputStream = outputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.io.OutputStream#write(int)
|
||||||
|
*/
|
||||||
|
public void write(int b) throws IOException {
|
||||||
|
currentLine.append((char) b);
|
||||||
|
checkLine(false);
|
||||||
|
if (outputStream != null) {
|
||||||
|
outputStream.write(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param flush
|
||||||
|
*/
|
||||||
|
private void checkLine(boolean flush) {
|
||||||
|
String buffer = currentLine.toString();
|
||||||
|
int i = 0;
|
||||||
|
while ((i = buffer.indexOf('\n')) != -1) {
|
||||||
|
String line = buffer.substring(0, i).trim(); // get rid of any trailing \r
|
||||||
|
processLine(line);
|
||||||
|
buffer = buffer.substring(i + 1); // skip the \n and advance
|
||||||
|
}
|
||||||
|
currentLine.setLength(0);
|
||||||
|
if (flush) {
|
||||||
|
if (buffer.length() > 0) {
|
||||||
|
processLine(buffer);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
currentLine.append(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param line
|
||||||
|
*/
|
||||||
|
private void processLine(String line) {
|
||||||
|
for (int i = 0; i < parsers.length; ++i) {
|
||||||
|
parsers[i].processLine(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.io.OutputStream#close()
|
||||||
|
*/
|
||||||
|
public void close() throws IOException {
|
||||||
|
if (nOpens > 0 && --nOpens == 0) {
|
||||||
|
checkLine(true);
|
||||||
|
if (outputStream != null)
|
||||||
|
outputStream.close();
|
||||||
|
}
|
||||||
|
for (int i = 0; i < parsers.length; ++i) {
|
||||||
|
parsers[i].shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.io.OutputStream#flush()
|
||||||
|
*/
|
||||||
|
public void flush() throws IOException {
|
||||||
|
if (outputStream != null) {
|
||||||
|
outputStream.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.io.OutputStream#write(byte[], int, int)
|
||||||
|
*/
|
||||||
|
public void write(byte[] b, int off, int len) throws IOException {
|
||||||
|
if (b == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
} else if (off != 0 || (len < 0) || (len > b.length)) {
|
||||||
|
throw new IndexOutOfBoundsException();
|
||||||
|
} else if (len == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
currentLine.append(new String(b, 0, len));
|
||||||
|
checkLine(false);
|
||||||
|
if (outputStream != null)
|
||||||
|
outputStream.write(b, off, len);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,257 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.CommandLauncher;
|
||||||
|
import org.eclipse.cdt.core.IMarkerGenerator;
|
||||||
|
import org.eclipse.cdt.core.model.ICModelMarker;
|
||||||
|
import org.eclipse.cdt.core.resources.IConsole;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
|
||||||
|
import org.eclipse.cdt.make.internal.core.StreamMonitor;
|
||||||
|
import org.eclipse.core.resources.IMarker;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default external scanner info provider.
|
||||||
|
* Runs an external command (i.e. gcc -c -v) and parses an output for scanner info.
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class DefaultExternalScannerInfoProvider implements IExternalScannerInfoProvider, IMarkerGenerator {
|
||||||
|
|
||||||
|
private static final String EXTERNAL_SI_PROVIDER_ERROR = "DefaultExternalScannerInfoProvider.Provider_Error"; //$NON-NLS-1$
|
||||||
|
private static final String EXTERNAL_SI_PROVIDER_CONSOLE_ID = MakeCorePlugin.getUniqueIdentifier() + ".ExternalScannerInfoProviderConsole"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private IPath fWorkingDirectory;
|
||||||
|
private IPath fCompileCommand;
|
||||||
|
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.lang.String[])
|
||||||
|
*/
|
||||||
|
public boolean invokeProvider(IProgressMonitor monitor, IProject currentProject, IScannerConfigBuilderInfo buildInfo, String[] targetSpecificOptions) {
|
||||||
|
if (!initialize(currentProject, buildInfo)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (monitor == null) {
|
||||||
|
monitor = new NullProgressMonitor();
|
||||||
|
}
|
||||||
|
monitor.beginTask(MakeCorePlugin.getResourceString("ExternalScannerInfoProvider.Reading_Specs"), 100); //$NON-NLS-1$
|
||||||
|
|
||||||
|
try {
|
||||||
|
IConsole console = CCorePlugin.getDefault().getConsole(EXTERNAL_SI_PROVIDER_CONSOLE_ID);
|
||||||
|
console.start(currentProject);
|
||||||
|
OutputStream cos = console.getOutputStream();
|
||||||
|
|
||||||
|
// Before launching give visual cues via the monitor
|
||||||
|
monitor.subTask(MakeCorePlugin.getResourceString("ExternalScannerInfoProvider.Reading_Specs")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
String errMsg = null;
|
||||||
|
CommandLauncher launcher = new CommandLauncher();
|
||||||
|
// Print the command for visual interaction.
|
||||||
|
launcher.showCommand(true);
|
||||||
|
|
||||||
|
// add file and TSO
|
||||||
|
String[] compileArguments = prepareArguments(targetSpecificOptions);
|
||||||
|
|
||||||
|
String ca = coligate(compileArguments);
|
||||||
|
|
||||||
|
monitor.subTask(MakeCorePlugin.getResourceString("ExternalScannerInfoProvider.Invoking_Command")
|
||||||
|
+ fCompileCommand.toString() + ca); //$NON-NLS-1$
|
||||||
|
cos = new StreamMonitor(new SubProgressMonitor(monitor, 70), cos, 100);
|
||||||
|
|
||||||
|
OutputStream sniffer = ScannerInfoConsoleParserFactory.getESIProviderOutputSniffer(
|
||||||
|
cos, currentProject, buildInfo);
|
||||||
|
Process p = launcher.execute(fCompileCommand, compileArguments, setEnvironment(launcher), fWorkingDirectory);
|
||||||
|
if (p != null) {
|
||||||
|
try {
|
||||||
|
// Close the input of the Process explicitely.
|
||||||
|
// We will never write to it.
|
||||||
|
p.getOutputStream().close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
}
|
||||||
|
if (launcher.waitAndRead(sniffer, sniffer, new SubProgressMonitor(monitor, 0)) != CommandLauncher.OK) {
|
||||||
|
errMsg = launcher.getErrorMessage();
|
||||||
|
}
|
||||||
|
monitor.subTask(MakeCorePlugin.getResourceString("ExternalScannerInfoProvider.Parsing_Output")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
errMsg = launcher.getErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errMsg != null) {
|
||||||
|
String errorDesc = MakeCorePlugin.getFormattedString(EXTERNAL_SI_PROVIDER_ERROR,
|
||||||
|
fCompileCommand.toString() + ca);
|
||||||
|
addMarker(currentProject, -1, errorDesc, IMarkerGenerator.SEVERITY_ERROR_BUILD, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor.subTask(MakeCorePlugin.getResourceString("ExternalScannerInfoProvider.Creating_Markers")); //$NON-NLS-1$
|
||||||
|
sniffer.close();
|
||||||
|
cos.close();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
monitor.done();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param currentProject
|
||||||
|
* @param buildInfo
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
private boolean initialize(IProject currentProject, IScannerConfigBuilderInfo buildInfo) {
|
||||||
|
boolean rc = false;
|
||||||
|
if (buildInfo.isDefaultESIProviderCmd()) {
|
||||||
|
fWorkingDirectory = MakeCorePlugin.getWorkingDirectory();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fWorkingDirectory = currentProject.getLocation();
|
||||||
|
}
|
||||||
|
fCompileCommand = buildInfo.getESIProviderCommand();
|
||||||
|
if (fCompileCommand != null) {
|
||||||
|
fCompileArguments = buildInfo.getESIProviderArguments();
|
||||||
|
rc = true;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tso
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String[] prepareArguments(String[] tso) {
|
||||||
|
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.length];
|
||||||
|
for (int i = 0; tokenizer.hasMoreTokens(); ++i) {
|
||||||
|
rv[i] = tokenizer.nextToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rv == null) {
|
||||||
|
rv = new String[tso.length];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < tso.length; ++i) {
|
||||||
|
rv[nTokens + i] = tso[i];
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String coligate(String[] array) {
|
||||||
|
StringBuffer sb = new StringBuffer(128);
|
||||||
|
for (int i = 0; i < array.length; ++i) {
|
||||||
|
sb.append(' ');
|
||||||
|
sb.append(array[i]);
|
||||||
|
}
|
||||||
|
String ca = sb.toString();
|
||||||
|
return ca;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param launcher
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String[] setEnvironment(CommandLauncher launcher) {
|
||||||
|
// Set the environmennt, some scripts may need the CWD var to be set.
|
||||||
|
Properties props = launcher.getEnvironment();
|
||||||
|
props.put("CWD", fWorkingDirectory.toOSString()); //$NON-NLS-1$
|
||||||
|
props.put("PWD", fWorkingDirectory.toOSString()); //$NON-NLS-1$
|
||||||
|
String[] env = null;
|
||||||
|
ArrayList envList = new ArrayList();
|
||||||
|
Enumeration names = props.propertyNames();
|
||||||
|
if (names != null) {
|
||||||
|
while (names.hasMoreElements()) {
|
||||||
|
String key = (String) names.nextElement();
|
||||||
|
envList.add(key + "=" + props.getProperty(key)); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
env = (String[]) envList.toArray(new String[envList.size()]);
|
||||||
|
}
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.IMarkerGenerator#addMarker(org.eclipse.core.resources.IResource, int, java.lang.String, int, java.lang.String)
|
||||||
|
*/
|
||||||
|
public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) {
|
||||||
|
try {
|
||||||
|
IMarker[] cur = file.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_ONE);
|
||||||
|
/*
|
||||||
|
* Try to find matching markers and don't put in duplicates
|
||||||
|
*/
|
||||||
|
if ((cur != null) && (cur.length > 0)) {
|
||||||
|
for (int i = 0; i < cur.length; i++) {
|
||||||
|
int line = ((Integer) cur[i].getAttribute(IMarker.LOCATION)).intValue();
|
||||||
|
int sev = ((Integer) cur[i].getAttribute(IMarker.SEVERITY)).intValue();
|
||||||
|
String mesg = (String) cur[i].getAttribute(IMarker.MESSAGE);
|
||||||
|
if (line == lineNumber && sev == mapMarkerSeverity(severity) && mesg.equals(errorDesc)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMarker marker = file.createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER);
|
||||||
|
marker.setAttribute(IMarker.LOCATION, lineNumber);
|
||||||
|
marker.setAttribute(IMarker.MESSAGE, errorDesc);
|
||||||
|
marker.setAttribute(IMarker.SEVERITY, mapMarkerSeverity(severity));
|
||||||
|
marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
|
||||||
|
marker.setAttribute(IMarker.CHAR_START, -1);
|
||||||
|
marker.setAttribute(IMarker.CHAR_END, -1);
|
||||||
|
if (errorVar != null) {
|
||||||
|
marker.setAttribute(ICModelMarker.C_MODEL_MARKER_VARIABLE, errorVar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e.getStatus());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int mapMarkerSeverity(int severity) {
|
||||||
|
switch (severity) {
|
||||||
|
case SEVERITY_ERROR_BUILD :
|
||||||
|
case SEVERITY_ERROR_RESOURCE :
|
||||||
|
return IMarker.SEVERITY_ERROR;
|
||||||
|
case SEVERITY_INFO :
|
||||||
|
return IMarker.SEVERITY_INFO;
|
||||||
|
case SEVERITY_WARNING :
|
||||||
|
return IMarker.SEVERITY_WARNING;
|
||||||
|
}
|
||||||
|
return IMarker.SEVERITY_ERROR;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common work required by the scanner info console parsers
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public interface IScannerInfoConsoleParserUtility {
|
||||||
|
// Problem marker related
|
||||||
|
public void generateMarker(IResource file, int lineNumber, String desc, int severity, String varName);
|
||||||
|
public boolean reportProblems();
|
||||||
|
// File path management
|
||||||
|
public void changeMakeDirectory(String dir, int dirLevel, boolean enterDir);
|
||||||
|
public IFile findFile(String fileName);
|
||||||
|
public List translateRelativePaths(IFile file, String fileName, List includes);
|
||||||
|
}
|
|
@ -0,0 +1,337 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.ICommand;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
import org.eclipse.core.runtime.IExtension;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a ScannerConfigBuilderInfo variant
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ScannerConfigInfoFactory {
|
||||||
|
private static final String PREFIX = MakeCorePlugin.getUniqueIdentifier();
|
||||||
|
|
||||||
|
static final String BUILD_SCANNER_CONFIG_ENABLED = PREFIX + ".ScannerConfigDiscoveryEnabled"; //$NON-NLS-1$
|
||||||
|
static final String MAKE_BUILDER_PARSER_ENABLED = PREFIX + ".makeBuilderParserEnabled"; //$NON-NLS-1$
|
||||||
|
static final String MAKE_BUILDER_PARSER_ID = PREFIX + ".makeBuilderParserId"; //$NON-NLS-1$
|
||||||
|
static final String ESI_PROVIDER_COMMAND_ENABLED = PREFIX + ".esiProviderCommandEnabled"; //$NON-NLS-1$
|
||||||
|
static final String USE_DEFAULT_ESI_PROVIDER_CMD = PREFIX + ".useDefaultESIProviderCmd"; //$NON-NLS-1$
|
||||||
|
static final String ESI_PROVIDER_COMMAND = PREFIX + ".esiProviderCommand"; //$NON-NLS-1$
|
||||||
|
static final String ESI_PROVIDER_ARGUMENTS = PREFIX + ".esiProviderArguments"; //$NON-NLS-1$
|
||||||
|
static final String ESI_PROVIDER_PARSER_ID = PREFIX + ".esiProviderParserId"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
private abstract static class Store implements IScannerConfigBuilderInfo {
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#isAutoDiscoveryEnabled()
|
||||||
|
*/
|
||||||
|
public boolean isAutoDiscoveryEnabled() {
|
||||||
|
return getBoolean(BUILD_SCANNER_CONFIG_ENABLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setAutoDiscoveryEnabled(boolean)
|
||||||
|
*/
|
||||||
|
public void setAutoDiscoveryEnabled(boolean enabled) throws CoreException {
|
||||||
|
putString(BUILD_SCANNER_CONFIG_ENABLED, Boolean.toString(enabled));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#isMakeBuilderConsoleParserEnabled()
|
||||||
|
*/
|
||||||
|
public boolean isMakeBuilderConsoleParserEnabled() {
|
||||||
|
if (getString(MAKE_BUILDER_PARSER_ENABLED) == null ||
|
||||||
|
getString(MAKE_BUILDER_PARSER_ENABLED).length() == 0) { // if no property then default to true
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return getBoolean(MAKE_BUILDER_PARSER_ENABLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setMakeBuilderConsoleParserEnabled(boolean)
|
||||||
|
*/
|
||||||
|
public void setMakeBuilderConsoleParserEnabled(boolean enabled) throws CoreException {
|
||||||
|
putString(MAKE_BUILDER_PARSER_ENABLED, Boolean.toString(enabled));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#getMakeBuilderConsoleParserId()
|
||||||
|
*/
|
||||||
|
public String getMakeBuilderConsoleParserId() {
|
||||||
|
String parserId = getString(MAKE_BUILDER_PARSER_ID);
|
||||||
|
if (parserId == null || parserId.length() == 0) {
|
||||||
|
String[] parserIds = MakeCorePlugin.getDefault().
|
||||||
|
getScannerInfoConsoleParserIds("makeBuilder"); //$NON-NLS-1$
|
||||||
|
// the default is the first one in the registry
|
||||||
|
parserId = parserIds[0];
|
||||||
|
}
|
||||||
|
return parserId;
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setMakeBuilderConsoleParserId(java.lang.String)
|
||||||
|
*/
|
||||||
|
public void setMakeBuilderConsoleParserId(String parserId) throws CoreException {
|
||||||
|
putString(MAKE_BUILDER_PARSER_ID, parserId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#isESIProviderCommandEnabled()
|
||||||
|
*/
|
||||||
|
public boolean isESIProviderCommandEnabled() {
|
||||||
|
if (getString(ESI_PROVIDER_COMMAND_ENABLED) == null ||
|
||||||
|
getString(ESI_PROVIDER_COMMAND_ENABLED).length() == 0) { // if no property then default to true
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return getBoolean(ESI_PROVIDER_COMMAND_ENABLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setESIProviderCommandEnabled(boolean)
|
||||||
|
*/
|
||||||
|
public void setESIProviderCommandEnabled(boolean enabled) throws CoreException {
|
||||||
|
putString(ESI_PROVIDER_COMMAND_ENABLED, Boolean.toString(enabled));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#isDefaultESIProviderCmd()
|
||||||
|
*/
|
||||||
|
public boolean isDefaultESIProviderCmd() {
|
||||||
|
if (getString(USE_DEFAULT_ESI_PROVIDER_CMD) == null ||
|
||||||
|
getString(USE_DEFAULT_ESI_PROVIDER_CMD).length() == 0) { // if no property then default to true
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return getBoolean(USE_DEFAULT_ESI_PROVIDER_CMD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setUseDefaultESIProviderCmd(boolean)
|
||||||
|
*/
|
||||||
|
public void setUseDefaultESIProviderCmd(boolean on) throws CoreException {
|
||||||
|
putString(USE_DEFAULT_ESI_PROVIDER_CMD, Boolean.toString(on));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#getESIProviderCommand()
|
||||||
|
*/
|
||||||
|
public IPath getESIProviderCommand() {
|
||||||
|
if (isDefaultESIProviderCmd()) {
|
||||||
|
String command = getESIProviderParameter("defaultCommand"); //$NON-NLS-1$
|
||||||
|
if (command == null) {
|
||||||
|
return new Path("gcc"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return new Path(command);
|
||||||
|
}
|
||||||
|
return new Path(getString(ESI_PROVIDER_COMMAND));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setESIProviderCommand(org.eclipse.core.runtime.IPath)
|
||||||
|
*/
|
||||||
|
public void setESIProviderCommand(IPath command) throws CoreException {
|
||||||
|
putString(ESI_PROVIDER_COMMAND, command.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#getESIProviderArguments()
|
||||||
|
*/
|
||||||
|
public String getESIProviderArguments() {
|
||||||
|
if (isDefaultESIProviderCmd()) {
|
||||||
|
String attributes = getESIProviderParameter("defaultAttributes"); //$NON-NLS-1$
|
||||||
|
if (attributes == null) {
|
||||||
|
attributes = "-c -v"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return attributes;
|
||||||
|
}
|
||||||
|
return getString(ESI_PROVIDER_ARGUMENTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setESIProviderArguments(java.lang.String)
|
||||||
|
*/
|
||||||
|
public void setESIProviderArguments(String args) throws CoreException {
|
||||||
|
putString(ESI_PROVIDER_ARGUMENTS, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#getESIProviderConsoleParserId()
|
||||||
|
*/
|
||||||
|
public String getESIProviderConsoleParserId() {
|
||||||
|
String parserId = getString(ESI_PROVIDER_PARSER_ID);
|
||||||
|
if (parserId == null || parserId.length() == 0) {
|
||||||
|
String[] parserIds = MakeCorePlugin.getDefault().
|
||||||
|
getScannerInfoConsoleParserIds("externalScannerInfoProvider"); //$NON-NLS-1$
|
||||||
|
// the default is the first one in the registry
|
||||||
|
parserId = parserIds[0];
|
||||||
|
}
|
||||||
|
return parserId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo#setESIProviderConsoleParserId(java.lang.String)
|
||||||
|
*/
|
||||||
|
public void setESIProviderConsoleParserId(String parserId) throws CoreException {
|
||||||
|
putString(ESI_PROVIDER_PARSER_ID, parserId);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean getBoolean(String property) {
|
||||||
|
return Boolean.valueOf(getString(property)).booleanValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract String getBuilderID();
|
||||||
|
protected abstract String getString(String property);
|
||||||
|
protected abstract void putString(String name, String value) throws CoreException;
|
||||||
|
|
||||||
|
protected String getESIProviderParameter(String name) {
|
||||||
|
IExtension extension =
|
||||||
|
Platform.getPluginRegistry().getExtension(
|
||||||
|
MakeCorePlugin.getUniqueIdentifier(),
|
||||||
|
MakeCorePlugin.EXTERNAL_SI_PROVIDER_SIMPLE_ID,
|
||||||
|
// TODO VMIR make this configurable
|
||||||
|
MakeCorePlugin.DEFAULT_EXTERNAL_SI_PROVIDER_ID);
|
||||||
|
if (extension == null)
|
||||||
|
return null;
|
||||||
|
IConfigurationElement[] configs = extension.getConfigurationElements();
|
||||||
|
if (configs.length == 0)
|
||||||
|
return null;
|
||||||
|
IConfigurationElement[] runElement = configs[0].getChildren("run"); //$NON-NLS-1$
|
||||||
|
IConfigurationElement[] paramElement = runElement[0].getChildren("parameter"); //$NON-NLS-1$
|
||||||
|
for (int i = 0; i < paramElement.length; i++) {
|
||||||
|
if (paramElement[i].getAttribute("name").equals(name)) { //$NON-NLS-1$
|
||||||
|
return paramElement[i].getAttribute("value"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Preference extends Store {
|
||||||
|
private Preferences prefs;
|
||||||
|
private String builderID;
|
||||||
|
private boolean useDefaults;
|
||||||
|
|
||||||
|
Preference(Preferences prefs, String builderID, boolean useDefaults) {
|
||||||
|
this.prefs = prefs;
|
||||||
|
this.builderID = builderID;
|
||||||
|
this.useDefaults = useDefaults;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void putString(String name, String value) {
|
||||||
|
if (useDefaults) {
|
||||||
|
prefs.setDefault(name, value);
|
||||||
|
} else {
|
||||||
|
prefs.setValue(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getString(String property) {
|
||||||
|
if (useDefaults) {
|
||||||
|
return prefs.getDefaultString(property);
|
||||||
|
}
|
||||||
|
return prefs.getString(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getBuilderID() {
|
||||||
|
return builderID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class BuildProperty extends Store {
|
||||||
|
private IProject project;
|
||||||
|
private String builderID;
|
||||||
|
private Map args;
|
||||||
|
|
||||||
|
BuildProperty(IProject project, String builderID) throws CoreException {
|
||||||
|
this.project = project;
|
||||||
|
this.builderID = builderID;
|
||||||
|
ICommand builder = ScannerConfigNature.getBuildSpec(project, builderID);
|
||||||
|
if (builder == null) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR,
|
||||||
|
MakeCorePlugin.getUniqueIdentifier(), -1,
|
||||||
|
MakeCorePlugin.getResourceString("ScannerConfigInfoFactory.Missing_Builder")//$NON-NLS-1$
|
||||||
|
+ builderID, null));
|
||||||
|
}
|
||||||
|
args = builder.getArguments();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void putString(String name, String value) throws CoreException {
|
||||||
|
String curValue = (String) args.get(name);
|
||||||
|
if (curValue != null && curValue.equals(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ICommand builder = ScannerConfigNature.getBuildSpec(project, builderID);
|
||||||
|
args.put(name, value);
|
||||||
|
builder.setArguments(args);
|
||||||
|
project.setDescription(project.getDescription(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getString(String name) {
|
||||||
|
String value = (String) args.get(name);
|
||||||
|
return value == null ? "" : value; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getBuilderID() {
|
||||||
|
return builderID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class BuildArguments extends Store {
|
||||||
|
private Map args;
|
||||||
|
private String builderID;
|
||||||
|
|
||||||
|
BuildArguments(Map args, String builderID) {
|
||||||
|
this.args = args;
|
||||||
|
this.builderID = builderID;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void putString(String name, String value) {
|
||||||
|
args.put(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getString(String name) {
|
||||||
|
return (String) args.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getBuilderID() {
|
||||||
|
return builderID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IScannerConfigBuilderInfo create(Preferences prefs, String builderID, boolean useDefaults) {
|
||||||
|
return new ScannerConfigInfoFactory.Preference(prefs, builderID, useDefaults);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IScannerConfigBuilderInfo create(IProject project, String builderID) throws CoreException {
|
||||||
|
return new ScannerConfigInfoFactory.BuildProperty(project, builderID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IScannerConfigBuilderInfo create(Map args, String builderID) {
|
||||||
|
return new ScannerConfigInfoFactory.BuildArguments(args, builderID);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,343 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCProjectNature;
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.CProjectNature;
|
||||||
|
import org.eclipse.cdt.core.parser.IScannerInfo;
|
||||||
|
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.ISafeRunnable;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||||
|
import org.eclipse.cdt.make.core.MakeScannerInfo;
|
||||||
|
import org.eclipse.cdt.make.core.MakeProjectNature;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CygpathTranslator;
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton object that collects scanner config updates from ScannerInfoParser
|
||||||
|
* and updates scanner config when the project's build is done.
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ScannerInfoCollector {
|
||||||
|
|
||||||
|
// Singleton
|
||||||
|
private static ScannerInfoCollector instance = new ScannerInfoCollector();
|
||||||
|
private Map discoveredIncludes;
|
||||||
|
private Map discoveredSymbols;
|
||||||
|
private Map discoveredTSO; // target specific options
|
||||||
|
// cumulative values
|
||||||
|
private Map sumDiscoveredIncludes;
|
||||||
|
private Map sumDiscoveredSymbols;
|
||||||
|
private Map sumDiscoveredTSO; // target specific options
|
||||||
|
|
||||||
|
private IProject currentProject; // project being built
|
||||||
|
|
||||||
|
private ScannerInfoCollector() {
|
||||||
|
discoveredIncludes = new HashMap();
|
||||||
|
discoveredSymbols = new HashMap();
|
||||||
|
discoveredTSO = new HashMap();
|
||||||
|
|
||||||
|
sumDiscoveredIncludes = new HashMap();
|
||||||
|
sumDiscoveredSymbols = new HashMap();
|
||||||
|
sumDiscoveredTSO = new HashMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ScannerInfoCollector getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Published method to receive per file contributions to ScannerInfo
|
||||||
|
*
|
||||||
|
* @param resource
|
||||||
|
* @param includes
|
||||||
|
* @param symbols
|
||||||
|
* @param targetSpecificOptions
|
||||||
|
*/
|
||||||
|
public synchronized void contributeToScannerConfig(IResource resource, List includes, List symbols, List targetSpecificOptions) {
|
||||||
|
IProject project;
|
||||||
|
if (resource == null || (project = resource.getProject()) == null) {
|
||||||
|
// TODO VMIR create a log
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (project.hasNature(MakeProjectNature.NATURE_ID) && // limits to StandardMake projects
|
||||||
|
(project.hasNature(CProjectNature.C_NATURE_ID) ||
|
||||||
|
project.hasNature(CCProjectNature.CC_NATURE_ID))) {
|
||||||
|
|
||||||
|
String projectName = project.getName();
|
||||||
|
contribute(projectName, discoveredIncludes, includes);
|
||||||
|
contribute(projectName, discoveredSymbols, symbols);
|
||||||
|
contribute(projectName, discoveredTSO, targetSpecificOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param project
|
||||||
|
* @param discovered symbols | includes | targetSpecificOptions
|
||||||
|
* @param delta symbols | includes | targetSpecificOptions
|
||||||
|
* @return true if there is a change in discovered symbols | includes | targetSpecificOptions
|
||||||
|
*/
|
||||||
|
private boolean contribute(String projectName, Map discovered, List delta) {
|
||||||
|
if (delta == null || delta.isEmpty())
|
||||||
|
return false;
|
||||||
|
List projectDiscovered = (List) discovered.get(projectName);
|
||||||
|
if (projectDiscovered == null) {
|
||||||
|
projectDiscovered = new ArrayList(delta);
|
||||||
|
discovered.put(projectName, projectDiscovered);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
boolean added = false;
|
||||||
|
for (Iterator i = delta.iterator(); i.hasNext(); ) {
|
||||||
|
String item = (String) i.next();
|
||||||
|
if (!projectDiscovered.contains(item)) {
|
||||||
|
added |= projectDiscovered.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return added;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param project
|
||||||
|
* @param monitor
|
||||||
|
*/
|
||||||
|
private void updateScannerConfig(IProject project, IProgressMonitor monitor) {
|
||||||
|
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
|
||||||
|
monitor.beginTask(MakeCorePlugin.getResourceString("ScannerInfoCollector.Processing"), 100);
|
||||||
|
if (provider != null) {
|
||||||
|
IScannerInfo scanInfo = provider.getScannerInformation(project);
|
||||||
|
if (scanInfo != null) {
|
||||||
|
if (scanInfo instanceof MakeScannerInfo) {
|
||||||
|
MakeScannerInfo makeScanInfo = (MakeScannerInfo)scanInfo;
|
||||||
|
String projectName = project.getName();
|
||||||
|
|
||||||
|
monitor.subTask(MakeCorePlugin.getResourceString("ScannerInfoCollector.Processing"));
|
||||||
|
if (scannerConfigNeedsUpdate(makeScanInfo, projectName)) {
|
||||||
|
monitor.worked(50);
|
||||||
|
monitor.subTask(MakeCorePlugin.getResourceString("ScannerInfoCollector.Updating") + projectName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// update scanner configuration
|
||||||
|
makeScanInfo.update();
|
||||||
|
monitor.worked(50);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
// TODO : VMIR create a marker?
|
||||||
|
MakeCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
monitor.done();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare discovered include paths and symbol definitions with the ones from scanInfo.
|
||||||
|
* @param scanInfo
|
||||||
|
* @param projectName
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean scannerConfigNeedsUpdate(MakeScannerInfo makeScanInfo, String projectName) {
|
||||||
|
// TODO : VMIR to implement other variants
|
||||||
|
List includes = (List) discoveredIncludes.get(projectName);
|
||||||
|
List dSymbols = (List) discoveredSymbols.get(projectName);
|
||||||
|
if (includes == null && dSymbols == null)
|
||||||
|
return false;
|
||||||
|
Set symbols = new HashSet(dSymbols);
|
||||||
|
|
||||||
|
// Step 1. Add discovered scanner config to the existing discovered scanner config
|
||||||
|
// add the includes from the latest discovery
|
||||||
|
boolean addedIncludes = false;
|
||||||
|
List sumIncludes = (List) sumDiscoveredIncludes.get(projectName);
|
||||||
|
if (sumIncludes == null) {
|
||||||
|
sumIncludes = new ArrayList(includes);
|
||||||
|
sumDiscoveredIncludes.put(projectName, sumIncludes);
|
||||||
|
addedIncludes = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (Iterator i = includes.iterator(); i.hasNext(); ) {
|
||||||
|
String include = (String) i.next();
|
||||||
|
if (!sumIncludes.contains(include)) {
|
||||||
|
addedIncludes |= sumIncludes.add(include);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// try to translate cygpaths to absolute paths
|
||||||
|
List finalSumIncludes = translateIncludePaths(sumIncludes);
|
||||||
|
|
||||||
|
// add the symbols from the latest discovery
|
||||||
|
boolean addedSymbols = false;
|
||||||
|
Map sumSymbols = (Map) sumDiscoveredSymbols.get(projectName);
|
||||||
|
if (sumSymbols == null) {
|
||||||
|
sumSymbols = new HashMap();
|
||||||
|
sumDiscoveredSymbols.put(projectName, sumSymbols);
|
||||||
|
}
|
||||||
|
addedSymbols = ScannerConfigUtil.scAddSymbolsSet2SymbolEntryMap(sumSymbols, symbols, false);
|
||||||
|
|
||||||
|
// Step 2. Get project's scanner config
|
||||||
|
String[] persistedIncludes = makeScanInfo.getIncludePaths();
|
||||||
|
Map persistedSymbols = makeScanInfo.getDefinedSymbols();
|
||||||
|
|
||||||
|
// TODO VMIR this is likely to change when new UI is introduced
|
||||||
|
// Step 3. Merge scanner config from steps 1 and 2
|
||||||
|
List candidateIncludes = new ArrayList(Arrays.asList(persistedIncludes));
|
||||||
|
for (Iterator i = finalSumIncludes.iterator(); i.hasNext(); ) {
|
||||||
|
String include = (String) i.next();
|
||||||
|
if (!candidateIncludes.contains(include)) {
|
||||||
|
addedIncludes |= candidateIncludes.add(include);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Map candidateSymbols = new HashMap(sumSymbols);
|
||||||
|
Set persistedSymbolsSet = ScannerConfigUtil.scSymbolsMap2Set(persistedSymbols);
|
||||||
|
addedSymbols |= ScannerConfigUtil.scAddSymbolsSet2SymbolEntryMap(candidateSymbols, persistedSymbolsSet, true);
|
||||||
|
|
||||||
|
// Step 4. Set resulting scanner config
|
||||||
|
makeScanInfo.setIncludePaths((String[])candidateIncludes.toArray(new String[candidateIncludes.size()]));
|
||||||
|
makeScanInfo.setPreprocessorSymbols((String[])ScannerConfigUtil.
|
||||||
|
scSymbolsSymbolEntryMap2Set(candidateSymbols).toArray(new String[candidateSymbols.size()]));
|
||||||
|
|
||||||
|
// invalidate discovered include paths and symbol definitions
|
||||||
|
discoveredIncludes.put(projectName, null);
|
||||||
|
discoveredSymbols.put(projectName, null);
|
||||||
|
|
||||||
|
return (addedIncludes | addedSymbols);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param sumIncludes
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private List translateIncludePaths(List sumIncludes) {
|
||||||
|
List translatedIncludePaths = new ArrayList();
|
||||||
|
for (Iterator i = sumIncludes.iterator(); i.hasNext(); ) {
|
||||||
|
String includePath = (String) i.next();
|
||||||
|
IPath realPath = new Path(includePath);
|
||||||
|
if (!realPath.toFile().exists()) {
|
||||||
|
String translatedPath = new CygpathTranslator(currentProject, includePath).run();
|
||||||
|
if (!translatedPath.equals(includePath)) {
|
||||||
|
// Check if the translated path exists
|
||||||
|
IPath transPath = new Path(translatedPath);
|
||||||
|
if (transPath.toFile().exists()) {
|
||||||
|
translatedIncludePaths.add(translatedPath);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// TODO VMIR create problem marker
|
||||||
|
// TODO VMIR for now add even if it does not exist
|
||||||
|
translatedIncludePaths.add(translatedPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// TODO VMIR for now add even if it does not exist
|
||||||
|
translatedIncludePaths.add(translatedPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
translatedIncludePaths.add(includePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return translatedIncludePaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call ESI provider to get scanner info
|
||||||
|
*
|
||||||
|
* @param project
|
||||||
|
* @param tso
|
||||||
|
* @param monitor
|
||||||
|
*/
|
||||||
|
private void getProviderScannerInfo(final IProject project,
|
||||||
|
final List tso,
|
||||||
|
final IProgressMonitor monitor) {
|
||||||
|
// get IScannerConfigBuilderInfo
|
||||||
|
IScannerConfigBuilderInfo info;
|
||||||
|
try {
|
||||||
|
info = MakeCorePlugin.createScannerConfigBuildInfo(
|
||||||
|
project, ScannerConfigBuilder.BUILDER_ID);
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
MakeCorePlugin.log(e);
|
||||||
|
info = MakeCorePlugin.createScannerConfigBuildInfo(
|
||||||
|
MakeCorePlugin.getDefault().getPluginPreferences(),
|
||||||
|
ScannerConfigBuilder.BUILDER_ID, false);
|
||||||
|
}
|
||||||
|
if (info.isESIProviderCommandEnabled()) {
|
||||||
|
final IScannerConfigBuilderInfo buildInfo = info;
|
||||||
|
final IExternalScannerInfoProvider esiProvider = MakeCorePlugin.getDefault().
|
||||||
|
getExternalScannerInfoProvider(MakeCorePlugin.DEFAULT_EXTERNAL_SI_PROVIDER_ID);
|
||||||
|
if (esiProvider != null) {
|
||||||
|
ISafeRunnable runnable = new ISafeRunnable() {
|
||||||
|
public void run() {
|
||||||
|
String[] tsoArray;
|
||||||
|
if (tso == null) {
|
||||||
|
tsoArray = new String[0];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tsoArray = (String[])tso.toArray(new String[tso.size()]);
|
||||||
|
}
|
||||||
|
esiProvider.invokeProvider(monitor, project, buildInfo, tsoArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleException(Throwable exception) {
|
||||||
|
MakeCorePlugin.log(exception);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Platform.run(runnable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param project
|
||||||
|
* @param monitor
|
||||||
|
*/
|
||||||
|
public synchronized void updateScannerConfiguration(IProject project, IProgressMonitor monitor) {
|
||||||
|
currentProject = project;
|
||||||
|
String projectName = project.getName();
|
||||||
|
// check TSO for the project
|
||||||
|
monitor.beginTask("", 100); //$NON-NLS-1$
|
||||||
|
getProviderScannerInfo(project, (List) discoveredTSO.get(projectName), new SubProgressMonitor(monitor, 60));
|
||||||
|
updateScannerConfig(project, new SubProgressMonitor(monitor, 40));
|
||||||
|
|
||||||
|
// delete discovered scanner config
|
||||||
|
discoveredIncludes.put(projectName, null);
|
||||||
|
discoveredSymbols.put(projectName, null);
|
||||||
|
discoveredTSO.put(projectName, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||||
|
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IMarkerGenerator;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerInfoConsoleParserUtility;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A factory that creates a ConsoleOutputStreamSniffer,
|
||||||
|
* ScannerInfoConsoleParser and optionally a ScannerInfoConsoleParserUtility.
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ScannerInfoConsoleParserFactory {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a ConsoleOutputStreamSniffer, make builder scanner info console parser
|
||||||
|
* and a utility.
|
||||||
|
*
|
||||||
|
* @param outputStream
|
||||||
|
* @param currentProject
|
||||||
|
* @param markerGenerator
|
||||||
|
* @param scBuildInfo
|
||||||
|
* @return OutputStream
|
||||||
|
*/
|
||||||
|
public static OutputStream getESIProviderOutputSniffer(OutputStream outputStream,
|
||||||
|
IProject currentProject,
|
||||||
|
IScannerConfigBuilderInfo scBuildInfo) {
|
||||||
|
if (scBuildInfo.isESIProviderCommandEnabled()) {
|
||||||
|
// get the ESIProvider console parser
|
||||||
|
IScannerInfoConsoleParser clParser = MakeCorePlugin.getDefault().
|
||||||
|
getScannerInfoConsoleParser(scBuildInfo.getESIProviderConsoleParserId());
|
||||||
|
// initialize it with the utility
|
||||||
|
clParser.startup(currentProject, null /*new ScannerInfoConsoleParserUtility(
|
||||||
|
currentProject, null, markerGenerator)*/);
|
||||||
|
// create an output stream sniffer
|
||||||
|
return new ConsoleOutputStreamSniffer(outputStream, new
|
||||||
|
IScannerInfoConsoleParser[] {clParser});
|
||||||
|
}
|
||||||
|
return outputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a ConsoleOutputStreamSniffer, ESI provider scanner info console parser
|
||||||
|
* and a utility.
|
||||||
|
*
|
||||||
|
* @param outputStream
|
||||||
|
* @param currentProject
|
||||||
|
* @param workingDirectory
|
||||||
|
* @param markerGenerator
|
||||||
|
* @return OutputStream
|
||||||
|
*/
|
||||||
|
public static OutputStream getMakeBuilderOutputSniffer(OutputStream outputStream,
|
||||||
|
IProject currentProject,
|
||||||
|
IPath workingDirectory,
|
||||||
|
IMarkerGenerator markerGenerator) {
|
||||||
|
try {
|
||||||
|
// get the SC builder settings
|
||||||
|
IScannerConfigBuilderInfo scBuildInfo = MakeCorePlugin.
|
||||||
|
createScannerConfigBuildInfo(currentProject, ScannerConfigBuilder.BUILDER_ID);
|
||||||
|
if (scBuildInfo.isMakeBuilderConsoleParserEnabled()) {
|
||||||
|
// get the make builder console parser
|
||||||
|
IScannerInfoConsoleParser clParser = MakeCorePlugin.getDefault().
|
||||||
|
getScannerInfoConsoleParser(scBuildInfo.getMakeBuilderConsoleParserId());
|
||||||
|
// initialize it with the utility
|
||||||
|
clParser.startup(currentProject, new ScannerInfoConsoleParserUtility(
|
||||||
|
currentProject, workingDirectory, markerGenerator));
|
||||||
|
// create an output stream sniffer
|
||||||
|
return new ConsoleOutputStreamSniffer(outputStream, new
|
||||||
|
IScannerInfoConsoleParser[] {clParser});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
MakeCorePlugin.log(e.getStatus());
|
||||||
|
}
|
||||||
|
return outputStream;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig.gnu;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GCC related utility class
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class GCCScannerConfigUtil {
|
||||||
|
public static final String CPP_SPECS_FILE = "specs.cpp"; //$NON-NLS-1$
|
||||||
|
public static final String C_SPECS_FILE = "specs.c"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static void createSpecs() {
|
||||||
|
IPath path = MakeCorePlugin.getWorkingDirectory();
|
||||||
|
try {
|
||||||
|
createSpecsFile(path, CPP_SPECS_FILE);
|
||||||
|
createSpecsFile(path, C_SPECS_FILE);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
MakeCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createSpecsFile(IPath path, String fileName) throws CoreException {
|
||||||
|
IPath specs = path.append(fileName);
|
||||||
|
File specsFile = specs.toFile();
|
||||||
|
if (!specsFile.exists()) {
|
||||||
|
try {
|
||||||
|
FileOutputStream file = new FileOutputStream(specsFile);
|
||||||
|
file.write('\n');
|
||||||
|
file.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR,
|
||||||
|
MakeCorePlugin.getDefault().getDescriptor().getUniqueIdentifier(), -1,
|
||||||
|
MakeCorePlugin.getResourceString("GCCScannerConfigUtil.Error_Message"), e)); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,203 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig.gnu;
|
||||||
|
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCProjectNature;
|
||||||
|
import org.eclipse.cdt.core.CProjectNature;
|
||||||
|
import org.eclipse.cdt.core.IMarkerGenerator;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
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.ScannerInfoCollector;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses gcc and g++ output for -I and -D parameters.
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
|
||||||
|
|
||||||
|
private IProject fProject = null;
|
||||||
|
private IScannerInfoConsoleParserUtility fUtil = null;
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#startup(org.eclipse.core.resources.IProject)
|
||||||
|
*/
|
||||||
|
public void startup(IProject project, IScannerInfoConsoleParserUtility util) {
|
||||||
|
fProject = project;
|
||||||
|
fUtil = util;
|
||||||
|
|
||||||
|
IPath workingDirectory = MakeCorePlugin.getWorkingDirectory();
|
||||||
|
String targetFile = "dummy"; //$NON-NLS-1$
|
||||||
|
try {
|
||||||
|
if (project.hasNature(CCProjectNature.CC_NATURE_ID)) {
|
||||||
|
targetFile = GCCScannerConfigUtil.CPP_SPECS_FILE;
|
||||||
|
}
|
||||||
|
else if (project.hasNature(CProjectNature.C_NATURE_ID)) {
|
||||||
|
targetFile = GCCScannerConfigUtil.C_SPECS_FILE;
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
//TODO VMIR better error handling
|
||||||
|
MakeCorePlugin.log(e.getStatus());
|
||||||
|
}
|
||||||
|
IPath path2File = workingDirectory.append(targetFile);
|
||||||
|
if (!path2File.toFile().exists()) {
|
||||||
|
GCCScannerConfigUtil.createSpecs();
|
||||||
|
}
|
||||||
|
List targetSpecificOptions = new ArrayList();
|
||||||
|
targetSpecificOptions.add(targetFile);
|
||||||
|
|
||||||
|
ScannerInfoCollector.getInstance().
|
||||||
|
contributeToScannerConfig(project, null, null, targetSpecificOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.ScannerInfoConsoleParserUtility#processLine(java.lang.String)
|
||||||
|
*/
|
||||||
|
public boolean processLine(String line) {
|
||||||
|
boolean rc = false;
|
||||||
|
// make\[[0-9]*\]: error_desc
|
||||||
|
int firstColon= line.indexOf(':');
|
||||||
|
if (firstColon != -1 && line.startsWith("make")) { //$NON-NLS-1$
|
||||||
|
boolean enter = false;
|
||||||
|
String msg = line.substring(firstColon + 1).trim();
|
||||||
|
if ((enter = msg.startsWith("Entering directory")) || //$NON-NLS-1$
|
||||||
|
(msg.startsWith("Leaving directory"))) { //$NON-NLS-1$
|
||||||
|
int s = msg.indexOf('`');
|
||||||
|
int e = msg.indexOf('\'');
|
||||||
|
if (s != -1 && e != -1) {
|
||||||
|
String dir = msg.substring(s+1, e);
|
||||||
|
fUtil.changeMakeDirectory(dir, getDirectoryLevel(line), enter);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Known patterns:
|
||||||
|
// (a) gcc|g++ ... -Dxxx -Iyyy ...
|
||||||
|
StringTokenizer scanner = new StringTokenizer(line);
|
||||||
|
if (scanner.countTokens() <= 1)
|
||||||
|
return false;
|
||||||
|
String token = scanner.nextToken();
|
||||||
|
if (token.equalsIgnoreCase("gcc") || token.equalsIgnoreCase("g++")) {//$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
// Recognized gcc or g++ compiler invocation
|
||||||
|
List includes = new ArrayList();
|
||||||
|
List symbols = new ArrayList();
|
||||||
|
List targetSpecificOptions = new ArrayList();
|
||||||
|
|
||||||
|
rc = true;
|
||||||
|
String fileName = null;
|
||||||
|
String desc = "Found";
|
||||||
|
while (scanner.hasMoreTokens()) {
|
||||||
|
token = scanner.nextToken();
|
||||||
|
if (token.startsWith("-D")) {//$NON-NLS-1$
|
||||||
|
String symbol = token.substring(2);
|
||||||
|
if (!symbols.contains(symbol))
|
||||||
|
symbols.add(symbol);
|
||||||
|
}
|
||||||
|
else if (token.startsWith("-I")) {//$NON-NLS-1$
|
||||||
|
String iPath = token.substring(2);
|
||||||
|
if (!includes.contains(iPath))
|
||||||
|
includes.add(iPath);
|
||||||
|
}
|
||||||
|
else if (token.equals("-mwin32") || //$NON-NLS-1$
|
||||||
|
token.equals("-mno-win32") || //$NON-NLS-1$
|
||||||
|
token.equals("-mno-cygwin") || //$NON-NLS-1$
|
||||||
|
token.equals("-ansi") || //$NON-NLS-1$
|
||||||
|
token.equals("-nostdinc") || //$NON-NLS-1$
|
||||||
|
token.equals("-posix") || //$NON-NLS-1$
|
||||||
|
token.equals("-pthread")) { //$NON-NLS-1$
|
||||||
|
if (!targetSpecificOptions.contains(token))
|
||||||
|
targetSpecificOptions.add(token);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String possibleFileName = token.toLowerCase();
|
||||||
|
if (possibleFileName.startsWith("..") || //$NON-NLS-1$
|
||||||
|
possibleFileName.startsWith(".") || //$NON-NLS-1$
|
||||||
|
possibleFileName.startsWith("/") || //$NON-NLS-1$
|
||||||
|
possibleFileName.startsWith("$(") || //$NON-NLS-1$
|
||||||
|
possibleFileName.endsWith(".c") || //$NON-NLS-1$
|
||||||
|
possibleFileName.endsWith(".cpp") || //$NON-NLS-1$
|
||||||
|
possibleFileName.endsWith(".cc") || //$NON-NLS-1$
|
||||||
|
possibleFileName.endsWith(".cxx")) { //$NON-NLS-1$
|
||||||
|
|
||||||
|
fileName = token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IProject project = fProject;
|
||||||
|
IFile file = null;
|
||||||
|
if (includes.size() > 0) {
|
||||||
|
if (fileName != null) {
|
||||||
|
file = fUtil.findFile(fileName);
|
||||||
|
if (file != null) {
|
||||||
|
project = file.getProject();
|
||||||
|
includes = fUtil.translateRelativePaths(file, fileName, includes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fUtil.generateMarker(fProject, -1, "Unable to find file name: " + line,
|
||||||
|
IMarkerGenerator.SEVERITY_ERROR_RESOURCE, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Contribute discovered includes and symbols to the ScannerInfoCollector
|
||||||
|
ScannerInfoCollector.getInstance().
|
||||||
|
contributeToScannerConfig(project, includes, symbols, targetSpecificOptions);
|
||||||
|
|
||||||
|
// TODO : VMIR remove when debugging is done
|
||||||
|
int severity = IMarkerGenerator.SEVERITY_INFO;
|
||||||
|
|
||||||
|
for (Iterator i = includes.iterator(); i.hasNext(); ) {
|
||||||
|
String iPath = (String)i.next();
|
||||||
|
fUtil.generateMarker(file, -1, "Found an include path: "+iPath, severity, iPath);
|
||||||
|
}
|
||||||
|
for (Iterator i = symbols.iterator(); i.hasNext(); ) {
|
||||||
|
String symbol = (String)i.next();
|
||||||
|
fUtil.generateMarker(file, -1, "Found a symbol definition: "+symbol, severity, symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#shutdown()
|
||||||
|
*/
|
||||||
|
public void shutdown() {
|
||||||
|
if (fUtil != null) {
|
||||||
|
fUtil.reportProblems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getDirectoryLevel(String line) {
|
||||||
|
int s = line.indexOf('[');
|
||||||
|
int num = 0;
|
||||||
|
if (s != -1) {
|
||||||
|
int e = line.indexOf(']');
|
||||||
|
String number = line.substring(s + 1, e).trim();
|
||||||
|
try {
|
||||||
|
num = Integer.parseInt(number);
|
||||||
|
} catch (NumberFormatException exc) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig.gnu;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
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.ScannerInfoCollector;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses output of gcc -c -v specs.c or
|
||||||
|
* g++ -c -v specs.cpp
|
||||||
|
* command
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class GCCSpecsConsoleParser implements IScannerInfoConsoleParser {
|
||||||
|
private final int STATE_BEGIN = 0;
|
||||||
|
private final int STATE_SPECS_STARTED = 1;
|
||||||
|
private final int STATE_INCLUDES_STARTED = 2;
|
||||||
|
|
||||||
|
private IProject project = null;
|
||||||
|
private IScannerInfoConsoleParserUtility util = null;
|
||||||
|
|
||||||
|
private int state = STATE_BEGIN;
|
||||||
|
private List symbols = new ArrayList();
|
||||||
|
private List includes = new ArrayList();
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#initialize(org.eclipse.core.resources.IProject, org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility)
|
||||||
|
*/
|
||||||
|
public void startup(IProject project, IScannerInfoConsoleParserUtility util) {
|
||||||
|
this.project = project;
|
||||||
|
this.util = util;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParser#processLine(java.lang.String)
|
||||||
|
*/
|
||||||
|
public boolean processLine(String line) {
|
||||||
|
boolean rc = false;
|
||||||
|
// Known patterns:
|
||||||
|
// (a) gcc|g++ ... -Dxxx -Iyyy ...
|
||||||
|
switch (state) {
|
||||||
|
case STATE_BEGIN:
|
||||||
|
if (line.startsWith("Reading specs from")) { //$NON-NLS-1$
|
||||||
|
state = STATE_SPECS_STARTED;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
case STATE_SPECS_STARTED:
|
||||||
|
if (line.indexOf("-D") != -1) { //$NON-NLS-1$
|
||||||
|
// line contains -Ds, extract them
|
||||||
|
StringTokenizer scanner = new StringTokenizer(line);
|
||||||
|
if (scanner.countTokens() <= 1)
|
||||||
|
return rc;
|
||||||
|
for (String token = scanner.nextToken(); scanner.hasMoreTokens(); token = scanner.nextToken()) {
|
||||||
|
if (token.startsWith("-D")) { //$NON-NLS-1$
|
||||||
|
String symbol = token.substring(2);
|
||||||
|
if (!symbols.contains(symbol))
|
||||||
|
symbols.add(symbol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// now get all the includes
|
||||||
|
if (line.startsWith("#include") && line.endsWith("search starts here:")) { //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
state = STATE_INCLUDES_STARTED;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
case STATE_INCLUDES_STARTED:
|
||||||
|
if (line.startsWith("#include") && line.endsWith("search starts here:")) { //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
state = STATE_INCLUDES_STARTED;
|
||||||
|
}
|
||||||
|
else if (line.startsWith("End of search list.")) { //$NON-NLS-1$
|
||||||
|
state = STATE_BEGIN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!includes.contains(line))
|
||||||
|
includes.add(line);
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScannerInfoCollector.getInstance().contributeToScannerConfig(project, includes, symbols, null);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParser#shutdown()
|
||||||
|
*/
|
||||||
|
public void shutdown() {
|
||||||
|
if (util != null) {
|
||||||
|
util.reportProblems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,111 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig.util;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CommandLauncher;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.ISafeRunnable;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes external command 'cygpath' to translate cygpaths to absolute paths.
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class CygpathTranslator {
|
||||||
|
IProject project;
|
||||||
|
private String orgPath;
|
||||||
|
private String transPath;
|
||||||
|
|
||||||
|
public CygpathTranslator(IProject project, String path) {
|
||||||
|
this.project = project;
|
||||||
|
orgPath = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String run() {
|
||||||
|
ISafeRunnable runnable = new ISafeRunnable() {
|
||||||
|
public void run() throws Exception {
|
||||||
|
transPath = platformRun();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleException(Throwable exception) {
|
||||||
|
transPath = orgPath;
|
||||||
|
MakeCorePlugin.log(exception);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Platform.run(runnable);
|
||||||
|
return transPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String platformRun() {
|
||||||
|
CommandLauncher launcher = new CommandLauncher();
|
||||||
|
launcher.showCommand(false);
|
||||||
|
|
||||||
|
OutputStream output = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
Process p = launcher.execute(
|
||||||
|
new Path("cygpath"), //$NON-NLS-1$
|
||||||
|
new String[] {"-m", orgPath}, //$NON-NLS-1$
|
||||||
|
new String[0],//setEnvironment(launcher, "c:/"),//$NON-NLS-1$
|
||||||
|
project.getLocation()); //$NON-NLS-1$
|
||||||
|
if (p != null) {
|
||||||
|
try {
|
||||||
|
// Close the input of the Process explicitely.
|
||||||
|
// We will never write to it.
|
||||||
|
p.getOutputStream().close();
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
}
|
||||||
|
if (launcher.waitAndRead(output, output) != CommandLauncher.OK) {
|
||||||
|
String errMsg = launcher.getErrorMessage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return output.toString().trim();
|
||||||
|
}
|
||||||
|
return orgPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param launcher
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String[] setEnvironment(CommandLauncher launcher, String dir) {
|
||||||
|
// Set the environmennt, some scripts may need the CWD var to be set.
|
||||||
|
IPath workingDirectory = new Path(dir);
|
||||||
|
Properties props = launcher.getEnvironment();
|
||||||
|
props.put("CWD", workingDirectory.toOSString()); //$NON-NLS-1$
|
||||||
|
props.put("PWD", workingDirectory.toOSString()); //$NON-NLS-1$
|
||||||
|
String[] env = null;
|
||||||
|
ArrayList envList = new ArrayList();
|
||||||
|
Enumeration names = props.propertyNames();
|
||||||
|
if (names != null) {
|
||||||
|
while (names.hasMoreElements()) {
|
||||||
|
String key = (String) names.nextElement();
|
||||||
|
envList.add(key + "=" + props.getProperty(key)); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
env = (String[]) envList.toArray(new String[envList.size()]);
|
||||||
|
}
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig.util;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class that handles some Scanner Config specifig collection conversions
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public final class ScannerConfigUtil {
|
||||||
|
/**
|
||||||
|
* Converts a map of symbols to a set
|
||||||
|
*
|
||||||
|
* @param symbolsMap
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Set scSymbolsMap2Set(Map symbolsMap) {
|
||||||
|
Set retSymbols = new HashSet();
|
||||||
|
Set keys = symbolsMap.keySet();
|
||||||
|
for (Iterator i = keys.iterator(); i.hasNext(); ) {
|
||||||
|
String symbol;
|
||||||
|
String key = (String) i.next();
|
||||||
|
String value = (String) symbolsMap.get(key);
|
||||||
|
if (value == null || value.length() == 0) {
|
||||||
|
symbol = key;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
symbol = key + "=" + value; //$NON-NLS-1
|
||||||
|
}
|
||||||
|
retSymbols.add(symbol);
|
||||||
|
}
|
||||||
|
return retSymbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds all new discovered symbols/values to the existing ones.
|
||||||
|
*
|
||||||
|
* @param sumSymbols - a map of [String, Set] where Set is a SymbolEntry
|
||||||
|
* @param symbols
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static boolean scAddSymbolsSet2SymbolEntryMap(Map sumSymbols, Set symbols, boolean preferred) {
|
||||||
|
boolean rc = false;
|
||||||
|
for (Iterator i = symbols.iterator(); i.hasNext(); ) {
|
||||||
|
String symbol = (String) i.next();
|
||||||
|
String key;
|
||||||
|
String value = null;
|
||||||
|
int index = symbol.indexOf("="); //$NON-NLS-1$
|
||||||
|
if (index != -1) {
|
||||||
|
key = symbol.substring(0, index).trim();
|
||||||
|
value = symbol.substring(index + 1).trim();
|
||||||
|
} else {
|
||||||
|
key = symbol.trim();
|
||||||
|
}
|
||||||
|
SymbolEntry sEntry = (SymbolEntry) sumSymbols.get(key);
|
||||||
|
if (sEntry == null) {
|
||||||
|
sEntry = new SymbolEntry(key, value, true);
|
||||||
|
rc = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rc |= sEntry.add(value, preferred);
|
||||||
|
}
|
||||||
|
sumSymbols.put(key, sEntry);
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets all discovered symbols with preferred values
|
||||||
|
* @param sumSymbols
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Set scSymbolsSymbolEntryMap2Set(Map sumSymbols) {
|
||||||
|
Set symbols = (Set) sumSymbols.entrySet();
|
||||||
|
Set rv = new HashSet(symbols.size());
|
||||||
|
for (Iterator i = symbols.iterator(); i.hasNext(); ) {
|
||||||
|
SymbolEntry sEntry = (SymbolEntry) ((Map.Entry) i.next()).getValue();
|
||||||
|
rv.add(sEntry.getPreferedRaw());
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,342 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IMarkerGenerator;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements error reporting mechanism and file/path translation mechanism
|
||||||
|
* Taken from ErrorParserManager and modified.
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ScannerInfoConsoleParserUtility implements IScannerInfoConsoleParserUtility {
|
||||||
|
private IProject fProject;
|
||||||
|
private IPath fBaseDirectory;
|
||||||
|
private IMarkerGenerator fMarkerGenerator;
|
||||||
|
private ArrayList fErrors;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For tracking the location of files being compiled
|
||||||
|
*/
|
||||||
|
private Map fFilesInProject;
|
||||||
|
private List fCollectedFiles;
|
||||||
|
private List fNameConflicts;
|
||||||
|
private Vector fDirectoryStack;
|
||||||
|
|
||||||
|
public ScannerInfoConsoleParserUtility(IProject project, IPath workingDirectory, IMarkerGenerator markerGenerator) {
|
||||||
|
fProject = project;
|
||||||
|
fMarkerGenerator = markerGenerator;
|
||||||
|
fBaseDirectory = fProject.getLocation();
|
||||||
|
fErrors = new ArrayList();
|
||||||
|
|
||||||
|
fFilesInProject = new HashMap();
|
||||||
|
fCollectedFiles = new ArrayList();
|
||||||
|
fNameConflicts = new ArrayList();
|
||||||
|
fDirectoryStack = new Vector();
|
||||||
|
|
||||||
|
collectFiles(fProject, fCollectedFiles);
|
||||||
|
|
||||||
|
for (int i = 0; i < fCollectedFiles.size(); i++) {
|
||||||
|
IFile curr = (IFile) fCollectedFiles.get(i);
|
||||||
|
Object existing = fFilesInProject.put(curr.getName(), curr);
|
||||||
|
if (existing != null) {
|
||||||
|
fNameConflicts.add(curr.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (workingDirectory != null) {
|
||||||
|
pushDirectory(workingDirectory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility#reportProblems()
|
||||||
|
*/
|
||||||
|
public boolean reportProblems() {
|
||||||
|
boolean reset = false;
|
||||||
|
for (Iterator iter = fErrors.iterator(); iter.hasNext(); ) {
|
||||||
|
Problem problem = (Problem) iter.next();
|
||||||
|
if (problem.severity == IMarkerGenerator.SEVERITY_ERROR_BUILD) {
|
||||||
|
reset = true;
|
||||||
|
}
|
||||||
|
if (problem.file == null) {
|
||||||
|
fMarkerGenerator.addMarker(
|
||||||
|
fProject,
|
||||||
|
problem.lineNumber,
|
||||||
|
problem.description,
|
||||||
|
problem.severity,
|
||||||
|
problem.variableName);
|
||||||
|
} else {
|
||||||
|
fMarkerGenerator.addMarker(
|
||||||
|
problem.file,
|
||||||
|
problem.lineNumber,
|
||||||
|
problem.description,
|
||||||
|
problem.severity,
|
||||||
|
problem.variableName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fErrors.clear();
|
||||||
|
return reset;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected class Problem {
|
||||||
|
protected IResource file;
|
||||||
|
protected int lineNumber;
|
||||||
|
protected String description;
|
||||||
|
protected int severity;
|
||||||
|
protected String variableName;
|
||||||
|
|
||||||
|
public Problem(IResource file, int lineNumber, String desciption, int severity, String variableName) {
|
||||||
|
this.file = file;
|
||||||
|
this.lineNumber = lineNumber;
|
||||||
|
this.description = desciption;
|
||||||
|
this.severity = severity;
|
||||||
|
this.variableName = variableName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the console line parsers to generate a problem marker.
|
||||||
|
*/
|
||||||
|
public void generateMarker(IResource file, int lineNumber, String desc, int severity, String varName) {
|
||||||
|
Problem problem = new Problem(file, lineNumber, desc, severity, varName);
|
||||||
|
fErrors.add(problem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the console line parsers to find a file with a given name.
|
||||||
|
* @param fileName
|
||||||
|
* @return IFile or null
|
||||||
|
*/
|
||||||
|
public IFile findFile(String fileName) {
|
||||||
|
IFile file = findFilePath(fileName);
|
||||||
|
if (file == null) {
|
||||||
|
// Try the project's map.
|
||||||
|
file = findFileName(fileName);
|
||||||
|
if (file != null) {
|
||||||
|
// If there is a conflict then try all files in the project.
|
||||||
|
if (isConflictingName(fileName)) {
|
||||||
|
file = null;
|
||||||
|
// Create a problem marker
|
||||||
|
generateMarker(fProject, -1, "Ambiguous file path: "+fileName, //$NON-NLS-1$
|
||||||
|
IMarkerGenerator.SEVERITY_ERROR_RESOURCE, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param filePath
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IFile findFilePath(String filePath) {
|
||||||
|
IPath path = null;
|
||||||
|
IPath fp = new Path(filePath);
|
||||||
|
if (fp.isAbsolute()) {
|
||||||
|
if (fBaseDirectory.isPrefixOf(fp)) {
|
||||||
|
int segments = fBaseDirectory.matchingFirstSegments(fp);
|
||||||
|
path = fp.removeFirstSegments(segments);
|
||||||
|
} else {
|
||||||
|
path = fp;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
path = (IPath) getWorkingDirectory().append(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
IFile file = null;
|
||||||
|
// The workspace may throw an IllegalArgumentException
|
||||||
|
// Catch it and the parser should fallback to scan the entire project.
|
||||||
|
try {
|
||||||
|
file = findFileInWorkspace(path);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have to do another try, on Windows for cases like "TEST.C" vs "test.c"
|
||||||
|
// We use the java.io.File canonical path.
|
||||||
|
if (file == null || !file.exists()) {
|
||||||
|
File f = path.toFile();
|
||||||
|
try {
|
||||||
|
String canon = f.getCanonicalPath();
|
||||||
|
path = new Path(canon);
|
||||||
|
file = findFileInWorkspace(path);
|
||||||
|
} catch (IOException e1) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (file != null && file.exists()) ? file : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param fileName
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IFile findFileName(String fileName) {
|
||||||
|
IPath path = new Path(fileName);
|
||||||
|
return (IFile) fFilesInProject.get(path.lastSegment());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IFile findFileInWorkspace(IPath path) {
|
||||||
|
IFile file = null;
|
||||||
|
if (path.isAbsolute()) {
|
||||||
|
IWorkspaceRoot root = fProject.getWorkspace().getRoot();
|
||||||
|
file = root.getFileForLocation(path);
|
||||||
|
// It may be a link resource so we must check it also.
|
||||||
|
if (file == null) {
|
||||||
|
IFile[] files = root.findFilesForLocation(path);
|
||||||
|
for (int i = 0; i < files.length; i++) {
|
||||||
|
if (files[i].getProject().equals(fProject)) {
|
||||||
|
file = files[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
file = fProject.getFile(path);
|
||||||
|
}
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void collectFiles(IContainer parent, List result) {
|
||||||
|
try {
|
||||||
|
IResource[] resources = parent.members();
|
||||||
|
for (int i = 0; i < resources.length; i++) {
|
||||||
|
IResource resource = resources[i];
|
||||||
|
if (resource instanceof IFile) {
|
||||||
|
result.add(resource);
|
||||||
|
} else if (resource instanceof IContainer) {
|
||||||
|
collectFiles((IContainer) resource, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
MakeCorePlugin.log(e.getStatus());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isConflictingName(String fileName) {
|
||||||
|
IPath path = new Path(fileName);
|
||||||
|
return fNameConflicts.contains(path.lastSegment());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IPath getWorkingDirectory() {
|
||||||
|
if (fDirectoryStack.size() != 0) {
|
||||||
|
return (IPath) fDirectoryStack.lastElement();
|
||||||
|
}
|
||||||
|
// Fallback to the Project Location
|
||||||
|
// FIXME: if the build did not start in the Project ?
|
||||||
|
return fBaseDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void pushDirectory(IPath dir) {
|
||||||
|
if (dir != null) {
|
||||||
|
IPath pwd = null;
|
||||||
|
if (fBaseDirectory.isPrefixOf(dir)) {
|
||||||
|
// int segments = fBaseDirectory.matchingFirstSegments(dir);
|
||||||
|
pwd = dir.removeFirstSegments(fBaseDirectory.segmentCount());
|
||||||
|
} else {
|
||||||
|
pwd = dir;
|
||||||
|
}
|
||||||
|
fDirectoryStack.addElement(pwd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IPath popDirectory() {
|
||||||
|
int i = getDirectoryLevel();
|
||||||
|
if (i != 0) {
|
||||||
|
IPath dir = (IPath) fDirectoryStack.lastElement();
|
||||||
|
fDirectoryStack.removeElementAt(i - 1);
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
return new Path(""); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getDirectoryLevel() {
|
||||||
|
return fDirectoryStack.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility#changeMakeDirectory(java.lang.String, int, boolean)
|
||||||
|
*/
|
||||||
|
public void changeMakeDirectory(String dir, int dirLevel, boolean enterDir) {
|
||||||
|
if (enterDir) {
|
||||||
|
/* Sometimes make screws up the output, so
|
||||||
|
* "leave" events can't be seen. Double-check level
|
||||||
|
* here.
|
||||||
|
*/
|
||||||
|
for (int parseLevel = getDirectoryLevel(); dirLevel < parseLevel; parseLevel = getDirectoryLevel()) {
|
||||||
|
popDirectory();
|
||||||
|
}
|
||||||
|
pushDirectory(new Path(dir));
|
||||||
|
} else {
|
||||||
|
popDirectory();
|
||||||
|
/* Could check to see if they match */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility#translateRelativePaths(org.eclipse.core.resources.IFile, java.lang.String, java.util.List)
|
||||||
|
*/
|
||||||
|
public List translateRelativePaths(IFile file, String fileName, List includes) {
|
||||||
|
List translatedIncludes = new ArrayList(includes.size());
|
||||||
|
for (Iterator i = includes.iterator(); i.hasNext(); ) {
|
||||||
|
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 pwd = getWorkingDirectory();
|
||||||
|
if (!pwd.isAbsolute()) {
|
||||||
|
pwd = fProject.getLocation().append(pwd);
|
||||||
|
}
|
||||||
|
IPath candidatePath = pwd.append(includePath);
|
||||||
|
File dir = candidatePath.makeAbsolute().toFile();
|
||||||
|
if (dir.exists()) {
|
||||||
|
translatedIncludes.add(candidatePath.toString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// try to deduce a current path from the fileName format
|
||||||
|
if (file != null && fileName != null) {
|
||||||
|
// TODO VMIR implement heuristics to translate relative path when the working directory is invalid
|
||||||
|
// For now create a marker to identify prospective cases
|
||||||
|
generateMarker(file.getProject(), -1, "Ambiguous include path: "+include, //$NON-NLS-1$
|
||||||
|
IMarkerGenerator.SEVERITY_WARNING, fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO VMIR for now add unresolved paths as well
|
||||||
|
translatedIncludes.add(include);
|
||||||
|
}
|
||||||
|
return translatedIncludes;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,127 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.make.internal.core.scannerconfig.util;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a symbol definition with possible multiple values
|
||||||
|
* example:
|
||||||
|
* LOG_LEVEL
|
||||||
|
* LOG_LEVEL = 2
|
||||||
|
* LOG_LEVEL = LOG_BASE + 1
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class SymbolEntry {
|
||||||
|
private static final String UNSPECIFIED_VALUE = "1"; //$NON-NLS-1$
|
||||||
|
private String name;
|
||||||
|
private Set values;
|
||||||
|
private String preferredValue; // the first added value unless otherwise specified
|
||||||
|
|
||||||
|
public SymbolEntry(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
public SymbolEntry(String name, String value) {
|
||||||
|
this(name);
|
||||||
|
if (values == null) {
|
||||||
|
values = new HashSet();
|
||||||
|
}
|
||||||
|
values.add(value);
|
||||||
|
}
|
||||||
|
public SymbolEntry(String name, String value, boolean preferred) {
|
||||||
|
this(name, value);
|
||||||
|
if (preferred) {
|
||||||
|
preferredValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean add(String value) {
|
||||||
|
if (values == null) {
|
||||||
|
values = new HashSet();
|
||||||
|
}
|
||||||
|
if (preferredValue == null) {
|
||||||
|
preferredValue = value;
|
||||||
|
}
|
||||||
|
return values.add(value);
|
||||||
|
}
|
||||||
|
public boolean add(String value, boolean preferred) {
|
||||||
|
boolean rc = add(value);
|
||||||
|
if (preferred) {
|
||||||
|
preferredValue = value;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
public boolean addAll(SymbolEntry se) {
|
||||||
|
return values.addAll(se.values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeAll() {
|
||||||
|
values = null;
|
||||||
|
preferredValue = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrefered() {
|
||||||
|
return name+ "=" + (preferredValue == null ? UNSPECIFIED_VALUE : preferredValue);//$NON-NLS-1$
|
||||||
|
}
|
||||||
|
public String getPreferedRaw() {
|
||||||
|
return name + (preferredValue == null ? "" : "=" + preferredValue);//$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set getAllButPreferred() {
|
||||||
|
if (values == null)
|
||||||
|
return null;
|
||||||
|
Set rv = new HashSet(values.size());
|
||||||
|
for (Iterator i = values.iterator(); i.hasNext(); ) {
|
||||||
|
String val = (String) i.next();
|
||||||
|
if (val.equals(preferredValue))
|
||||||
|
continue;
|
||||||
|
rv.add(name + "=" + (val == null ? UNSPECIFIED_VALUE : val));//$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
public Set getAllButPreferredRaw() {
|
||||||
|
if (values == null)
|
||||||
|
return null;
|
||||||
|
Set rv = new HashSet(values.size());
|
||||||
|
for (Iterator i = values.iterator(); i.hasNext(); ) {
|
||||||
|
String val = (String) i.next();
|
||||||
|
if (val.equals(preferredValue))
|
||||||
|
continue;
|
||||||
|
rv.add(name + (val == null ? "" : "=" + val));//$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
public Set getAll() {
|
||||||
|
if (values == null)
|
||||||
|
return null;
|
||||||
|
Set rv = new HashSet(values.size());
|
||||||
|
for (Iterator i = values.iterator(); i.hasNext(); ) {
|
||||||
|
String val = (String) i.next();
|
||||||
|
rv.add(name + "=" + (val == null ? UNSPECIFIED_VALUE : val));//$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
public Set getAllRaw() {
|
||||||
|
if (values == null)
|
||||||
|
return null;
|
||||||
|
Set rv = new HashSet(values.size());
|
||||||
|
for (Iterator i = values.iterator(); i.hasNext(); ) {
|
||||||
|
String val = (String) i.next();
|
||||||
|
rv.add(name + (val == null ? "" : "=" + val));//$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -43,3 +43,5 @@ ActionDefinition.uncomment.description= Uncomment the selected # style comment l
|
||||||
|
|
||||||
MakefileEditor.name=Makefile Editor
|
MakefileEditor.name=Makefile Editor
|
||||||
|
|
||||||
|
PropertyScannerConfig.name=Scanner Configuration Discovery
|
||||||
|
PreferenceScannerConfig.name=Scanner Configuration Discovery
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
<import plugin="org.eclipse.core.runtime.compatibility"/>
|
<import plugin="org.eclipse.core.runtime.compatibility"/>
|
||||||
</requires>
|
</requires>
|
||||||
|
|
||||||
|
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.ui.newWizards">
|
point="org.eclipse.ui.newWizards">
|
||||||
<wizard
|
<wizard
|
||||||
|
@ -393,5 +392,28 @@
|
||||||
</actionSet>
|
</actionSet>
|
||||||
</perspectiveExtension>
|
</perspectiveExtension>
|
||||||
</extension>
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.propertyPages">
|
||||||
|
<page
|
||||||
|
adaptable="true"
|
||||||
|
objectClass="org.eclipse.core.resources.IProject"
|
||||||
|
name="%PropertyScannerConfig.name"
|
||||||
|
class="org.eclipse.cdt.make.internal.ui.properties.ScannerConfigPropertyPage"
|
||||||
|
id="org.eclipse.cdt.make.ui.properties.ScannerConfigPropertyPage">
|
||||||
|
<filter
|
||||||
|
name="nature"
|
||||||
|
value="org.eclipse.cdt.make.core.makeNature">
|
||||||
|
</filter>
|
||||||
|
</page>
|
||||||
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.preferencePages">
|
||||||
|
<page
|
||||||
|
name="%PreferenceScannerConfig.name"
|
||||||
|
category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage"
|
||||||
|
class="org.eclipse.cdt.make.internal.ui.preferences.ScannerConfigPreferencePage"
|
||||||
|
id="org.eclipse.cdt.make.ui.preferences.ScannerConfigPreferencePage">
|
||||||
|
</page>
|
||||||
|
</extension>
|
||||||
|
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -191,3 +191,18 @@ LexicalSortingAction.tooltip=Sort
|
||||||
LexicalSortingAction.tooltip.on=Do Not Sort
|
LexicalSortingAction.tooltip.on=Do Not Sort
|
||||||
LexicalSortingAction.tooltip.off=Sort
|
LexicalSortingAction.tooltip.off=Sort
|
||||||
|
|
||||||
|
# --- ScannerConfigPage ---
|
||||||
|
ScannerConfigPage.label=Scanner Config
|
||||||
|
ScannerConfigPage.desc=Scanner configuration discovery settings
|
||||||
|
ScannerConfigPage.activate=Automate scanner configuration discovery
|
||||||
|
|
||||||
|
ScannerConfigPage.siBuilder.parser.group_label=Build output parser options
|
||||||
|
ScannerConfigPage.siBuilder.parser.enable.label=Enable build output parser
|
||||||
|
ScannerConfigPage.siBuilder.parser.label=Make build output parser:
|
||||||
|
ScannerConfigPage.siProvider.cmd.group_label=Generate scanner info command options
|
||||||
|
ScannerConfigPage.siProvider.cmd.enable.label=Enable generate scanner info command
|
||||||
|
ScannerConfigPage.siProvider.cmd.use_default=Use default
|
||||||
|
ScannerConfigPage.siProvider.cmd.label=Generate scanner info command:
|
||||||
|
ScannerConfigPage.siProvider.parser.label=Command output parser:
|
||||||
|
|
||||||
|
ScannerConfigPage.siProvider.cmd.error_message=Must enter a 'generate scanner info' command
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.ui.preferences;
|
||||||
|
|
||||||
|
import org.eclipse.ui.IWorkbench;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
|
import org.eclipse.jface.preference.PreferencePage;
|
||||||
|
import org.eclipse.ui.IWorkbenchPreferencePage;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.ui.dialogs.ScannerConfigPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scanner config preference page
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ScannerConfigPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ICOptionContainer {
|
||||||
|
|
||||||
|
private ScannerConfigPage fScannerConfigPage;
|
||||||
|
|
||||||
|
public ScannerConfigPreferencePage() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PreferencePage#init
|
||||||
|
*/
|
||||||
|
public void init(IWorkbench workbench) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PreferencePage#createContents
|
||||||
|
*/
|
||||||
|
protected Control createContents(Composite parent) {
|
||||||
|
fScannerConfigPage = new ScannerConfigPage(true); // add title
|
||||||
|
// must set container before call to createControl
|
||||||
|
fScannerConfigPage.setContainer(this);
|
||||||
|
|
||||||
|
fScannerConfigPage.createControl(parent);
|
||||||
|
return fScannerConfigPage.getControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void performDefaults() {
|
||||||
|
fScannerConfigPage.performDefaults();
|
||||||
|
super.performDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean performOk() {
|
||||||
|
try {
|
||||||
|
fScannerConfigPage.performApply(null);
|
||||||
|
MakeCorePlugin.getDefault().savePluginPreferences();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#updateContainer()
|
||||||
|
*/
|
||||||
|
public void updateContainer() {
|
||||||
|
setValid(fScannerConfigPage.isValid());
|
||||||
|
setErrorMessage(fScannerConfigPage.getErrorMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getProject()
|
||||||
|
*/
|
||||||
|
public IProject getProject() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getPreferences()
|
||||||
|
*/
|
||||||
|
public Preferences getPreferences() {
|
||||||
|
return MakeCorePlugin.getDefault().getPluginPreferences();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.preference.IPreferencePage#isValid()
|
||||||
|
*/
|
||||||
|
public boolean isValid() {
|
||||||
|
updateContainer();
|
||||||
|
return super.isValid();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.internal.ui.properties;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.ui.dialogs.PropertyPage;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.ui.dialogs.ScannerConfigPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scanner config property page
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ScannerConfigPropertyPage extends PropertyPage implements ICOptionContainer {
|
||||||
|
|
||||||
|
private ScannerConfigPage fScannerConfigPage;
|
||||||
|
|
||||||
|
public ScannerConfigPropertyPage() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PreferencePage#createContents(Composite)
|
||||||
|
*/
|
||||||
|
protected Control createContents(Composite parent) {
|
||||||
|
fScannerConfigPage = new ScannerConfigPage(true); // add title
|
||||||
|
// must set container before call to createControl
|
||||||
|
fScannerConfigPage.setContainer(this);
|
||||||
|
|
||||||
|
fScannerConfigPage.createControl(parent);
|
||||||
|
return fScannerConfigPage.getControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void performDefaults() {
|
||||||
|
fScannerConfigPage.performDefaults();
|
||||||
|
super.performDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean performOk() {
|
||||||
|
try {
|
||||||
|
fScannerConfigPage.performApply(null);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#updateContainer()
|
||||||
|
*/
|
||||||
|
public void updateContainer() {
|
||||||
|
setValid(fScannerConfigPage.isValid());
|
||||||
|
setErrorMessage(fScannerConfigPage.getErrorMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getProject()
|
||||||
|
*/
|
||||||
|
public IProject getProject() {
|
||||||
|
return (IProject) getElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getPreferences()
|
||||||
|
*/
|
||||||
|
public Preferences getPreferences() {
|
||||||
|
return MakeCorePlugin.getDefault().getPluginPreferences();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.preference.IPreferencePage#isValid()
|
||||||
|
*/
|
||||||
|
public boolean isValid() {
|
||||||
|
updateContainer();
|
||||||
|
return super.isValid();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,482 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.make.ui.dialogs;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
|
||||||
|
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
|
||||||
|
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
import org.eclipse.core.runtime.IExtension;
|
||||||
|
import org.eclipse.core.runtime.IExtensionPoint;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Combo;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Event;
|
||||||
|
import org.eclipse.swt.widgets.Group;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Listener;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigBuilder;
|
||||||
|
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature;
|
||||||
|
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scanner Config settings page
|
||||||
|
*
|
||||||
|
* @author vhirsl
|
||||||
|
*/
|
||||||
|
public class ScannerConfigPage extends AbstractCOptionPage {
|
||||||
|
private static final String PREFIX = "ScannerConfigPage"; //$NON-NLS-1$
|
||||||
|
private static final String LABEL = PREFIX + ".label"; //$NON-NLS-1$
|
||||||
|
private static final String DESC = PREFIX + ".desc"; //$NON-NLS-1$
|
||||||
|
private static final String ACTIVATE_AUTO_DISCOVERY = PREFIX + ".activate"; //$NON-NLS-1$
|
||||||
|
private static final String SI_BUILD_PARSER_GROUP = PREFIX + ".siBuilder.parser.group_label"; //$NON-NLS-1$
|
||||||
|
private static final String ENABLE_SI_BUILD_PARSER = PREFIX + ".siBuilder.parser.enable.label"; //$NON-NLS-1$
|
||||||
|
private static final String SI_BUILD_PARSER_LABEL = PREFIX + ".siBuilder.parser.label"; //$NON-NLS-1$
|
||||||
|
private static final String SI_PROVIDER_CMD_GROUP = PREFIX + ".siProvider.cmd.group_label"; //$NON-NLS-1$
|
||||||
|
private static final String ENABLE_SI_PROVIDER_COMMAND = PREFIX + ".siProvider.cmd.enable.label"; //$NON-NLS-1$
|
||||||
|
private static final String SI_PROVIDER_CMD_USE_DEFAULT = PREFIX + ".siProvider.cmd.use_default"; //$NON-NLS-1$
|
||||||
|
private static final String SI_PROVIDER_CMD_LABEL = PREFIX + ".siProvider.cmd.label"; //$NON-NLS-1$
|
||||||
|
private static final String SI_PROVIDER_PARSER_LABEL = PREFIX + ".siProvider.parser.label"; //$NON-NLS-1$
|
||||||
|
private static final String SI_PROVIDER_CMD_ERROR_MESSAGE = PREFIX + ".siProvider.cmd.error_message"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private boolean addTitle = false;
|
||||||
|
|
||||||
|
private Button autoDiscovery;
|
||||||
|
|
||||||
|
private Button defESIProviderCommandButton;
|
||||||
|
private Text esiProviderCommand;
|
||||||
|
|
||||||
|
private Button enableBuilderParserButton;
|
||||||
|
private Combo makeBuilderSIParserComboBox;
|
||||||
|
private Button enableProviderCommandButton;
|
||||||
|
private Combo esiProviderParserComboBox;
|
||||||
|
|
||||||
|
private IScannerConfigBuilderInfo fBuildInfo;
|
||||||
|
private Map builderParsers = new HashMap();
|
||||||
|
private String initialBuilderParserId = null;
|
||||||
|
private Map providerParsers = new HashMap();
|
||||||
|
private String initialProviderParserId = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
*/
|
||||||
|
public ScannerConfigPage() {
|
||||||
|
super(MakeUIPlugin.getResourceString(LABEL));
|
||||||
|
setDescription(MakeUIPlugin.getResourceString(DESC));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param addTitle
|
||||||
|
*/
|
||||||
|
public ScannerConfigPage(boolean addTitle) {
|
||||||
|
this();
|
||||||
|
this.addTitle = addTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#isValid()
|
||||||
|
*/
|
||||||
|
public boolean isValid() {
|
||||||
|
if (!useDefaultESIProviderCmd()) {
|
||||||
|
String cmd = getSIProviderCommandLine();
|
||||||
|
if (cmd == null || cmd.length() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#setContainer(org.eclipse.cdt.ui.dialogs.ICOptionContainer)
|
||||||
|
*/
|
||||||
|
public void setContainer(ICOptionContainer container) {
|
||||||
|
super.setContainer(container);
|
||||||
|
IProject project = container.getProject();
|
||||||
|
if (project != null) {
|
||||||
|
try {
|
||||||
|
fBuildInfo = MakeCorePlugin.createScannerConfigBuildInfo(project, ScannerConfigBuilder.BUILDER_ID);
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
fBuildInfo = MakeCorePlugin.createScannerConfigBuildInfo(container.getPreferences(), ScannerConfigBuilder.BUILDER_ID, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fBuildInfo = MakeCorePlugin.createScannerConfigBuildInfo(container.getPreferences(), ScannerConfigBuilder.BUILDER_ID, false);
|
||||||
|
}
|
||||||
|
retrieveSIConsoleParsers();
|
||||||
|
initialBuilderParserId = fBuildInfo.getMakeBuilderConsoleParserId(); //$NON-NLS-1$
|
||||||
|
initialProviderParserId = fBuildInfo.getESIProviderConsoleParserId(); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills console parser maps
|
||||||
|
*/
|
||||||
|
private void retrieveSIConsoleParsers() {
|
||||||
|
IExtensionPoint ep = MakeCorePlugin.getDefault().getDescriptor().
|
||||||
|
getExtensionPoint(MakeCorePlugin.SI_CONSOLE_PARSER_SIMPLE_ID);
|
||||||
|
if (ep != null) {
|
||||||
|
IExtension[] extensions = ep.getExtensions();
|
||||||
|
for (int i = 0; i < extensions.length; ++i) {
|
||||||
|
String parserId = extensions[i].getUniqueIdentifier();
|
||||||
|
String label = extensions[i].getLabel();
|
||||||
|
IConfigurationElement[] elements = (IConfigurationElement[]) extensions[i].getConfigurationElements();
|
||||||
|
String commandId = elements[0].getAttribute("commandId"); //$NON-NLS-1$
|
||||||
|
if (commandId.equals("makeBuilder") || commandId.equals("all")) { //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
builderParsers.put(label, parserId);
|
||||||
|
}
|
||||||
|
if (commandId.equals("externalScannerInfoProvider") || commandId.equals("all")) { //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
providerParsers.put(label, parserId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt..dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
public void performApply(IProgressMonitor monitor) throws CoreException {
|
||||||
|
// install/deinstall the scanner configuration builder
|
||||||
|
IProject project = getContainer().getProject();
|
||||||
|
IScannerConfigBuilderInfo buildInfo;
|
||||||
|
if (project != null) {
|
||||||
|
if (autoDiscovery.getSelection()) {
|
||||||
|
ScannerConfigNature.addScannerConfigNature(project);
|
||||||
|
buildInfo = MakeCorePlugin.createScannerConfigBuildInfo(project, ScannerConfigBuilder.BUILDER_ID);
|
||||||
|
buildInfo.setAutoDiscoveryEnabled(autoDiscovery.getSelection());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ScannerConfigNature.removeScannerConfigNature(project);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buildInfo = MakeCorePlugin.createScannerConfigBuildInfo(getContainer().getPreferences(), ScannerConfigBuilder.BUILDER_ID, false);
|
||||||
|
buildInfo.setAutoDiscoveryEnabled(autoDiscovery.getSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
buildInfo.setMakeBuilderConsoleParserEnabled(enableBuilderParser());
|
||||||
|
if (enableBuilderParser()) {
|
||||||
|
buildInfo.setMakeBuilderConsoleParserId(
|
||||||
|
(String)builderParsers.get(makeBuilderSIParserComboBox.getText()));
|
||||||
|
}
|
||||||
|
|
||||||
|
buildInfo.setESIProviderCommandEnabled(enableProviderCommand());
|
||||||
|
if (enableProviderCommand()) {
|
||||||
|
buildInfo.setUseDefaultESIProviderCmd(useDefaultESIProviderCmd());
|
||||||
|
if (!useDefaultESIProviderCmd()) {
|
||||||
|
String esiProviderLine = getSIProviderCommandLine();
|
||||||
|
int start = 0;
|
||||||
|
int end = -1;
|
||||||
|
if (esiProviderLine.startsWith("\"")) { //$NON-NLS-1$
|
||||||
|
start = 1;
|
||||||
|
end = esiProviderLine.indexOf('"', 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
end = esiProviderLine.indexOf(' ');
|
||||||
|
}
|
||||||
|
IPath path;
|
||||||
|
if (end == -1) {
|
||||||
|
path = new Path(esiProviderLine);
|
||||||
|
} else {
|
||||||
|
path = new Path(esiProviderLine.substring(start, end));
|
||||||
|
}
|
||||||
|
buildInfo.setESIProviderCommand(path);
|
||||||
|
String args = ""; //$NON-NLS-1$
|
||||||
|
if (end != -1) {
|
||||||
|
args = esiProviderLine.substring(end + 1);
|
||||||
|
}
|
||||||
|
buildInfo.setESIProviderArguments(args);
|
||||||
|
}
|
||||||
|
buildInfo.setESIProviderConsoleParserId(
|
||||||
|
(String)providerParsers.get(esiProviderParserComboBox.getText()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
|
||||||
|
*/
|
||||||
|
public void performDefaults() {
|
||||||
|
IScannerConfigBuilderInfo buildInfo;
|
||||||
|
// Populate with the default value
|
||||||
|
if (getContainer().getProject() != null) {
|
||||||
|
// get the preferences
|
||||||
|
buildInfo = MakeCorePlugin.createScannerConfigBuildInfo(getContainer().getPreferences(),
|
||||||
|
ScannerConfigBuilder.BUILDER_ID, false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// get the defaults
|
||||||
|
buildInfo = MakeCorePlugin.createScannerConfigBuildInfo(getContainer().getPreferences(),
|
||||||
|
ScannerConfigBuilder.BUILDER_ID, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
autoDiscovery.setSelection(buildInfo.isAutoDiscoveryEnabled());
|
||||||
|
|
||||||
|
enableBuilderParserButton.setSelection(buildInfo.isMakeBuilderConsoleParserEnabled());
|
||||||
|
String builderParserId = buildInfo.getMakeBuilderConsoleParserId();
|
||||||
|
for (Iterator i = builderParsers.keySet().iterator(); i.hasNext(); ) {
|
||||||
|
String builderParser = (String) i.next();
|
||||||
|
if (builderParserId.equals((String) builderParsers.get(builderParser))) {
|
||||||
|
makeBuilderSIParserComboBox.setText(builderParser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enableProviderCommandButton.setSelection(buildInfo.isESIProviderCommandEnabled());
|
||||||
|
defESIProviderCommandButton.setSelection(buildInfo.isDefaultESIProviderCmd());
|
||||||
|
IPath sCommand = fBuildInfo.getESIProviderCommand();
|
||||||
|
if (sCommand != null) {
|
||||||
|
StringBuffer cmd = new StringBuffer(sCommand.toOSString());
|
||||||
|
String args = buildInfo.getESIProviderArguments();
|
||||||
|
if (args != null && !args.equals("")) { //$NON-NLS-1$
|
||||||
|
cmd.append(' ');
|
||||||
|
cmd.append(args);
|
||||||
|
}
|
||||||
|
esiProviderCommand.setText(cmd.toString());
|
||||||
|
}
|
||||||
|
enableProviderCommandButton.setSelection(buildInfo.isESIProviderCommandEnabled());
|
||||||
|
String providerParserId = buildInfo.getESIProviderConsoleParserId();
|
||||||
|
for (Iterator i = providerParsers.keySet().iterator(); i.hasNext(); ) {
|
||||||
|
String providerParser = (String) i.next();
|
||||||
|
if (providerParserId.equals((String) providerParsers.get(providerParser))) {
|
||||||
|
esiProviderParserComboBox.setText(providerParser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// enable controls according to Auto Discovery button selection
|
||||||
|
enableAllControls(enableAutoDiscovery());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
Composite composite = ControlFactory.createComposite(parent, 1);
|
||||||
|
setControl(composite);
|
||||||
|
|
||||||
|
if (addTitle) {
|
||||||
|
addTitle(composite);
|
||||||
|
}
|
||||||
|
addSCDiscoveryState(composite);
|
||||||
|
addSeparator(composite);
|
||||||
|
createBuildOutputParserControls(composite);
|
||||||
|
createAfterBuildCmdControls(composite);
|
||||||
|
// enable controls depending on the state of auto discovery
|
||||||
|
enableAllControls(enableAutoDiscovery());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addTitle(Composite composite) {
|
||||||
|
//Label for dialog title
|
||||||
|
Label pathLabel = ControlFactory.createLabel(composite,
|
||||||
|
MakeUIPlugin.getResourceString(DESC));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addSCDiscoveryState(Composite parent) {
|
||||||
|
//Checkbox for enabling the discovery
|
||||||
|
ControlFactory.insertSpace(parent, 1, 10);
|
||||||
|
autoDiscovery = ControlFactory.createCheckBox(parent,
|
||||||
|
MakeUIPlugin.getResourceString(ACTIVATE_AUTO_DISCOVERY));
|
||||||
|
autoDiscovery.setSelection(fBuildInfo.isAutoDiscoveryEnabled());
|
||||||
|
autoDiscovery.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
enableAllControls(enableAutoDiscovery());
|
||||||
|
getContainer().updateContainer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param enable
|
||||||
|
*/
|
||||||
|
private void enableAllControls(boolean enable) {
|
||||||
|
enableBuilderParserButton.setEnabled(enable);
|
||||||
|
makeBuilderSIParserComboBox.setEnabled(enable && enableBuilderParser());
|
||||||
|
enableProviderCommandButton.setEnabled(enable);
|
||||||
|
defESIProviderCommandButton.setEnabled(enable && enableProviderCommand());
|
||||||
|
esiProviderCommand.setEnabled(enable && enableProviderCommand() && !useDefaultESIProviderCmd());
|
||||||
|
esiProviderParserComboBox.setEnabled(enable && enableProviderCommand());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addSeparator(Composite parent) {
|
||||||
|
Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
|
||||||
|
GridData gridData = new GridData();
|
||||||
|
gridData.horizontalAlignment = GridData.FILL;
|
||||||
|
gridData.grabExcessHorizontalSpace = true;
|
||||||
|
separator.setLayoutData(gridData);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createBuildOutputParserControls(Composite parent) {
|
||||||
|
// ControlFactory.insertSpace(parent, 1, 10);
|
||||||
|
Group bopGroup = ControlFactory.createGroup(parent,
|
||||||
|
MakeUIPlugin.getResourceString(SI_BUILD_PARSER_GROUP), 2);
|
||||||
|
((GridLayout)bopGroup.getLayout()).marginHeight = 5;
|
||||||
|
((GridLayout)bopGroup.getLayout()).marginWidth = 5;
|
||||||
|
((GridData)bopGroup.getLayoutData()).verticalAlignment = GridData.FILL;
|
||||||
|
|
||||||
|
enableBuilderParserButton = ControlFactory.createCheckBox(bopGroup,
|
||||||
|
MakeUIPlugin.getResourceString(ENABLE_SI_BUILD_PARSER));
|
||||||
|
((GridData)enableBuilderParserButton.getLayoutData()).horizontalSpan = 2;
|
||||||
|
boolean enabledBuilderParser = fBuildInfo.isMakeBuilderConsoleParserEnabled();
|
||||||
|
enableBuilderParserButton.setSelection(enabledBuilderParser);
|
||||||
|
enableBuilderParserButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
makeBuilderSIParserComboBox.setEnabled(enableBuilderParser());
|
||||||
|
getContainer().updateContainer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Label label = ControlFactory.createLabel(bopGroup,
|
||||||
|
MakeUIPlugin.getResourceString(SI_BUILD_PARSER_LABEL));
|
||||||
|
((GridData)label.getLayoutData()).grabExcessHorizontalSpace = false;
|
||||||
|
|
||||||
|
makeBuilderSIParserComboBox = new Combo(bopGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
|
||||||
|
|
||||||
|
// fill the combobox and set the initial value
|
||||||
|
Iterator items = builderParsers.keySet().iterator();
|
||||||
|
while (items.hasNext()) {
|
||||||
|
String parser = (String) items.next();
|
||||||
|
makeBuilderSIParserComboBox.add(parser);
|
||||||
|
if (initialBuilderParserId.equals(builderParsers.get(parser))) {
|
||||||
|
makeBuilderSIParserComboBox.setText(parser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
makeBuilderSIParserComboBox.setEnabled(enabledBuilderParser);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createAfterBuildCmdControls(Composite parent) {
|
||||||
|
Group abcGroup = ControlFactory.createGroup(parent,
|
||||||
|
MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_GROUP), 2);
|
||||||
|
((GridData)abcGroup.getLayoutData()).horizontalSpan = 2;
|
||||||
|
|
||||||
|
enableProviderCommandButton = ControlFactory.createCheckBox(abcGroup,
|
||||||
|
MakeUIPlugin.getResourceString(ENABLE_SI_PROVIDER_COMMAND));
|
||||||
|
((GridData)enableProviderCommandButton.getLayoutData()).horizontalSpan = 2;
|
||||||
|
((GridData)enableProviderCommandButton.getLayoutData()).horizontalAlignment = GridData.FILL_HORIZONTAL;
|
||||||
|
boolean enabledProviderCommand = fBuildInfo.isESIProviderCommandEnabled();
|
||||||
|
enableProviderCommandButton.setSelection(enabledProviderCommand);
|
||||||
|
enableProviderCommandButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
defESIProviderCommandButton.setEnabled(enableProviderCommand());
|
||||||
|
esiProviderCommand.setEnabled(enableProviderCommand() && !useDefaultESIProviderCmd());
|
||||||
|
esiProviderParserComboBox.setEnabled(enableProviderCommand());
|
||||||
|
getContainer().updateContainer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
createESIProviderCmdControls(abcGroup);
|
||||||
|
|
||||||
|
Label label = ControlFactory.createLabel(abcGroup,
|
||||||
|
MakeUIPlugin.getResourceString(SI_PROVIDER_PARSER_LABEL));
|
||||||
|
((GridData)label.getLayoutData()).grabExcessHorizontalSpace = false;
|
||||||
|
|
||||||
|
esiProviderParserComboBox = new Combo(abcGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
|
||||||
|
|
||||||
|
// fill the combobox and set the initial value
|
||||||
|
Iterator items = providerParsers.keySet().iterator();
|
||||||
|
while (items.hasNext()) {
|
||||||
|
String parser = (String) items.next();
|
||||||
|
esiProviderParserComboBox.add(parser);
|
||||||
|
if (initialProviderParserId.equals(providerParsers.get(parser))) {
|
||||||
|
esiProviderParserComboBox.setText(parser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defESIProviderCommandButton.setEnabled(enabledProviderCommand);
|
||||||
|
esiProviderCommand.setEnabled(enabledProviderCommand && !useDefaultESIProviderCmd());
|
||||||
|
esiProviderParserComboBox.setEnabled(enabledProviderCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createESIProviderCmdControls(Composite parent) {
|
||||||
|
defESIProviderCommandButton = ControlFactory.createCheckBox(parent,
|
||||||
|
MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_USE_DEFAULT));
|
||||||
|
defESIProviderCommandButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
esiProviderCommand.setEnabled(!useDefaultESIProviderCmd());
|
||||||
|
getContainer().updateContainer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
((GridData) (defESIProviderCommandButton.getLayoutData())).horizontalAlignment = GridData.FILL_HORIZONTAL;
|
||||||
|
((GridData) (defESIProviderCommandButton.getLayoutData())).horizontalSpan = 2;
|
||||||
|
Label label = ControlFactory.createLabel(parent,
|
||||||
|
MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_LABEL));
|
||||||
|
((GridData) (label.getLayoutData())).horizontalAlignment = GridData.BEGINNING;
|
||||||
|
((GridData) (label.getLayoutData())).grabExcessHorizontalSpace = false;
|
||||||
|
esiProviderCommand = ControlFactory.createTextField(parent, SWT.SINGLE | SWT.BORDER);
|
||||||
|
((GridData) (esiProviderCommand.getLayoutData())).horizontalAlignment = GridData.FILL;
|
||||||
|
((GridData) (esiProviderCommand.getLayoutData())).grabExcessHorizontalSpace = true;
|
||||||
|
esiProviderCommand.addListener(SWT.Modify, new Listener() {
|
||||||
|
public void handleEvent(Event e) {
|
||||||
|
getContainer().updateContainer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
IPath sCommand = fBuildInfo.getESIProviderCommand();
|
||||||
|
if (sCommand != null) {
|
||||||
|
StringBuffer cmd = new StringBuffer(sCommand.toOSString());
|
||||||
|
String args = fBuildInfo.getESIProviderArguments();
|
||||||
|
if (args != null && args.length() > 0) {
|
||||||
|
cmd.append(' ');
|
||||||
|
cmd.append(args);
|
||||||
|
}
|
||||||
|
esiProviderCommand.setText(cmd.toString());
|
||||||
|
}
|
||||||
|
if (fBuildInfo.isDefaultESIProviderCmd()) {
|
||||||
|
esiProviderCommand.setEnabled(false);
|
||||||
|
}
|
||||||
|
defESIProviderCommandButton.setSelection(fBuildInfo.isDefaultESIProviderCmd());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.dialogs.IDialogPage#getErrorMessage()
|
||||||
|
*/
|
||||||
|
public String getErrorMessage() {
|
||||||
|
if (!useDefaultESIProviderCmd()) {
|
||||||
|
String cmd = getSIProviderCommandLine();
|
||||||
|
if (cmd == null || cmd.length() == 0) {
|
||||||
|
return MakeUIPlugin.getResourceString(SI_PROVIDER_CMD_ERROR_MESSAGE);
|
||||||
|
// return "Must enter a 'generate scanner info' command"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.getErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean enableAutoDiscovery() {
|
||||||
|
return autoDiscovery.getSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean useDefaultESIProviderCmd() {
|
||||||
|
return defESIProviderCommandButton.getSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getSIProviderCommandLine() {
|
||||||
|
return esiProviderCommand.getText().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean enableBuilderParser() {
|
||||||
|
return enableBuilderParserButton.getSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean enableProviderCommand() {
|
||||||
|
return enableProviderCommandButton.getSelection();
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,8 +5,9 @@ package org.eclipse.cdt.make.ui.wizards;
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||||
import org.eclipse.cdt.make.internal.ui.MakeProjectOptionBlock;
|
import org.eclipse.cdt.make.internal.ui.MakeProjectOptionBlock;
|
||||||
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
|
import org.eclipse.cdt.make.ui.dialogs.ScannerConfigPage;
|
||||||
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
|
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
|
||||||
import org.eclipse.cdt.ui.dialogs.ReferenceBlock;
|
import org.eclipse.cdt.ui.dialogs.ReferenceBlock;
|
||||||
import org.eclipse.cdt.ui.dialogs.TabFolderOptionBlock;
|
import org.eclipse.cdt.ui.dialogs.TabFolderOptionBlock;
|
||||||
|
@ -40,6 +41,7 @@ public class MakeProjectWizardOptionPage extends NewCProjectWizardOptionPage {
|
||||||
protected void addTabs() {
|
protected void addTabs() {
|
||||||
addTab(new ReferenceBlock());
|
addTab(new ReferenceBlock());
|
||||||
super.addTabs();
|
super.addTabs();
|
||||||
|
addTab(new ScannerConfigPage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +63,7 @@ public class MakeProjectWizardOptionPage extends NewCProjectWizardOptionPage {
|
||||||
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getPreference()
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getPreference()
|
||||||
*/
|
*/
|
||||||
public Preferences getPreferences() {
|
public Preferences getPreferences() {
|
||||||
return MakeUIPlugin.getDefault().getPluginPreferences();
|
return MakeCorePlugin.getDefault().getPluginPreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue