/*******************************************************************************
* Copyright (c) 2007 Intel Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.internal.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager;
import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
import org.eclipse.cdt.managedbuilder.core.IManagedProject;
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;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
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]);
}
}
public static void disconnectDepentents(IConfiguration cfg, ITool tool){
ITool deps[] = getDependentTools(cfg, tool);
for(int i = 0; i < deps.length; i++){
disconnect(deps[i], tool);
}
}
private static void disconnect(ITool child, ITool superClass){
ITool directChild = child;
for(;directChild != null; directChild = directChild.getSuperClass()){
if(superClass.equals(directChild.getSuperClass()))
break;
}
if(directChild == null)
return;
((Tool)directChild).copyNonoverriddenSettings((Tool)superClass);
((Tool)directChild).setSuperClass(superClass.getSuperClass());
}
public static ITool[] getDependentTools(IConfiguration cfg, ITool tool){
IResourceInfo rcInfos[] = cfg.getResourceInfos();
List<ITool> list = new ArrayList<ITool>();
for(int i = 0; i < rcInfos.length; i++){
calcDependentTools(rcInfos[i], tool, list);
}
return list.toArray(new Tool[list.size()]);
}
private static List<ITool> calcDependentTools(IResourceInfo info, ITool tool, List<ITool> list){
return calcDependentTools(info.getTools(), tool, list);
}
public static List<ITool> calcDependentTools(ITool tools[], ITool tool, List<ITool> list){
if(list == null)
list = new ArrayList<ITool>();
for(int i = 0; i < tools.length; i++){
ITool superTool = tools[i];
for(;superTool != null; superTool = superTool.getSuperClass()){
if(superTool.equals(tool)){
list.add(tools[i]);
}
}
}
return list;
}
public static void copyCommonSettings(ITool fromTool, ITool toTool){
Tool fromT = (Tool)fromTool;
Tool toT = (Tool)toTool;
List<OptionStringValue> values = new ArrayList<OptionStringValue>();
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;
@SuppressWarnings("unchecked")
List<OptionStringValue> v = (List<OptionStringValue>)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 = values.toArray(new OptionStringValue[values.size()]);
IResourceInfo rcInfo = toTool.getParentResourceInfo();
ManagedBuildManager.setOption(rcInfo, toTool, toOption, v);
values.clear();
}
}
public static boolean applyConfiguration(IConfiguration cfg, ICProjectDescription des, boolean force) throws CoreException{
boolean updated = false;
ICConfigurationDescription cfgDes = des.getConfigurationById(cfg.getId());
if(cfgDes == null){
des.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, cfg.getConfigurationData());
updated = true;
} else if(force || cfg.isDirty()){
cfgDes.setConfigurationData(ManagedBuildManager.CFG_DATA_PROVIDER_ID, cfg.getConfigurationData());
updated = true;
}
return updated;
}
public static ICProjectDescription checkSynchBuildInfo(IProject project) throws CoreException {
IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project, false);
if(info == null)
return null;
ICProjectDescription projDes = CoreModel.getDefault().getProjectDescription(project);
projDes = synchBuildInfo(info, projDes, false);
return projDes.isModified() ? projDes : null;
}
public static ICProjectDescription synchBuildInfo(IManagedBuildInfo info, ICProjectDescription projDes, boolean force) throws CoreException {
IManagedProject mProj = info.getManagedProject();
IConfiguration cfgs[] = mProj.getConfigurations();
ICConfigurationDescription cfgDess[] = projDes.getConfigurations();
for(int i = 0; i < cfgs.length; i++){
IConfiguration cfg = cfgs[i];
// try {
applyConfiguration(cfg, projDes, force);
// } catch (CoreException e) {
// }
}
for(int i = 0; i < cfgDess.length; i++){
ICConfigurationDescription cfgDes = cfgDess[i];
IConfiguration cfg = mProj.getConfiguration(cfgDes.getId());
if(cfg == null){
projDes.removeConfiguration(cfgDes);
// mProj.removeConfiguration(cfgDes.getId());
}
}
return projDes;
}
public static void checkApplyDescription(IProject project, ICProjectDescription des) throws CoreException{
checkApplyDescription(project, des, false);
}
public static void checkApplyDescription(IProject project, ICProjectDescription des, boolean avoidSerialization) throws CoreException{
ICConfigurationDescription[] cfgs = des.getConfigurations();
for(int i = 0; i < cfgs.length; i++){
if(!ManagedBuildManager.CFG_DATA_PROVIDER_ID.equals(cfgs[i].getBuildSystemId()))
des.removeConfiguration(cfgs[i]);
}
int flags = 0;
if(avoidSerialization)
flags |= ICProjectDescriptionManager.SET_NO_SERIALIZE;
CoreModel.getDefault().getProjectDescriptionManager().setProjectDescription(project, des, flags, null);
}
public static ITool[] getToolsBySuperClassId(ITool[] tools, String id) {
List<ITool> retTools = new ArrayList<ITool>();
if (id != null) {
for (int i = 0; i < tools.length; i++) {
ITool targetTool = tools[i];
ITool tool = targetTool;
do {
if (id.equals(tool.getId())) {
retTools.add(targetTool);
break;
}
tool = tool.getSuperClass();
} while (tool != null);
}
}
return retTools.toArray( new ITool[retTools.size()]);
}
}