From 40e01a45ced7ea7b875020644d6a744413457f6e Mon Sep 17 00:00:00 2001 From: Mikhail Sennikovsky Date: Thu, 3 May 2007 13:21:12 +0000 Subject: [PATCH] Fix for [Bug 162143] [MBS] Internal builder forgets about deltas when failures occur --- .../buildmodel/BuildDescriptionManager.java | 12 +- .../core/ManagedBuilderCorePlugin.java | 5 + .../internal/buildmodel/BuildDescription.java | 99 ++++++-- .../buildmodel/BuildStateManager.java | 188 +++++++++++++++ .../internal/buildmodel/CommandBuilder.java | 4 +- .../buildmodel/ConfigurationBuildState.java | 215 +++++++++++++++++ .../DefaultBuildDescriptionFactory.java | 11 +- .../buildmodel/DescriptionBuilder.java | 63 ++++- .../buildmodel/IConfigurationBuildState.java | 20 ++ .../buildmodel/IProjectBuildState.java | 23 ++ .../internal/buildmodel/IRebuildState.java | 20 ++ .../IResourceRebuildStateContainer.java | 21 ++ .../buildmodel/ProjectBuildState.java | 222 ++++++++++++++++++ .../internal/buildmodel/StepBuilder.java | 30 ++- .../internal/core/CommonBuilder.java | 15 +- .../core/GeneratedMakefileBuilder.java | 6 +- .../model/CProjectDescriptionEvent.java | 1 - .../settings/model/ICDescriptionDelta.java | 3 +- .../model/CProjectDescriptionDelta.java | 1 + .../model/CProjectDescriptionManager.java | 1 + .../CfgExportSettingContainerFactory.java | 1 + .../SetCProjectDescriptionOperation.java | 1 + .../core/CConfigBasedDescriptorManager.java | 2 +- 23 files changed, 915 insertions(+), 49 deletions(-) create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildStateManager.java create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ConfigurationBuildState.java create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IConfigurationBuildState.java create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IProjectBuildState.java create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IRebuildState.java create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IResourceRebuildStateContainer.java create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ProjectBuildState.java rename core/org.eclipse.cdt.core/model/org/eclipse/cdt/{internal => }/core/settings/model/ICDescriptionDelta.java (93%) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/buildmodel/BuildDescriptionManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/buildmodel/BuildDescriptionManager.java index 6af943954e6..07a5407fb66 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/buildmodel/BuildDescriptionManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/buildmodel/BuildDescriptionManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Intel Corporation and others. + * Copyright (c) 2006, 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 @@ -21,10 +21,9 @@ import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildMultiStatus; import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStatus; import org.eclipse.cdt.managedbuilder.internal.buildmodel.DbgUtil; import org.eclipse.cdt.managedbuilder.internal.buildmodel.DefaultBuildDescriptionFactory; -import org.eclipse.core.resources.IProject; +import org.eclipse.cdt.managedbuilder.internal.buildmodel.IConfigurationBuildState; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; -import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -94,6 +93,13 @@ public class BuildDescriptionManager { int flags) throws CoreException { return DefaultBuildDescriptionFactory.getInstance().createBuildDescription(cfg, delta, flags); } + + static public IBuildDescription createBuildDescription(IConfiguration cfg, + IConfigurationBuildState bs, + IResourceDelta delta, + int flags) throws CoreException { + return DefaultBuildDescriptionFactory.getInstance().createBuildDescription(cfg, bs, delta, flags); + } /** * runs though all steps in build description in the dependency order diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java index f0f53a799f7..ebbc7cc9a65 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java @@ -14,6 +14,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.Map; import org.eclipse.cdt.build.internal.core.scannerconfig.CfgDiscoveredPathManager; +import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStateManager; import org.eclipse.cdt.managedbuilder.internal.buildmodel.DbgUtil; import org.eclipse.cdt.managedbuilder.internal.core.BuilderFactory; import org.eclipse.cdt.managedbuilder.internal.core.GeneratedMakefileBuilder; @@ -97,6 +98,8 @@ public class ManagedBuilderCorePlugin extends Plugin { | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.PRE_CLOSE /*| IResourceChangeEvent.POST_BUILD*/); + + BuildStateManager.getInstance().startup(); /* try { jobManager.beginRule(root, null); @@ -165,6 +168,8 @@ public class ManagedBuilderCorePlugin extends Plugin { * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { + BuildStateManager.getInstance().shutdown(); + CfgDiscoveredPathManager.stop(); // if (fDiscoveryPathManager != null) { // fDiscoveryPathManager.shutdown(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildDescription.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildDescription.java index 161be82f401..8293bceb2a4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildDescription.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildDescription.java @@ -87,6 +87,7 @@ public class BuildDescription implements IBuildDescription { private Configuration fCfg; private IResourceDelta fDelta; + private IConfigurationBuildState fBuildState; private Map fToolToMultiStepMap = new HashMap(); private BuildStep fOrderedMultiActions[]; @@ -235,14 +236,15 @@ public class BuildDescription implements IBuildDescription { IPath rcLocation = rc.getLocation(); if(rcLocation == null){ IPath fullPath = rc.getFullPath(); - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - IProject proj = root.getProject(fullPath.segment(0)); - rcLocation = proj.getLocation(); - if(rcLocation != null){ - rcLocation = rcLocation.append(fullPath.removeFirstSegments(1)); - } else { - rcLocation = root.getLocation().append(fullPath); - } + rcLocation = calcLocationForFullPath(fullPath); +// IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); +// IProject proj = root.getProject(fullPath.segment(0)); +// rcLocation = proj.getLocation(); +// if(rcLocation != null){ +// rcLocation = rcLocation.append(fullPath.removeFirstSegments(1)); +// } else { +// rcLocation = root.getLocation().append(fullPath); +// } } return rcLocation; } @@ -402,7 +404,7 @@ public class BuildDescription implements IBuildDescription { } public BuildDescription(IConfiguration cfg){ - initBase(cfg, null, 0); + initBase(cfg, null, null, 0); } public void synchRebuildState() throws CoreException{ @@ -704,9 +706,10 @@ public class BuildDescription implements IBuildDescription { return (fFlags & flags) == flags; } - protected void initBase(IConfiguration cfg, IResourceDelta delta, int flags){ + protected void initBase(IConfiguration cfg, IConfigurationBuildState bs, IResourceDelta delta, int flags){ fCfg = (Configuration)cfg; fDelta = delta; + fBuildState = bs; fProject = cfg.getOwner().getProject(); fInfo = ManagedBuildManager.getBuildInfo(fProject); fFlags = flags; @@ -726,6 +729,9 @@ public class BuildDescription implements IBuildDescription { if(fCfg.needsFullRebuild()) fInputStep.setRebuildState(true); + if(fBuildState != null && fBuildState.getState() == IRebuildState.NEED_REBUILD) + fInputStep.setRebuildState(true); + initToolInfos(); initMultiSteps(); @@ -742,17 +748,63 @@ public class BuildDescription implements IBuildDescription { visitor.setMode(true); if((checkFlags(BuildDescriptionManager.REMOVED) - || checkFlags(BuildDescriptionManager.REBUILD)) - && fDelta != null) - fDelta.accept(visitor); + || checkFlags(BuildDescriptionManager.REBUILD))){ + if(fDelta != null) + fDelta.accept(visitor); + if(fBuildState != null) + processBuildState(); + } completeLinking(); synchRebuildState(); //TODO: trim(); } - protected void init(IConfiguration cfg, IResourceDelta delta, int flags) throws CoreException { - initBase(cfg, delta, flags); + protected void processBuildState(){ + IPath paths[] = fBuildState.getFullPathsForState(IRebuildState.NEED_REBUILD); + processBuildState(IRebuildState.NEED_REBUILD, paths); + + paths = fBuildState.getFullPathsForState(IRebuildState.REMOVED); + processBuildState(IRebuildState.REMOVED, paths); + } + + protected void processBuildState(int state, IPath fullPaths[]){ + for(int i = 0; i < fullPaths.length; i++){ + processBuildState(state, fullPaths[i]); + } + } + + protected void processBuildState(int state, IPath fullPath){ + BuildResource bRc = (BuildResource)getBuildResourceForFullPath(fullPath); + if(bRc == null) + return; + + if(bRc.getProducerIOType() != null + && bRc.getProducerIOType().getStep() == fInputStep){ + if(state == IRebuildState.REMOVED){ + if(checkFlags(BuildDescriptionManager.REMOVED)){ + bRc.setRemoved(true); + } + } else if (state == IRebuildState.NEED_REBUILD){ + if(checkFlags(BuildDescriptionManager.REBUILD)){ + bRc.setRebuildState(true); + } + } + } else { + if(state == IRebuildState.NEED_REBUILD + || state == IRebuildState.REMOVED + || checkFlags(BuildDescriptionManager.REBUILD)){ + bRc.setRebuildState(true); + IBuildIOType type = bRc.getProducerIOType(); + if(type != null){ + ((BuildStep)type.getStep()).setRebuildState(true); + } + } + } + } + + protected void init(IConfiguration cfg, IConfigurationBuildState bs, IResourceDelta delta, int flags) throws CoreException { + initBase(cfg, bs, delta, flags); initDescription(); } @@ -2085,6 +2137,23 @@ public class BuildDescription implements IBuildDescription { public IBuildResource getBuildResource(IResource resource){ return getBuildResource(calcResourceLocation(resource)); } + + public IBuildResource getBuildResourceForFullPath(IPath fullPath){ + IPath location = calcLocationForFullPath(fullPath); + return getBuildResource(location); + } + + protected IPath calcLocationForFullPath(IPath fullPath){ + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IProject proj = root.getProject(fullPath.segment(0)); + IPath rcLocation = proj.getLocation(); + if(rcLocation != null){ + rcLocation = rcLocation.append(fullPath.removeFirstSegments(1)); + } else { + rcLocation = root.getLocation().append(fullPath); + } + return rcLocation; + } private void initToolInfos(){ fToolInfos = PathSettingsContainer.createRootContainer(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildStateManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildStateManager.java new file mode 100644 index 00000000000..68527d20e1a --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildStateManager.java @@ -0,0 +1,188 @@ +/******************************************************************************* + * 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.buildmodel; + +import java.io.File; + +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; +import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener; +import org.eclipse.cdt.core.settings.model.util.ResourceChangeHandlerBase; +import org.eclipse.cdt.core.settings.model.util.ResourceChangeHandlerBase.IResourceMoveHandler; +import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; + +public class BuildStateManager { + private static final String PREFS_LOCATION = "buildState"; + + private static BuildStateManager fInstance; + + private EventListener fListener; + + private class ResourceMoveHandler implements IResourceMoveHandler { + + public void done() { + } + + public void handleProjectClose(IProject project) { + } + + public boolean handleResourceMove(IResource fromRc, IResource toRc) { + return doHandleResourceRemove(fromRc); + } + + public boolean handleResourceRemove(IResource rc) { + return doHandleResourceRemove(rc); + } + + private boolean doHandleResourceRemove(IResource rc){ + switch(rc.getType()){ + case IResource.PROJECT: + removeProjectInfo(rc.getProject()); + return false; + case IResource.ROOT: + return true; + //TODO: handle files and folder [re]move + } + return false; + } + } + + private class EventListener extends ResourceChangeHandlerBase implements ICProjectDescriptionListener { + + public void resourceChanged(IResourceChangeEvent event) { + super.resourceChanged(event); + //TODO: may handle resource changes as well + } + + public void handleEvent(CProjectDescriptionEvent event) { + switch(event.getEventType()){ + case CProjectDescriptionEvent.APPLIED: + case CProjectDescriptionEvent.LOADDED: + ICDescriptionDelta delta = event.getProjectDelta(); + processAppliedDelta(event, delta); + break; + } + } + + private void processAppliedDelta(CProjectDescriptionEvent event, ICDescriptionDelta delta){ + if(delta == null) + return; + + IProjectBuildState pbs = null; + boolean apply = false; + switch (delta.getDeltaKind()) { + case ICDescriptionDelta.REMOVED: + removeProjectInfo(event.getProject()); + break; + case ICDescriptionDelta.CHANGED: + ICDescriptionDelta[] children = delta.getChildren(); + for(int i = 0; i < children.length; i++){ + if(children[i].getDeltaKind() == ICDescriptionDelta.REMOVED){ + if(pbs == null){ + pbs = getProjectBuildState(event.getProject()); + String id = children[i].getSetting().getId(); + IConfigurationBuildState cbs = pbs.getConfigurationBuildState(id, false); + if(cbs != null){ + apply = true; + pbs.removeConfigurationBuildState(id); + } + } + } + } + break; + default: + break; + } + + if(pbs != null && apply){ + setProjectBuildState(event.getProject(), pbs); + } + } + + protected IResourceMoveHandler createResourceMoveHandler( + IResourceChangeEvent event) { + return new ResourceMoveHandler(); + } + + } + + private void removeProjectInfo(IProject project){ + File f = getPrefsDir(project); + if(f.exists()){ + File[] children = f.listFiles(); + for(int i = 0; i < children.length; i++){ + children[i].delete(); + } + f.delete(); + } + } + + private BuildStateManager(){ + } + + public static BuildStateManager getInstance(){ + if(fInstance == null) + fInstance = new BuildStateManager(); + return fInstance; + } + + public void startup(){ + if(fListener == null){ + fListener = new EventListener(); + CoreModel.getDefault().getProjectDescriptionManager().addCProjectDescriptionListener(fListener, CProjectDescriptionEvent.APPLIED | CProjectDescriptionEvent.LOADDED); + ResourcesPlugin.getWorkspace().addResourceChangeListener(fListener, + IResourceChangeEvent.POST_CHANGE + | IResourceChangeEvent.PRE_DELETE + | IResourceChangeEvent.PRE_CLOSE); + } + } + + public void shutdown(){ + if(fListener != null){ + ResourcesPlugin.getWorkspace().removeResourceChangeListener(fListener); + CoreModel.getDefault().getProjectDescriptionManager().removeCProjectDescriptionListener(fListener); + } + } + + public IProjectBuildState getProjectBuildState(IProject project){ + return new ProjectBuildState(project); + } + + public void setProjectBuildState(IProject project, IProjectBuildState state){ + ((ProjectBuildState)state).serialize(); + } + + private IPath getPrefsDirPath(){ + IPath path = ManagedBuilderCorePlugin.getDefault().getStateLocation(); + path = path.append(PREFS_LOCATION); + return path; + } + + IPath getPrefsDirPath(IProject project){ + IPath path = getPrefsDirPath(); + path = path.append(project.getName()); + return path; + } + + private File getPrefsDir(IProject project){ + IPath path = getPrefsDirPath(project); + File file = path.toFile(); +// if(!file.exists()) +// file.mkdirs(); + return file; + } +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java index 6f5745367d0..68927fbdbc4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Intel Corporation and others. + * Copyright (c) 2006, 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 @@ -136,7 +136,7 @@ public class CommandBuilder implements IBuildModelBuilder { } - public CommandBuilder(IBuildCommand cmd){ + public CommandBuilder(IBuildCommand cmd, IResourceRebuildStateContainer cr){ fCmd = cmd; } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ConfigurationBuildState.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ConfigurationBuildState.java new file mode 100644 index 00000000000..f9cd8e90c00 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ConfigurationBuildState.java @@ -0,0 +1,215 @@ +/******************************************************************************* + * 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.buildmodel; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IPath; + +public class ConfigurationBuildState implements IConfigurationBuildState { + private final static Integer REBUILD_STATE = new Integer(NEED_REBUILD); + private final static Integer REMOVED_STATE = new Integer(REMOVED); + private final static Integer NONE_STATE = new Integer(0); + + private Map fStateToPathListMap; + private Properties fPathToStateProps; + private String fCfgId; + private IProject fProject; + private int fState; + + ConfigurationBuildState(IProject project, String cfgId){ + fCfgId = cfgId; + fProject = project; + fState = NEED_REBUILD; + } + + void setProject(IProject project){ + fProject = project; + } + + public IPath[] getFullPathsForState(int state) { + if(fStateToPathListMap == null) + return new IPath[0]; + + Set set = (Set)fStateToPathListMap.get(new Integer(state)); + if(set == null) + return new IPath[0]; + + return setToFullPaths(set); + } + + private IPath[] setToFullPaths(Set set){ + IPath paths[] = new IPath[set.size()]; + IPath path = fProject.getFullPath(); + int num = 0; + for(Iterator iter = set.iterator(); iter.hasNext();){ + String projRel = (String)iter.next(); + paths[num++] = path.append(projRel); + } + return paths; + } + + public int getStateForFullPath(IPath fullPath) { + if(fPathToStateProps == null) + return 0; + String str = fullPathToString(fullPath); + String v = fPathToStateProps.getProperty(str); + if(v != null){ + Integer i = stateToInt(v); + if(i != null) + return i.intValue(); + } + return 0; + } + + public void setStateForFullPath(IPath fullPath, int state) { + String str = fullPathToString(fullPath); + int cur = getStateForFullPath(fullPath); + if(cur == state) + return; + + if(fPathToStateProps == null){ + fPathToStateProps = new Properties(); + fStateToPathListMap = new HashMap(); + } + String strState = stateToString(new Integer(state)); + Integer iState = stateToInt(strState); + if(iState == null) + throw new IllegalArgumentException(); + + if(cur != 0){ + Set set = (Set)fStateToPathListMap.get(new Integer(cur)); + set.remove(str); + if(set.size() == 0) + fStateToPathListMap.remove(iState); + } + + if(state != 0){ + fPathToStateProps.setProperty(str, strState); + Set set = (Set)fStateToPathListMap.get(iState); + if(set == null){ + set = new HashSet(); + fStateToPathListMap.put(iState, set); + } + set.add(str); + } else { + fPathToStateProps.remove(str); + } + } + + private String fullPathToString(IPath fullPath){ + return fullPath.removeFirstSegments(1).toString(); + } + + public void load(InputStream iStream) throws IOException{ + Properties props = new Properties(); + props.load(iStream); + load(props); + } + + private void load(Properties props){ + Map map = new HashMap(); + for(Iterator iter = props.entrySet().iterator(); iter.hasNext();){ + Map.Entry entry = (Map.Entry)iter.next(); + Integer i = stateToInt((String)entry.getValue()); + Set list = (Set)map.get(i); + if(list == null){ + list = new HashSet(); + map.put(i, list); + } + list.add(entry.getKey()); + } + + //TODO: trim lists + if(map.size() != 0){ + fStateToPathListMap = map; + fPathToStateProps = props; + } + fState = 0; + } + + public void store(OutputStream oStream) throws IOException{ + if(fPathToStateProps != null) + fPathToStateProps.store(oStream, ""); +// Properties props = new Properties(); +// store(props); +// props.store(oStream, ""); + } + +// public void store(Properties props){ +// if(fStateToPathListMap == null) +// return; +// +// for(Iterator iter = fStateToPathListMap.entrySet().iterator(); iter.hasNext();){ +// Map.Entry entry = (Map.Entry)iter.next(); +// String propValue = stateToString((Integer)entry.getKey()); +// List list = (List)entry.getValue(); +// for(int i = 0; i < list.size(); i++){ +// props.setProperty((String)list.get(i), propValue); +// } +// } +// } + + private Integer stateToInt(String state){ + try { + Integer i = new Integer(state); + if(i.equals(REBUILD_STATE)) + return REBUILD_STATE; + if(i.equals(REMOVED_STATE)) + return REMOVED_STATE; + if(i.equals(NONE_STATE)) + return NONE_STATE; + } catch (NumberFormatException e){ + ManagedBuilderCorePlugin.log(e); + } + return null; + } + + private String stateToString(Integer state){ + return state.toString(); + } + + public int getState() { + return fState; + } + + public void setState(int state) { + fState = state; + clear(); + } + + private void clear(){ + fPathToStateProps = null; + fStateToPathListMap = null; + } + + public String getConfigurationId() { + return fCfgId; + } + + public IProject getProject() { + return fProject; + } + + public boolean exists(){ + return fState == 0; + } +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DefaultBuildDescriptionFactory.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DefaultBuildDescriptionFactory.java index 0eebbe2e56b..117a9f40396 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DefaultBuildDescriptionFactory.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DefaultBuildDescriptionFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Intel Corporation and others. + * Copyright (c) 2006, 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 @@ -33,8 +33,15 @@ public class DefaultBuildDescriptionFactory implements IBuildDescriptionFactory * @see org.eclipse.cdt.managedbuilder.builddescription.IBuildDescriptionFactory#createBuildDescription(org.eclipse.cdt.managedbuilder.core.IConfiguration, org.eclipse.core.resources.IResourceDelta, int) */ public IBuildDescription createBuildDescription(IConfiguration cfg, IResourceDelta delta, int flags) throws CoreException { + return createBuildDescription(cfg, null, delta, flags); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.builddescription.IBuildDescriptionFactory#createBuildDescription(org.eclipse.cdt.managedbuilder.core.IConfiguration, org.eclipse.core.resources.IResourceDelta, int) + */ + public IBuildDescription createBuildDescription(IConfiguration cfg, IConfigurationBuildState bs, IResourceDelta delta, int flags) throws CoreException { BuildDescription info = new BuildDescription(); - info.init(cfg, delta, flags); + info.init(cfg, bs, delta, flags); return info; } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java index fe7a1e8e82a..83cee87d0c7 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Intel Corporation and others. + * Copyright (c) 2006, 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 @@ -17,6 +17,7 @@ import java.util.Map; import org.eclipse.cdt.managedbuilder.buildmodel.BuildDescriptionManager; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildDescription; +import org.eclipse.cdt.managedbuilder.buildmodel.IBuildResource; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildStep; import org.eclipse.cdt.managedbuilder.buildmodel.IStepVisitor; import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; @@ -50,6 +51,7 @@ public class DescriptionBuilder implements IBuildModelBuilder { private Map fStepToStepBuilderMap = new HashMap(); private int fNumCommands = -1; private GenDirInfo fDir; + private IResourceRebuildStateContainer fRebuildStateContainer; private class BuildStepVisitor implements IStepVisitor{ private OutputStream fOut; @@ -111,19 +113,19 @@ public class DescriptionBuilder implements IBuildModelBuilder { } - public DescriptionBuilder(IBuildDescription des){ - this(des, true); + public DescriptionBuilder(IBuildDescription des, IResourceRebuildStateContainer rs){ + this(des, true, rs); } - public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly){ - this(des, buildIncrementaly, true); + public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, IResourceRebuildStateContainer rs){ + this(des, buildIncrementaly, true, rs); } - public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, boolean resumeOnError){ - this(des, buildIncrementaly, resumeOnError, null); + public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, boolean resumeOnError, IResourceRebuildStateContainer rs){ + this(des, buildIncrementaly, resumeOnError, null, rs); } - public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, boolean resumeOnErrs, IPath cwd){ + public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, boolean resumeOnErrs, IPath cwd, IResourceRebuildStateContainer rs){ fDes = des; fCWD = cwd; fBuildIncrementaly = buildIncrementaly; @@ -132,6 +134,8 @@ public class DescriptionBuilder implements IBuildModelBuilder { if(fCWD == null) fCWD = fDes.getDefaultBuildDirLocation(); + + fRebuildStateContainer = rs; } /* (non-Javadoc) @@ -140,6 +144,7 @@ public class DescriptionBuilder implements IBuildModelBuilder { public int build(OutputStream out, OutputStream err, IProgressMonitor monitor){ + initRebuildStates(); int num = getNumCommands(); int status = STATUS_OK; @@ -167,6 +172,9 @@ public class DescriptionBuilder implements IBuildModelBuilder { monitor.done(); + if(status == STATUS_OK) + clearRebuildStates(); + return status; } @@ -189,7 +197,7 @@ public class DescriptionBuilder implements IBuildModelBuilder { protected StepBuilder getStepBuilder(IBuildStep step){ StepBuilder b = (StepBuilder)fStepToStepBuilderMap.get(step); if(b == null){ - b = new StepBuilder(step, fCWD, fResumeOnErrs, fDir); + b = new StepBuilder(step, fCWD, fResumeOnErrs, fDir, fRebuildStateContainer); fStepToStepBuilderMap.put(step, b); } return b; @@ -206,4 +214,41 @@ public class DescriptionBuilder implements IBuildModelBuilder { } } } + + private void initRebuildStates(){ + if(fRebuildStateContainer == null) + return; + + fRebuildStateContainer.setState(0); + + IBuildResource[] rcs = fDes.getResources(); + putAll(fRebuildStateContainer, rcs, IRebuildState.NEED_REBUILD, true); + } + + private void clearRebuildStates(){ + if(fRebuildStateContainer == null) + return; + + fRebuildStateContainer.setState(0); + +// IBuildResource[] rcs = fDes.getResources(); +// putAll(fRebuildStateContainer, rcs, IRebuildState.NEED_REBUILD, true); + } + + static void putAll(IResourceRebuildStateContainer cbs, IBuildResource[] rcs, int state, boolean rebuildRcOnly){ + for(int i = 0; i < rcs.length; i++){ + IBuildResource rc = rcs[i]; + if(rebuildRcOnly && !rc.needsRebuild()) + continue; + + if(!rc.isProjectResource()) + continue; + IPath fullPath = rc.getFullPath(); + if(fullPath == null) + continue; + + cbs.setStateForFullPath(fullPath, state); + } + } + } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IConfigurationBuildState.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IConfigurationBuildState.java new file mode 100644 index 00000000000..9226121897f --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IConfigurationBuildState.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * 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.buildmodel; + +import org.eclipse.core.resources.IProject; + + +public interface IConfigurationBuildState extends IResourceRebuildStateContainer { + String getConfigurationId(); + + IProject getProject(); +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IProjectBuildState.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IProjectBuildState.java new file mode 100644 index 00000000000..79fc4a91569 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IProjectBuildState.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * 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.buildmodel; + +import org.eclipse.core.resources.IProject; + +public interface IProjectBuildState extends IRebuildState { + IConfigurationBuildState[] getConfigurationBuildStates(); + + IConfigurationBuildState getConfigurationBuildState(String id, boolean create); + + void removeConfigurationBuildState(String id); + + IProject getProject(); +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IRebuildState.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IRebuildState.java new file mode 100644 index 00000000000..6cf6290ad24 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IRebuildState.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * 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.buildmodel; + +public interface IRebuildState { + public static final int NEED_REBUILD = 1; + public static final int REMOVED = 1 << 1; + + int getState(); + + void setState(int state); +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IResourceRebuildStateContainer.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IResourceRebuildStateContainer.java new file mode 100644 index 00000000000..8dc11cf65be --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/IResourceRebuildStateContainer.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * 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.buildmodel; + +import org.eclipse.core.runtime.IPath; + +public interface IResourceRebuildStateContainer extends IRebuildState { + int getStateForFullPath(IPath fullPath); + + IPath[] getFullPathsForState(int state); + + void setStateForFullPath(IPath fullPath, int state); +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ProjectBuildState.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ProjectBuildState.java new file mode 100644 index 00000000000..82f803db908 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ProjectBuildState.java @@ -0,0 +1,222 @@ +/******************************************************************************* + * 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.buildmodel; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.eclipse.cdt.core.settings.model.util.CDataUtil; +import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IPath; + +public class ProjectBuildState implements IProjectBuildState { + private Properties fCfgIdToFileNameProps; + private Map fCfgIdToStateMap = new HashMap(); + private IProject fProject; + private boolean fIsMapInfoDirty; + + public ProjectBuildState(IProject project){ + fProject = project; + } + + void setProject(IProject project){ + fProject = project; + for(Iterator iter = fCfgIdToStateMap.values().iterator(); iter.hasNext();){ + ConfigurationBuildState cbs = (ConfigurationBuildState)iter.next(); + cbs.setProject(project); + } + } + + public IConfigurationBuildState getConfigurationBuildState(String id, boolean create) { + ConfigurationBuildState state = (ConfigurationBuildState)fCfgIdToStateMap.get(id); + if(state == null){ + state = loadState(id, create); + if(state.exists() || create) + fCfgIdToStateMap.put(id, state); + else + state = null; + } + return state; + } + + private ConfigurationBuildState loadState(String id, boolean create){ + File file = getFileForCfg(id, create); + ConfigurationBuildState bs = new ConfigurationBuildState(fProject, id); + if(file != null && file.exists()){ + try { + InputStream iStream = new FileInputStream(file); + bs.load(iStream); + iStream.close(); + } catch (FileNotFoundException e) { + ManagedBuilderCorePlugin.log(e); + } catch (IOException e) { + ManagedBuilderCorePlugin.log(e); + } + } + return bs; + } + + public IConfigurationBuildState[] getConfigurationBuildStates() { + Properties props = getIdToNameProperties(); + List list = new ArrayList(props.size()); + for(Iterator iter = props.keySet().iterator(); iter.hasNext();){ + String id = (String)iter.next(); + IConfigurationBuildState state = getConfigurationBuildState(id, false); + if(state != null) + list.add(state); + } + return (ConfigurationBuildState[])list.toArray(new ConfigurationBuildState[list.size()]); + } + + public void removeConfigurationBuildState(String id) { + ConfigurationBuildState cbs = (ConfigurationBuildState)getConfigurationBuildState(id, false); + if(cbs != null){ + cbs.setState(IRebuildState.NEED_REBUILD); + } + } + + public int getState() { + // TODO Auto-generated method stub + return 0; + } + + public void setState(int state) { + // TODO Auto-generated method stub + } + private static final int OP_CREATE = 1; + private static final int OP_REMOVE = 2; + + private String getFileName(String id, int op){ + Properties props = getIdToNameProperties(); + String name = props.getProperty(id); + if(name == null){ + if(op == OP_CREATE){ + name = new Integer(CDataUtil.genRandomNumber()).toString(); + props.setProperty(id, name); + fIsMapInfoDirty = true; + // saveMapFile(); + } + } else if (op == OP_REMOVE){ + props.remove(id); + fIsMapInfoDirty = true; + } + return name; + } + + private File getFileForCfg(String id, boolean create){ + String name = getFileName(id, create ? OP_CREATE : 0); + if(name == null) + return null; + + IPath path = BuildStateManager.getInstance().getPrefsDirPath(fProject); + path = path.append(name); + return path.toFile(); + } + + private void saveMapFile(){ + if(fCfgIdToFileNameProps == null) + return; + + File file = getMapFile(); + File parent = file.getParentFile(); + if(!parent.exists()) + parent.mkdirs(); + + try { + OutputStream oStream = new FileOutputStream(file); + fCfgIdToFileNameProps.store(oStream, ""); + oStream.close(); + } catch (FileNotFoundException e) { + ManagedBuilderCorePlugin.log(e); + } catch (IOException e) { + ManagedBuilderCorePlugin.log(e); + } + } + + private File getMapFile(){ + IPath path = BuildStateManager.getInstance().getPrefsDirPath(fProject); + path = path.append(getProjFileName()); + File file = path.toFile(); + return file; + } + + private Properties getIdToNameProperties(){ + if(fCfgIdToFileNameProps == null){ + fCfgIdToFileNameProps = new Properties(); + File file = getMapFile(); + if(file.exists()){ + try { + InputStream iStream = new FileInputStream(file); + fCfgIdToFileNameProps.load(iStream); + iStream.close(); + } catch (FileNotFoundException e) { + ManagedBuilderCorePlugin.log(e); + } catch (IOException e) { + ManagedBuilderCorePlugin.log(e); + } + } + } + return fCfgIdToFileNameProps; + } + + private String getProjFileName(){ + return fProject.getName(); + } + + public IProject getProject() { + return fProject; + } + + void serialize(){ + + for(Iterator iter = fCfgIdToStateMap.values().iterator(); iter.hasNext();){ + ConfigurationBuildState s = (ConfigurationBuildState)iter.next(); + String id = s.getConfigurationId(); + if(!s.exists()){ + File file = getFileForCfg(id, false); + if(file != null && file.exists()){ + file.delete(); + getFileName(id, OP_REMOVE); + } + } else { + File file = getFileForCfg(id, true); + File parent = file.getParentFile(); + if(!parent.exists()) + parent.mkdirs(); + + try { + FileOutputStream oStream = new FileOutputStream(file); + s.store(oStream); + oStream.close(); + } catch (FileNotFoundException e) { + ManagedBuilderCorePlugin.log(e); + } catch (IOException e) { + ManagedBuilderCorePlugin.log(e); + } + } + } + + if(fIsMapInfoDirty) + saveMapFile(); + } +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java index 5859d63e2c4..60e6189e9ef 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Intel Corporation and others. + * Copyright (c) 2006, 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 @@ -43,16 +43,17 @@ public class StepBuilder implements IBuildModelBuilder { private boolean fResumeOnErrs; private int fNumCommands = -1; private CommandBuilder fCommandBuilders[]; - - public StepBuilder(IBuildStep step){ - this(step, null); + private IResourceRebuildStateContainer fRebuildStateContainer; + + public StepBuilder(IBuildStep step, IResourceRebuildStateContainer rs){ + this(step, null, rs); } - public StepBuilder(IBuildStep step, IPath cwd){ - this(step, cwd, true, null); + public StepBuilder(IBuildStep step, IPath cwd, IResourceRebuildStateContainer rs){ + this(step, cwd, true, null, rs); } - public StepBuilder(IBuildStep step, IPath cwd, boolean resumeOnErrs, GenDirInfo dirs){ + public StepBuilder(IBuildStep step, IPath cwd, boolean resumeOnErrs, GenDirInfo dirs, IResourceRebuildStateContainer rs){ fStep = step; fCWD = cwd; fDirs = dirs; @@ -63,6 +64,8 @@ public class StepBuilder implements IBuildModelBuilder { if(fCWD == null) fCWD = fStep.getBuildDescription().getDefaultBuildDirLocation(); + + fRebuildStateContainer = rs; } /* (non-Javadoc) @@ -114,6 +117,7 @@ public class StepBuilder implements IBuildModelBuilder { } switch(status){ case STATUS_OK: + clearRebuildState(); break; case STATUS_CANCELLED: case STATUS_ERROR_BUILD: @@ -125,6 +129,16 @@ public class StepBuilder implements IBuildModelBuilder { return status; } + private void clearRebuildState(){ + if(fRebuildStateContainer == null) + return; + + IBuildResource[] rcs = fStep.getOutputResources(); + DescriptionBuilder.putAll(fRebuildStateContainer, rcs, 0, false); + rcs = fStep.getInputResources(); + DescriptionBuilder.putAll(fRebuildStateContainer, rcs, 0, false); + } + protected void refreshOutputs(IProgressMonitor monitor){ if(fStep == fStep.getBuildDescription().getInputStep()) return; @@ -200,7 +214,7 @@ public class StepBuilder implements IBuildModelBuilder { else { fCommandBuilders = new CommandBuilder[cmds.length]; for(int i = 0; i < cmds.length; i++){ - fCommandBuilders[i] = new CommandBuilder(cmds[i]); + fCommandBuilders[i] = new CommandBuilder(cmds[i], fRebuildStateContainer); } } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java index cc756877788..bcf5e67e618 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java @@ -49,8 +49,12 @@ import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; +import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStateManager; import org.eclipse.cdt.managedbuilder.internal.buildmodel.DescriptionBuilder; import org.eclipse.cdt.managedbuilder.internal.buildmodel.IBuildModelBuilder; +import org.eclipse.cdt.managedbuilder.internal.buildmodel.IConfigurationBuildState; +import org.eclipse.cdt.managedbuilder.internal.buildmodel.IProjectBuildState; +import org.eclipse.cdt.managedbuilder.internal.buildmodel.IRebuildState; import org.eclipse.cdt.managedbuilder.internal.buildmodel.ParallelBuilder; import org.eclipse.cdt.managedbuilder.internal.buildmodel.StepBuilder; import org.eclipse.cdt.managedbuilder.macros.BuildMacroException; @@ -879,11 +883,14 @@ public class CommonBuilder extends ACBuilder { boolean buildIncrementaly = delta != null; - IBuildDescription des = BuildDescriptionManager.createBuildDescription(cfg, delta, flags); + BuildStateManager bsMngr = BuildStateManager.getInstance(); + IProjectBuildState pBS = bsMngr.getProjectBuildState(currentProject); + IConfigurationBuildState cBS = pBS.getConfigurationBuildState(cfg.getId(), true); + IBuildDescription des = BuildDescriptionManager.createBuildDescription(cfg, cBS, delta, flags); DescriptionBuilder dBuilder = null; if (!isParallel) - dBuilder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr); + dBuilder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr, cBS); // Get a build console for the project StringBuffer buf = new StringBuffer(); @@ -982,6 +989,8 @@ public class CommonBuilder extends ACBuilder { .getResourceString(MARKERS)); //TODO: addBuilderMarkers(epm); epm.reportProblems(); + + bsMngr.setProjectBuildState(currentProject, pBS); } else { buf = new StringBuffer(); buf.append(ManagedMakeMessages.getFormattedString(NOTHING_BUILT, currentProject.getName())); @@ -1169,7 +1178,7 @@ public class CommonBuilder extends ACBuilder { { IBuildStep step = (IBuildStep) stepIter.next(); - StepBuilder stepBuilder = new StepBuilder(step); + StepBuilder stepBuilder = new StepBuilder(step, null); int status = stepBuilder.build(consoleOutStream, epmOutputStream, new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java index 24c9e2db3db..1baaaa6a72c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2006 IBM Corporation and others. + * Copyright (c) 2002, 2007 IBM 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 @@ -1216,7 +1216,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { DescriptionBuilder builder = null; if (!isParallel) - builder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr); + builder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr, null); // Get a build console for the project StringBuffer buf = new StringBuffer(); @@ -1480,7 +1480,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { { IBuildStep step = (IBuildStep) stepIter.next(); - StepBuilder stepBuilder = new StepBuilder(step); + StepBuilder stepBuilder = new StepBuilder(step, null); int status = stepBuilder.build(consoleOutStream, epmOutputStream, new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionEvent.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionEvent.java index 537233ada1f..bfdc67dfbdd 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionEvent.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionEvent.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.core.settings.model; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionDelta; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; -import org.eclipse.cdt.internal.core.settings.model.ICDescriptionDelta; import org.eclipse.core.resources.IProject; public final class CProjectDescriptionEvent { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ICDescriptionDelta.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICDescriptionDelta.java similarity index 93% rename from core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ICDescriptionDelta.java rename to core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICDescriptionDelta.java index d86115f3499..3282792e878 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ICDescriptionDelta.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICDescriptionDelta.java @@ -8,9 +8,8 @@ * Contributors: * Intel Corporation - Initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.internal.core.settings.model; +package org.eclipse.cdt.core.settings.model; -import org.eclipse.cdt.core.settings.model.ICSettingObject; public interface ICDescriptionDelta { int REMOVED = 1; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionDelta.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionDelta.java index ccf772eaeea..4f779adf17d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionDelta.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionDelta.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.settings.model; import java.util.ArrayList; import java.util.List; +import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.core.settings.model.ICSettingObject; public class CProjectDescriptionDelta implements ICDescriptionDelta { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java index 8bbac9193a6..f1757a28be4 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java @@ -48,6 +48,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.settings.model.CExternalSetting; import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.core.settings.model.ICFileDescription; import org.eclipse.cdt.core.settings.model.ICFolderDescription; import org.eclipse.cdt.core.settings.model.ICLanguageSetting; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CfgExportSettingContainerFactory.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CfgExportSettingContainerFactory.java index d903be62fc3..2de8b8a2e47 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CfgExportSettingContainerFactory.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CfgExportSettingContainerFactory.java @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.settings.model.CExternalSetting; import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.core.settings.model.ICExternalSetting; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java index 4ac3acb6ae6..be287bbfc91 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; +import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.internal.core.model.CModelOperation; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.CompositeWorkspaceRunnable; import org.eclipse.core.resources.IProject; diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java index 9365c85a1ab..299143d7ede 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.core.ICDescriptorManager; import org.eclipse.cdt.core.ICDescriptorOperation; import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener; import org.eclipse.cdt.core.settings.model.ICSettingObject; @@ -35,7 +36,6 @@ import org.eclipse.cdt.internal.core.settings.model.CProjectDescription; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.internal.core.settings.model.CStorage; import org.eclipse.cdt.internal.core.settings.model.ExceptionFactory; -import org.eclipse.cdt.internal.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo; import org.eclipse.cdt.internal.core.settings.model.InternalXmlStorageElement; import org.eclipse.cdt.internal.core.settings.model.PathEntryConfigurationDataProvider;