diff --git a/build/org.eclipse.cdt.make.core/schema/ScannerConfigurationDiscoveryProfile.exsd b/build/org.eclipse.cdt.make.core/schema/ScannerConfigurationDiscoveryProfile.exsd index e0604e8ec12..5184132ee39 100644 --- a/build/org.eclipse.cdt.make.core/schema/ScannerConfigurationDiscoveryProfile.exsd +++ b/build/org.eclipse.cdt.make.core/schema/ScannerConfigurationDiscoveryProfile.exsd @@ -100,6 +100,15 @@ + + + + Comma separated list of compiler commands to use for detecting lines with preprocessor options. + +Example: "gcc, g++, cc, c++" + + + diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/AbstractGCCBOPConsoleParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/AbstractGCCBOPConsoleParser.java index 44d600dc24b..afa509fb401 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/AbstractGCCBOPConsoleParser.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/AbstractGCCBOPConsoleParser.java @@ -13,6 +13,9 @@ package org.eclipse.cdt.make.internal.core.scannerconfig.gnu; import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector; import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser; import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil; +import org.eclipse.cdt.make.internal.core.scannerconfig2.SCProfileInstance; +import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager; +import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfile.BuildOutputProvider; import org.eclipse.core.resources.IProject; /** @@ -21,6 +24,10 @@ import org.eclipse.core.resources.IProject; * @author vhirsl */ public abstract class AbstractGCCBOPConsoleParser implements IScannerInfoConsoleParser { + private static final String[] COMPILER_INVOCATION = { + "gcc", "g++", "cc", "c++" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + }; + private IProject project; private IScannerInfoCollector collector; @@ -45,6 +52,30 @@ public abstract class AbstractGCCBOPConsoleParser implements IScannerInfoConsole this.collector = collector; } + /** + * Returns array of additional compiler commands to look for + * + * @return String[] + */ + public String[] getCompilerCommands() { + SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance(). + getSCProfileInstance(project, ScannerConfigProfileManager.NULL_PROFILE_ID); + BuildOutputProvider boProvider = profileInstance.getProfile().getBuildOutputProviderElement(); + if (boProvider != null) { + String compilerCommandsString = boProvider.getScannerInfoConsoleParser().getCompilerCommands(); + if (compilerCommandsString != null && compilerCommandsString.length() > 0) { + String[] compilerCommands = compilerCommandsString.split(",\\s+"); //$NON-NLS-1$ + if (compilerCommands.length > 0) { + String[] compilerInvocation = new String[COMPILER_INVOCATION.length + compilerCommands.length]; + System.arraycopy(COMPILER_INVOCATION, 0, compilerInvocation, 0, COMPILER_INVOCATION.length); + System.arraycopy(compilerCommands, 0, compilerInvocation, COMPILER_INVOCATION.length, compilerCommands.length); + return compilerInvocation; + } + } + } + return COMPILER_INVOCATION; + } + /* (non-Javadoc) * @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#processLine(java.lang.String) */ diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java index a12df6b7e34..e2c8290d047 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCPerFileBOPConsoleParser.java @@ -35,11 +35,9 @@ public class GCCPerFileBOPConsoleParser extends AbstractGCCBOPConsoleParser { private final static String[] FILE_EXTENSIONS = { ".c", ".cc", ".cpp", ".cxx", ".C", ".CC", ".CPP", ".CXX" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ }; - private final static String[] COMPILER_INVOCATION = { - "gcc", "g++", "cc", "c++" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - }; private final static List FILE_EXTENSIONS_LIST = Arrays.asList(FILE_EXTENSIONS); + private String[] compilerInvocation; private GCCPerFileBOPConsoleParserUtility fUtil; /* (non-Javadoc) @@ -49,6 +47,9 @@ public class GCCPerFileBOPConsoleParser extends AbstractGCCBOPConsoleParser { fUtil = (project != null && workingDirectory != null && markerGenerator != null) ? new GCCPerFileBOPConsoleParserUtility(project, workingDirectory, markerGenerator) : null; super.startup(project, collector); + + // check additional compiler commands from extension point manifest + compilerInvocation = getCompilerCommands(); } /* (non-Javadoc) @@ -65,8 +66,8 @@ public class GCCPerFileBOPConsoleParser extends AbstractGCCBOPConsoleParser { boolean rc = false; // GCC C/C++ compiler invocation int compilerInvocationIndex = -1; - for (int cii = 0; cii < COMPILER_INVOCATION.length; ++cii) { - compilerInvocationIndex = line.indexOf(COMPILER_INVOCATION[cii]); + for (int cii = 0; cii < compilerInvocation.length; ++cii) { + compilerInvocationIndex = line.indexOf(compilerInvocation[cii]); if (compilerInvocationIndex != -1) break; } @@ -78,8 +79,8 @@ public class GCCPerFileBOPConsoleParser extends AbstractGCCBOPConsoleParser { String command = split[0]; // verify that it is compiler invocation int cii2 = -1; - for (int cii = 0; cii < COMPILER_INVOCATION.length; ++cii) { - cii2 = command.indexOf(COMPILER_INVOCATION[cii]); + for (int cii = 0; cii < compilerInvocation.length; ++cii) { + cii2 = command.indexOf(compilerInvocation[cii]); if (cii2 != -1) break; } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java index 736b5eccefb..5d3eeb5e28d 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java @@ -36,7 +36,9 @@ public class GCCScannerInfoConsoleParser extends AbstractGCCBOPConsoleParser { private final static String DOUBLE_QUOTE_STRING = "\""; //$NON-NLS-1$ private final static char[] matchingChars = {'`', '\'', '\"'}; - private ScannerInfoConsoleParserUtility fUtil = null; + private String[] compilerInvocation; + + private ScannerInfoConsoleParserUtility fUtil = null; /* (non-Javadoc) * @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#startup(org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IPath, org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector, org.eclipse.cdt.core.IMarkerGenerator) @@ -45,6 +47,9 @@ public class GCCScannerInfoConsoleParser extends AbstractGCCBOPConsoleParser { fUtil = (project != null && workingDirectory != null && markerGenerator != null) ? new ScannerInfoConsoleParserUtility(project, workingDirectory, markerGenerator) : null; super.startup(project, collector); + + // check additional compiler commands from extension point manifest + compilerInvocation = getCompilerCommands(); } /* (non-Javadoc) @@ -67,7 +72,15 @@ public class GCCScannerInfoConsoleParser extends AbstractGCCBOPConsoleParser { return false; Iterator I = allTokens.iterator(); String token = ((String) I.next()).toLowerCase(); - if (token.indexOf("gcc") != -1 || token.indexOf("g++") != -1) {//$NON-NLS-1$ //$NON-NLS-2$ + + boolean found = false; + for (int i = 0; i < compilerInvocation.length; i++) { + if (token.indexOf(compilerInvocation[i]) != -1) { + found = true; + break; + } + } + if (found) { // Recognized gcc or g++ compiler invocation List includes = new ArrayList(); List symbols = new ArrayList(); diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCProfileInstance.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCProfileInstance.java index 758bbd2cfd7..7401c27ac08 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCProfileInstance.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCProfileInstance.java @@ -48,7 +48,7 @@ public class SCProfileInstance { collector = createScannerInfoCollector(); if (collector != null) { // call collector.setProject(project) if class supports it - Class clazz = (Class) collector.getClass(); + Class clazz = collector.getClass(); try { Method setProjectMethod = clazz.getMethod("setProject", new Class[] {IProject.class});//$NON-NLS-1$ setProjectMethod.invoke(collector, new Object[] {project}); diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfile.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfile.java index 253fb83f507..2fb0981c4f7 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfile.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfile.java @@ -75,6 +75,9 @@ public class ScannerConfigProfile { return null; } } + public String getCompilerCommands() { + return configElem.getAttribute("compilerCommands"); //$NON-NLS-1$ + } } /** * tag interface, a placeholder for either run or open element @@ -242,12 +245,10 @@ public class ScannerConfigProfile { * loads the profile from the manifest file. */ private void load() { - String[] empty = new String[0]; IExtensionPoint extension = Platform.getExtensionRegistry(). getExtensionPoint(MakeCorePlugin.PLUGIN_ID, ScannerConfigProfileManager.SI_PROFILE_SIMPLE_ID); if (extension != null) { IExtension[] extensions = extension.getExtensions(); - List rProfileIds = new ArrayList(extensions.length); for (int i = 0; i < extensions.length; ++i) { String rProfileId = extensions[i].getUniqueIdentifier(); if (rProfileId != null && rProfileId.equals(getId())) { diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfileManager.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfileManager.java index f80f12451fe..9ed8705bea6 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfileManager.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/ScannerConfigProfileManager.java @@ -126,7 +126,6 @@ public class ScannerConfigProfileManager { getExtensionPoint(MakeCorePlugin.PLUGIN_ID, ScannerConfigProfileManager.SI_PROFILE_SIMPLE_ID); if (extension != null) { IExtension[] extensions = extension.getExtensions(); - List rProfileIds = new ArrayList(extensions.length); for (int i = 0; i < extensions.length; ++i) { String rProfileId = extensions[i].getUniqueIdentifier(); profileIds.add(rProfileId);