diff --git a/build/org.eclipse.cdt.managedbuilder.core/plugin.xml b/build/org.eclipse.cdt.managedbuilder.core/plugin.xml
index 9d615cbc091..f6e4a4f0359 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/plugin.xml
+++ b/build/org.eclipse.cdt.managedbuilder.core/plugin.xml
@@ -621,6 +621,14 @@
+
+
+
+
getEnvironmentVariables() {
+ IEnvironmentVariableManager mngr = CCorePlugin.getDefault().getBuildEnvironmentManager();
+ List vars = new ArrayList(Arrays.asList(mngr.getVariables(currentCfgDescription, true)));
+
// On POSIX (Linux, UNIX) systems reset language variables to default (English)
// with UTF-8 encoding since GNU compilers can handle only UTF-8 characters.
// Include paths with locale characters will be handled properly regardless
// of the language as long as the encoding is set to UTF-8.
// English language is set for parser because it relies on English messages
// in the output of the 'gcc -v' command.
+ vars.add(new EnvironmentVariable(ENV_LANGUAGE, "en")); //$NON-NLS-1$
+ vars.add(new EnvironmentVariable(ENV_LC_ALL, "C.UTF-8")); //$NON-NLS-1$
- List envp = new ArrayList(Arrays.asList(BuildRunnerHelper.getEnvp(currentCfgDescription)));
- for (Iterator iterator = envp.iterator(); iterator.hasNext();) {
- String var = iterator.next();
- if (var.startsWith(ENV_LANGUAGE + '=') || var.startsWith(ENV_LC_ALL + '=')) {
- iterator.remove();
- }
+ return vars;
+ }
+
+ /**
+ * Get array of environment variables in format "var=value".
+ */
+ private String[] getEnvp() {
+ EnvironmentCollector collector = new EnvironmentCollector();
+ List vars = getEnvironmentVariables();
+ collector.addVariables(vars.toArray(new IEnvironmentVariable[vars.size()]));
+
+ Set envp = new HashSet();
+ for (IEnvironmentVariable var : collector.getVariables()) {
+ envp.add(var.getName() + '=' + var.getValue());
}
- envp.add(ENV_LANGUAGE + "=en"); // override for GNU gettext //$NON-NLS-1$
- envp.add(ENV_LC_ALL + "=C.UTF-8"); // for other parts of the system libraries //$NON-NLS-1$
-
return envp.toArray(new String[envp.size()]);
}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java
index 57231390965..1727f6e20ed 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java
@@ -49,7 +49,7 @@ public class GCCBuiltinSpecsDetector extends ToolchainBuiltinSpecsDetector imple
};
@Override
- protected String getToolchainId() {
+ public String getToolchainId() {
return GCC_TOOLCHAIN_ID;
}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java
index 0bf78b2ce0f..f7728a1a086 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java
@@ -11,14 +11,22 @@
package org.eclipse.cdt.managedbuilder.language.settings.providers;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
+import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IInputType;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
+import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable;
+import org.eclipse.cdt.managedbuilder.envvar.IConfigurationEnvironmentVariableSupplier;
+import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider;
/**
* Abstract parser capable to execute compiler command printing built-in compiler
@@ -43,7 +51,7 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
* Tool-chain id must be supplied for global providers where we don't
* have configuration description to figure that out programmatically.
*/
- protected abstract String getToolchainId();
+ public abstract String getToolchainId();
/**
* Finds a tool handling given language in the tool-chain of the provider.
@@ -109,4 +117,22 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
return ext;
}
+ @Override
+ protected List getEnvironmentVariables() {
+ List vars = new ArrayList(super.getEnvironmentVariables());
+
+ String toolchainId = getToolchainId();
+ for (IToolChain toolchain = ManagedBuildManager.getExtensionToolChain(toolchainId); toolchain != null; toolchain = toolchain.getSuperClass()) {
+ IConfigurationEnvironmentVariableSupplier envSupplier = toolchain.getEnvironmentVariableSupplier();
+ if (envSupplier != null) {
+ IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(currentCfgDescription);
+ IEnvironmentVariableProvider provider = ManagedBuildManager.getEnvironmentVariableProvider();
+ IBuildEnvironmentVariable[] added = envSupplier.getVariables(cfg, provider);
+ vars.addAll(Arrays.asList(added));
+ break;
+ }
+ }
+
+ return vars;
+ }
}
diff --git a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml
index 202ecf05529..eaa55a1ea6f 100644
--- a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml
+++ b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml
@@ -1842,7 +1842,7 @@
configurationEnvironmentSupplier="org.eclipse.cdt.managedbuilder.gnu.mingw.MingwEnvironmentVariableSupplier"
id="cdt.managedbuild.toolchain.gnu.mingw.base"
isToolChainSupported="org.eclipse.cdt.managedbuilder.gnu.mingw.MingwIsToolChainSupported"
- languageSettingsProviders="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser;org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector"
+ languageSettingsProviders="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser;org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW"
name="%ToolChainName.MinGW"
osList="win32"
targetTool="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base;cdt.managedbuild.tool.gnu.c.linker.mingw.base;cdt.managedbuild.tool.gnu.archiver">
diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/language/settings/providers/BuiltinSpecsDetectorOptionPage.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/language/settings/providers/BuiltinSpecsDetectorOptionPage.java
index bb8d0062a53..9e89aef3315 100644
--- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/language/settings/providers/BuiltinSpecsDetectorOptionPage.java
+++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/language/settings/providers/BuiltinSpecsDetectorOptionPage.java
@@ -11,14 +11,21 @@
package org.eclipse.cdt.managedbuilder.internal.ui.language.settings.providers;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider;
+import org.eclipse.cdt.internal.ui.newui.StatusMessageLine;
+import org.eclipse.cdt.managedbuilder.core.IToolChain;
+import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.ui.Messages;
import org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector;
+import org.eclipse.cdt.managedbuilder.language.settings.providers.ToolchainBuiltinSpecsDetector;
+import org.eclipse.cdt.managedbuilder.ui.properties.ManagedBuilderUIPlugin;
import org.eclipse.cdt.ui.language.settings.providers.AbstractLanguageSettingProviderOptionPage;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
@@ -43,6 +50,8 @@ public final class BuiltinSpecsDetectorOptionPage extends AbstractLanguageSettin
private Text inputCommand;
private Button allocateConsoleCheckBox;
+ private StatusMessageLine fStatusLine;
+
@Override
public void createControl(Composite parent) {
fEditable = parent.isEnabled();
@@ -52,6 +61,7 @@ public final class BuiltinSpecsDetectorOptionPage extends AbstractLanguageSettin
createCompilerCommandInputControl(composite, provider);
createBrowseButton(composite);
createConsoleCheckbox(composite, provider);
+ createStatusLine(composite, provider);
setControl(composite);
}
@@ -157,6 +167,25 @@ public final class BuiltinSpecsDetectorOptionPage extends AbstractLanguageSettin
});
}
+ /**
+ * Create status line to display messages for user.
+ */
+ private void createStatusLine(Composite composite, AbstractBuiltinSpecsDetector provider) {
+ fStatusLine = new StatusMessageLine(composite, SWT.LEFT, 2);
+
+ if (provider instanceof ToolchainBuiltinSpecsDetector) {
+ String toolchainId = ((ToolchainBuiltinSpecsDetector) provider).getToolchainId();
+ IToolChain toolchain = ManagedBuildManager.getExtensionToolChain(toolchainId);
+ if (toolchain == null) {
+ fStatusLine.setErrorStatus(new Status(IStatus.ERROR, ManagedBuilderUIPlugin.getUniqueIdentifier(),
+ IStatus.ERROR, "Toolchain support for CDT is not installed. Toolchain id=[" + toolchainId + "].", null));
+ } else if (!toolchain.isSupported()) {
+ fStatusLine.setErrorStatus(new Status(IStatus.INFO, ManagedBuilderUIPlugin.getUniqueIdentifier(), IStatus.INFO,
+ "Toolchain " + toolchain.getName() + " is not detected on this system.", null));
+ }
+ }
+ }
+
@Override
public void performApply(IProgressMonitor monitor) throws CoreException {
ILanguageSettingsProvider provider = providerTab.getProvider(providerId);
diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ManagedBuilderUIPlugin.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ManagedBuilderUIPlugin.java
index fab15867220..c22bc8b106a 100644
--- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ManagedBuilderUIPlugin.java
+++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ManagedBuilderUIPlugin.java
@@ -37,7 +37,7 @@ public class ManagedBuilderUIPlugin extends AbstractUIPlugin {
// super();
plugin = this;
}
-
+
/**
* @return
@@ -100,7 +100,7 @@ public class ManagedBuilderUIPlugin extends AbstractUIPlugin {
message = null;
}
} else {
- status = new Status(IStatus.ERROR, ManagedBuilderUIPlugin.getUniqueIdentifier(), -1, "Internal Error: ", t); //$NON-NLS-1$
+ status = new Status(IStatus.ERROR, ManagedBuilderUIPlugin.getUniqueIdentifier(), -1, "Internal Error: ", t); //$NON-NLS-1$
}
ErrorDialog.openError(shell, title, message, status);
}
@@ -114,7 +114,7 @@ public class ManagedBuilderUIPlugin extends AbstractUIPlugin {
}
/**
- * Answers the Shell
associated with the active workbench, or
+ * Answers the Shell
associated with the active workbench, or
* one of the windows associated with the workbench.
* @return
*/
@@ -126,6 +126,6 @@ public class ManagedBuilderUIPlugin extends AbstractUIPlugin {
return windows[0].getShell();
}
}
-
+
}
diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/EnvVarOperationProcessor.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/EnvVarOperationProcessor.java
index 895faf24fde..e2594ddcdfa 100644
--- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/EnvVarOperationProcessor.java
+++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/EnvVarOperationProcessor.java
@@ -20,21 +20,21 @@ import org.eclipse.cdt.internal.core.envvar.EnvironmentVariableManager;
/**
- * This is an utility class that implements environment variable operations
+ * This is an utility class that implements environment variable operations
* functionality: append, prepend, replace and remove
- *
+ *
* @since 3.0
*/
public class EnvVarOperationProcessor {
/**
* performs the environment variable operation given an initial variable and
* a variable representing an operation to be performed
- * Returns a new variable the represents the result of a performed operation
- *
+ * Returns a new variable the represents the result of a performed operation
+ *
* @param initial the initial variable
* @param added the variable that specifies an operation to be performed on the
- * initial variable value
- * @return the new variable the represents the result of a performed operation
+ * initial variable value
+ * @return the new variable the represents the result of a performed operation
*/
static public IEnvironmentVariable performOperation(IEnvironmentVariable initial, IEnvironmentVariable added){
if(initial == null){
@@ -42,9 +42,9 @@ public class EnvVarOperationProcessor {
}
if(added == null)
return initial;
-
+
String name = added.getName();
-
+
switch(added.getOperation()){
case IEnvironmentVariable.ENVVAR_REMOVE:
return new EnvironmentVariable(name,null,IEnvironmentVariable.ENVVAR_REMOVE,null);
@@ -82,24 +82,24 @@ public class EnvVarOperationProcessor {
return addValue;
if(addValue == null)
return initialValue;
-
+
if(delimiter == null || "".equals(delimiter)){ //$NON-NLS-1$
return prepend ? addValue + initialValue : initialValue + addValue;
}
-
+
List value = convertToList(initialValue, delimiter);
List added = convertToList(addValue, delimiter);
value = removeDuplicates(value, added);
-
+
if(prepend)
value.addAll(0,added);
else
value.addAll(added);
-
+
return convertToString(value, delimiter);
}
-
+
/**
* performs append given an initial String, a string to be appended and a delimiter
* Returns a String representing the result of the operation
@@ -111,7 +111,7 @@ public class EnvVarOperationProcessor {
static public String performAppend(String initialValue, String addValue, String delimiter){
return performAppendPrepend(initialValue,addValue,delimiter,false);
}
-
+
/**
* performs prepend given an initial String, a string to be prepended and a delimiter
* Returns a String representing the result of the operation
@@ -123,7 +123,7 @@ public class EnvVarOperationProcessor {
static public String performPrepend(String initialValue, String addValue, String delimiter){
return performAppendPrepend(initialValue,addValue,delimiter,true);
}
-
+
/**
* performs an environment variable operation
* Returns String representing the result of the operation
@@ -141,7 +141,7 @@ public class EnvVarOperationProcessor {
return performPrepend(initialValue,newValue,delimiter);
case IEnvironmentVariable.ENVVAR_APPEND:
return performAppend(initialValue,newValue,delimiter);
- case IEnvironmentVariable.ENVVAR_REPLACE:
+ case IEnvironmentVariable.ENVVAR_REPLACE:
default:
return initialValue;
}
@@ -175,8 +175,8 @@ public class EnvVarOperationProcessor {
return list;
}
-
- /*
+
+ /**
* removes duplicates
*/
static public List removeDuplicates(List value, List duplicates){
@@ -198,7 +198,7 @@ public class EnvVarOperationProcessor {
}
return list;
}
-
+
/**
* Converts list to a single String using a given delimiter to separate
* the list value in the resulting String
@@ -209,18 +209,18 @@ public class EnvVarOperationProcessor {
static public String convertToString(List list, String delimiter){
Iterator iter = list.iterator();
StringBuffer buffer = new StringBuffer();
-
+
while(iter.hasNext()){
buffer.append(iter.next());
-
+
if(iter.hasNext())
buffer.append(delimiter);
}
-
+
return buffer.toString();
}
-
- /*
+
+ /**
* normalizes the variable name. That is: removes prepended and appended spaces
* and converts the name to upper-case for Win32 systems
* @return the normalized name or null
in case the name is not valid
@@ -234,12 +234,12 @@ public class EnvVarOperationProcessor {
name = name.toUpperCase();
return name;
}
-
+
static public IEnvironmentVariable[] filterVariables(IEnvironmentVariable variables[], String remove[]){
-
+
if(variables == null || variables.length == 0)
return variables;
-
+
IEnvironmentVariable filtered[] = new IEnvironmentVariable[variables.length];
int filteredNum = 0;
for (IEnvironmentVariable var : variables) {
diff --git a/xlc/org.eclipse.cdt.managedbuilder.xlc.core/src/org/eclipse/cdt/managedbuilder/xlc/core/XlcBuiltinSpecsDetector.java b/xlc/org.eclipse.cdt.managedbuilder.xlc.core/src/org/eclipse/cdt/managedbuilder/xlc/core/XlcBuiltinSpecsDetector.java
index fe92bbb5839..71c66643a3b 100644
--- a/xlc/org.eclipse.cdt.managedbuilder.xlc.core/src/org/eclipse/cdt/managedbuilder/xlc/core/XlcBuiltinSpecsDetector.java
+++ b/xlc/org.eclipse.cdt.managedbuilder.xlc.core/src/org/eclipse/cdt/managedbuilder/xlc/core/XlcBuiltinSpecsDetector.java
@@ -51,7 +51,7 @@ public class XlcBuiltinSpecsDetector extends ToolchainBuiltinSpecsDetector imple
};
@Override
- protected String getToolchainId() {
+ public String getToolchainId() {
return XLC_TOOLCHAIN_ID;
}