diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/BuildSettingsUtil.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/BuildSettingsUtil.java index 5a1df71318c..96e3b97a064 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/BuildSettingsUtil.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/BuildSettingsUtil.java @@ -11,13 +11,30 @@ package org.eclipse.cdt.managedbuilder.internal.core; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.IResourceInfo; import org.eclipse.cdt.managedbuilder.core.ITool; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; +import org.eclipse.cdt.managedbuilder.core.OptionStringValue; public class BuildSettingsUtil { + private static final int[] COMMON_SETTINGS_IDS = new int[]{ + IOption.INCLUDE_PATH, + IOption.PREPROCESSOR_SYMBOLS, + IOption.LIBRARIES, + IOption.OBJECTS, + IOption.INCLUDE_FILES, + IOption.LIBRARY_PATHS, + IOption.LIBRARY_FILES, + IOption.MACRO_FILES, + }; + public static void disconnectDepentents(IConfiguration cfg, ITool[] tools){ for(int i = 0; i < tools.length; i++){ disconnectDepentents(cfg, tools[i]); @@ -74,5 +91,46 @@ public class BuildSettingsUtil { return list; } + public static void copyCommonSettings(ITool fromTool, ITool toTool){ + Tool fromT = (Tool)fromTool; + Tool toT = (Tool)toTool; + List values = new ArrayList(); + for(int i = 0; i < COMMON_SETTINGS_IDS.length; i++){ + int type = COMMON_SETTINGS_IDS[i]; + IOption[] toOptions = toT.getOptionsOfType(type); + if(toOptions.length == 0) + continue; + IOption[] fromOptions = fromT.getOptionsOfType(type); + values.clear(); + for(int k = 0; k < fromOptions.length; k++){ + Option fromOption = (Option)fromOptions[k]; + if(fromOption.getParent() != fromTool) + continue; + + List v = (List)fromOption.getExactValue(); + values.addAll(v); + } + + if(values.size() == 0) + continue; + + IOption toOption = toOptions[0]; + + try { + OptionStringValue[] v = toOption.getBasicStringListValueElements(); + if(v.length != 0) + values.addAll(Arrays.asList(v)); + } catch (BuildException e) { + ManagedBuilderCorePlugin.log(e); + } + + OptionStringValue[] v = (OptionStringValue[])values.toArray(new OptionStringValue[values.size()]); + IResourceInfo rcInfo = toTool.getParentResourceInfo(); + + ManagedBuildManager.setOption(rcInfo, toTool, toOption, v); + + values.clear(); + } + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java index 7f8a2aa39e9..4e0d15e362e 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java @@ -894,11 +894,46 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { newBuilder.copySettings(oldBuilder, false); } - //TODO: copy includes, symbols, etc. + IManagedProject mProj = getParent().getManagedProject(); + ITool[] filteredTools = getFilteredTools(); + ITool[] oldFilteredTools = filterTools(oldTc.getTools(), mProj); + + copySettings(oldFilteredTools, filteredTools); toolChain.propertiesChanged(); } + private void copySettings(ITool[] fromTools, ITool[] toTools){ + ITool[][] matches = getBestMatches(fromTools, toTools); + for(int i = 0; i < matches.length; i++){ + BuildSettingsUtil.copyCommonSettings(matches[i][0], matches[i][1]); + } + } + + private ITool[][] getBestMatches(ITool[] tools1, ITool[] tools2){ + HashSet set = new HashSet(Arrays.asList(tools2)); + List list = new ArrayList(tools1.length); + for(int i = 0; i < tools1.length; i++){ + ITool tool1 = tools1[i]; + ITool bestMatchTool = null; + int num = 0; + for(Iterator iter = set.iterator(); iter.hasNext();){ + ITool tool2 = (ITool)iter.next(); + int extsNum = getConflictingInputExts(tool1, tool2).length; + if(extsNum > num){ + bestMatchTool = tool2; + num = extsNum; + } + } + + if(bestMatchTool != null){ + list.add(new ITool[]{tool1, bestMatchTool}); + set.remove(bestMatchTool); + } + } + return (ITool[][])list.toArray(new ITool[list.size()][]); + } + void updateToolChainWithConverter(ConverterInfo cInfo, String Id, String name) throws BuildException{ IBuildObject bo = cInfo.getConvertedFromObject(); ToolChain updatedToolChain = null;