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 163e22a088d..d07d225b8cc 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 @@ -74,7 +74,7 @@ public class GCCBuiltinSpecsDetector extends ToolchainBuiltinSpecsDetector imple @Override protected List parseOptions(String line) { line = line.trim(); - + // contribution of -dD option if (line.startsWith("#define")) { return makeList(line); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java index 1a1d3f5b717..b3b2c7de9b3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java @@ -169,6 +169,10 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr entries = fStorage.getSettingEntries(rcProjectPath, null); } } + + if (cfgDescription != null) { + entries = CommandLauncherFactoryManager.getInstance().getLanguageSettingEntries(cfgDescription.getProjectDescription().getProject(), entries); + } return entries; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java index 1338d2b704d..b20ca4b62f3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java @@ -1456,6 +1456,10 @@ public class LanguageSettingsProvidersSerializer { return getSettingEntriesUpResourceTree(provider, cfgDescription, parentFolder, languageId); } // if out of parent resources - get default entries + entries = getSettingEntriesPooled(provider, cfgDescription, null, languageId); + if (entries != null) { + return entries; + } entries = getSettingEntriesPooled(provider, null, null, languageId); if (entries != null) { return entries; diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java index b48b5632eab..a57f929a6dd 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java @@ -212,6 +212,17 @@ public class CommandLauncherFactoryManager { } } + + public List getLanguageSettingEntries(IProject project, List entries) { + List verifiedEntries = entries; + for (ICommandLauncherFactory factory : factories) { + ICommandLauncher launcher = factory.getCommandLauncher(project); + if (launcher != null) { + verifiedEntries = factory.verifyLanguageSettingEntries(project, entries); + } + } + return verifiedEntries; + } } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java index 91af328ee8d..1eaf567000f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java @@ -33,5 +33,14 @@ public interface ICommandLauncherFactory { * @param entries - List of language setting entries */ public void registerLanguageSettingEntries(IProject project, List entries); + + /** + * Verify language setting entries for a project and change any entries that + * have been copied to a local location + * @param project - IProject used in obtaining language setting entries + * @param entries - List of language setting entries + * @return modified List of language setting entries + */ + public List verifyLanguageSettingEntries(IProject project, List entries); } diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java index 3205081131c..1df8ebe8f13 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java @@ -12,10 +12,12 @@ package org.eclipse.cdt.docker.launcher; import java.util.ArrayList; import java.util.List; +import java.util.Set; import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.ICommandLauncherFactory; import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICIncludePathEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; @@ -58,7 +60,9 @@ public class ContainerCommandLauncherFactory @Override public void registerLanguageSettingEntries(IProject project, - List entries) { + List langEntries) { + @SuppressWarnings("unchecked") + List entries = (List) langEntries; ICConfigurationDescription cfgd = CoreModel.getDefault() .getProjectDescription(project).getActiveConfiguration(); IConfiguration cfg = ManagedBuildManager @@ -88,14 +92,14 @@ public class ContainerCommandLauncherFactory List paths = new ArrayList<>(); for (ICLanguageSettingEntry entry : entries) { if (entry instanceof ICIncludePathEntry) { - String path = entry.getValue(); - paths.add(path); + paths.add(entry.getValue()); } } if (paths.size() > 0) { IPath pluginPath = Platform.getStateLocation(Platform .getBundle(DockerLaunchUIPlugin.PLUGIN_ID)); IPath hostDir = pluginPath.append(prefix); + @SuppressWarnings("unused") int status = launcher.fetchContainerDirs(connectionName, imageName, paths, hostDir); @@ -106,6 +110,71 @@ public class ContainerCommandLauncherFactory } + @Override + public List verifyLanguageSettingEntries( + IProject project, List entries) { + if (entries == null) { + return null; + } + ICConfigurationDescription cfgd = CoreModel.getDefault() + .getProjectDescription(project).getActiveConfiguration(); + IConfiguration cfg = ManagedBuildManager + .getConfigurationForDescription(cfgd); + IOptionalBuildProperties props = cfg.getOptionalBuildProperties(); + if (props != null) { + String enablementProperty = props.getProperty( + ContainerCommandLauncher.CONTAINER_BUILD_ENABLED); + if (enablementProperty != null) { + boolean enableContainer = Boolean + .parseBoolean(enablementProperty); + if (enableContainer) { + String connectionName = props.getProperty( + ContainerCommandLauncher.CONNECTION_ID); + String imageName = props + .getProperty(ContainerCommandLauncher.IMAGE_ID); + if (connectionName == null || connectionName.isEmpty() + || imageName == null || imageName.isEmpty()) { + DockerLaunchUIPlugin.logErrorMessage( + Messages.ContainerCommandLauncher_invalid_values); + return entries; + } + + ContainerLauncher launcher = new ContainerLauncher(); + Set copiedVolumes = launcher + .getCopiedVolumes(connectionName, imageName); + List newEntries = new ArrayList<>(); + IPath pluginPath = Platform.getStateLocation( + Platform.getBundle(DockerLaunchUIPlugin.PLUGIN_ID)); + String prefix = getCleanName(connectionName) + + IPath.SEPARATOR + getCleanName(imageName); // $NON-NLS-1$ + IPath hostDir = pluginPath.append(prefix); + + for (ICLanguageSettingEntry entry : entries) { + if (entry instanceof ICIncludePathEntry) { + if (copiedVolumes + .contains(((ICIncludePathEntry) entry) + .getName().toString())) { + // //$NON-NLS-2$ + IPath newPath = hostDir.append(entry.getName()); + CIncludePathEntry newEntry = new CIncludePathEntry( + newPath.toString(), + entry.getFlags()); + newEntries.add(newEntry); + continue; + } else { + newEntries.add(entry); + } + } else { + newEntries.add(entry); + } + } + return newEntries; + } + } + } + return entries; + } + private String getCleanName(String name) { return name.replaceAll("[:/]", "_"); //$NON-NLS-1$ //$NON-NLS-2$ } diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java index 832768ca449..c2dd35b9959 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java @@ -317,20 +317,19 @@ public class ContainerPropertyTab extends AbstractCBuildPropertyTab @Override protected void performOK() { - if (enableButton.getSelection()) { - ICConfigurationDescription cfgd = ManagedBuildManager - .getDescriptionForConfiguration(iCfg); - List providers = ((ILanguageSettingsProvidersKeeper) cfgd) - .getLanguageSettingProviders(); - for (ILanguageSettingsProvider provider : providers) { - if (provider instanceof GCCBuiltinSpecsDetector) { - GCCBuiltinSpecsDetector d = (GCCBuiltinSpecsDetector) provider; - // force recalculation of gcc include path - d.clear(); - d.handleEvent(null); - } + ICConfigurationDescription cfgd = ManagedBuildManager + .getDescriptionForConfiguration(iCfg); + List providers = ((ILanguageSettingsProvidersKeeper) cfgd) + .getLanguageSettingProviders(); + for (ILanguageSettingsProvider provider : providers) { + if (provider instanceof GCCBuiltinSpecsDetector) { + GCCBuiltinSpecsDetector d = (GCCBuiltinSpecsDetector) provider; + // force recalculation of gcc include path + d.clear(); + d.handleEvent(null); } } + super.performOK(); }