1
/*******************************************************************************
2
* Copyright (c) 2006, 2007 Intel Corporation and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Intel Corporation - Initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.managedbuilder.internal.buildmodel;
13
import java.io.IOException;
14
import java.io.OutputStream;
15
import java.util.HashMap;
18
import org.eclipse.cdt.managedbuilder.buildmodel.BuildDescriptionManager;
19
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildDescription;
20
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildResource;
21
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildStep;
22
import org.eclipse.cdt.managedbuilder.buildmodel.IStepVisitor;
23
import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
24
import org.eclipse.core.runtime.CoreException;
25
import org.eclipse.core.runtime.IPath;
26
import org.eclipse.core.runtime.IProgressMonitor;
27
import org.eclipse.core.runtime.NullProgressMonitor;
28
import org.eclipse.core.runtime.SubProgressMonitor;
32
* This class implements the IBuildDescription building,
33
* that is the build of the entire configuration/project
34
* To perform a build, create an instance of this class
35
* and invoke the build method
37
* NOTE: This class is subject to change and discuss,
38
* and is currently available in experimental mode only
41
public class DescriptionBuilder implements IBuildModelBuilder {
42
private static final String BUILDER_MSG_HEADER = "InternalBuilder.msg.header"; //$NON-NLS-1$
43
private static final String BUILDER_NOTHING_TODO = "InternalBuilder.nothing.todo"; //$NON-NLS-1$
44
private static final String LINE_SEPARATOR = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
47
private IBuildDescription fDes;
49
private boolean fBuildIncrementaly;
50
private boolean fResumeOnErrs;
51
private Map fStepToStepBuilderMap = new HashMap();
52
private int fNumCommands = -1;
53
private GenDirInfo fDir;
54
private IResourceRebuildStateContainer fRebuildStateContainer;
56
private class BuildStepVisitor implements IStepVisitor{
57
private OutputStream fOut;
58
private OutputStream fErr;
59
private IProgressMonitor fMonitor;
61
private boolean fBuild;
63
public BuildStepVisitor(OutputStream out, OutputStream err, IProgressMonitor monitor){
64
this(out, err, monitor, true);
67
public BuildStepVisitor(OutputStream out, OutputStream err, IProgressMonitor monitor, boolean build){
76
* @see org.eclipse.cdt.managedbuilder.builddescription.IStepVisitor#visit(org.eclipse.cdt.managedbuilder.builddescription.IBuildStep)
78
public int visit(IBuildStep action) throws CoreException {
79
if(fMonitor.isCanceled())
83
DbgUtil.trace("visiting step " + DbgUtil.stepName(action)); //$NON-NLS-1$
84
if(!action.isRemoved()
85
&& (!fBuildIncrementaly || action.needsRebuild())){
87
DbgUtil.trace("step " + DbgUtil.stepName(action) + " needs rebuild" ); //$NON-NLS-1$ //$NON-NLS-2$
88
StepBuilder builder = getStepBuilder(action);//new StepBuilder(action, fCWD, fResumeOnErrs, fDir);
91
switch(builder.build(fOut, fErr, new SubProgressMonitor(fMonitor, builder.getNumCommands()))){
94
case STATUS_CANCELLED:
95
fStatus = STATUS_CANCELLED;
97
case STATUS_ERROR_BUILD:
98
case STATUS_ERROR_LAUNCH:
100
fStatus = STATUS_ERROR_BUILD;
104
fNumCommands += builder.getNumCommands();
108
if(fStatus != STATUS_CANCELLED
109
&& (fResumeOnErrs || fStatus == STATUS_OK))
110
return VISIT_CONTINUE;
116
public DescriptionBuilder(IBuildDescription des, IResourceRebuildStateContainer rs){
120
public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, IResourceRebuildStateContainer rs){
121
this(des, buildIncrementaly, true, rs);
124
public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, boolean resumeOnError, IResourceRebuildStateContainer rs){
125
this(des, buildIncrementaly, resumeOnError, null, rs);
128
public DescriptionBuilder(IBuildDescription des, boolean buildIncrementaly, boolean resumeOnErrs, IPath cwd, IResourceRebuildStateContainer rs){
131
fBuildIncrementaly = buildIncrementaly;
132
fResumeOnErrs = resumeOnErrs;
133
fDir = new GenDirInfo(fDes.getConfiguration());
136
fCWD = fDes.getDefaultBuildDirLocation();
138
fRebuildStateContainer = rs;
142
* @see org.eclipse.cdt.managedbuilder.internal.builddescription.IBuildDescriptionBuilder#build(java.io.OutputStream, java.io.OutputStream, org.eclipse.core.runtime.IProgressMonitor)
144
public int build(OutputStream out, OutputStream err,
145
IProgressMonitor monitor){
148
int num = getNumCommands();
149
int status = STATUS_OK;
151
//TODO: should we specify some task name here?
152
monitor.beginTask("", num > 0 ? num : 1); //$NON-NLS-1$
153
monitor.subTask(""); //$NON-NLS-1$
156
BuildStepVisitor visitor = new BuildStepVisitor(out, err, monitor);
158
BuildDescriptionManager.accept(visitor,
160
} catch (CoreException e) {
161
status = STATUS_ERROR_LAUNCH;
164
if(status == STATUS_OK)
165
status = visitor.fStatus;
168
ManagedMakeMessages.getFormattedString(BUILDER_NOTHING_TODO,
169
fDes.getConfiguration().getOwner().getName()),
175
if(status == STATUS_OK)
176
clearRebuildStates();
181
public int getNumCommands() {
182
if(fNumCommands == -1){
184
BuildStepVisitor visitor = new BuildStepVisitor(null, null, new NullProgressMonitor(), false);
186
BuildDescriptionManager.accept(visitor,
188
} catch (CoreException e) {
189
//TODO: report an error
192
DbgUtil.trace("Description Builder: total work = " + fNumCommands); //$NON-NLS-1$
197
protected StepBuilder getStepBuilder(IBuildStep step){
198
StepBuilder b = (StepBuilder)fStepToStepBuilderMap.get(step);
200
b = new StepBuilder(step, fCWD, fResumeOnErrs, fDir, fRebuildStateContainer);
201
fStepToStepBuilderMap.put(step, b);
206
protected void printMessage(String msg, OutputStream os){
208
msg = ManagedMakeMessages.getFormattedString(BUILDER_MSG_HEADER, msg) + LINE_SEPARATOR;
210
os.write(msg.getBytes());
212
} catch (IOException e) {
218
private void initRebuildStates(){
219
if(fRebuildStateContainer == null)
222
fRebuildStateContainer.setState(0);
224
IBuildResource[] rcs = fDes.getResources();
225
putAll(fRebuildStateContainer, rcs, IRebuildState.NEED_REBUILD, true);
228
private void clearRebuildStates(){
229
if(fRebuildStateContainer == null)
232
fRebuildStateContainer.setState(0);
234
// IBuildResource[] rcs = fDes.getResources();
235
// putAll(fRebuildStateContainer, rcs, IRebuildState.NEED_REBUILD, true);
238
static void putAll(IResourceRebuildStateContainer cbs, IBuildResource[] rcs, int state, boolean rebuildRcOnly){
239
for(int i = 0; i < rcs.length; i++){
240
IBuildResource rc = rcs[i];
241
if(rebuildRcOnly && !rc.needsRebuild())
244
if(!rc.isProjectResource())
246
IPath fullPath = rc.getFullPath();
250
cbs.setStateForFullPath(fullPath, state);