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 5f8b8dffae4..c5cc9dbbaf5 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 @@ -127,6 +127,76 @@ public class CommonBuilder extends ACBuilder { System.err.println(ERROR_HEADER + resourceName + TRACE_FOOTER + message + NEWLINE); } } + + private static class NullConsole implements IConsole { // return a null console + private ConsoleOutputStream nullStream = new ConsoleOutputStream() { + public void write(byte[] b) throws IOException { + } + public void write(byte[] b, int off, int len) throws IOException { + } + public void write(int c) throws IOException { + } + }; + + public void start(IProject project) { + } + // this can be a null console.... + public ConsoleOutputStream getOutputStream() { + return nullStream; + } + public ConsoleOutputStream getInfoStream() { + return nullStream; + } + public ConsoleOutputStream getErrorStream() { + return nullStream; + } + }; + + private static class CfgBuildInfo { + private IProject fProject; + private IManagedBuildInfo fBuildInfo; + private IConfiguration fCfg; + private IBuilder fBuilder; + private IConsole fConsole; + private boolean fIsForeground; + + CfgBuildInfo(IBuilder builder, boolean isForegound){ + this.fBuilder = builder; + this.fCfg = builder.getParent().getParent(); + this.fIsForeground = isForegound; + this.fProject = this.fCfg.getOwner().getProject(); + this.fBuildInfo = ManagedBuildManager.getBuildInfo(this.fProject); + } + + public IProject getProject(){ + return fProject; + } + + public IConsole getConsole(){ + if(fConsole == null){ + fConsole = fIsForeground ? CCorePlugin.getDefault().getConsole() : new NullConsole(); + fConsole.start(fProject); + } + return fConsole; + } + + public boolean isForeground(){ + return fIsForeground; + } + + public IBuilder getBuilder(){ + return fBuilder; + } + + public IConfiguration getConfiguration(){ + return fCfg; + } + + public IManagedBuildInfo getBuildInfo(){ + return fBuildInfo; + } + } + public class ResourceDeltaVisitor implements IResourceDeltaVisitor { private String buildGoalName; @@ -363,12 +433,13 @@ public class CommonBuilder extends ACBuilder { * @see IncrementalProjectBuilder#build */ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { - IBuilder builders[] = BuilderFactory.createBuilders(getProject(), args); + IProject project = getProject(); + IBuilder builders[] = BuilderFactory.createBuilders(project, args); int num = builders.length; - IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IConfiguration activeCfg = info.getDefaultConfiguration(); + IProject[] refProjects = project.getReferencedProjects(); if(num != 0){ - MultiStatus status = checkBuilders(builders, activeCfg); if(status.getSeverity() != IStatus.OK) throw new CoreException(status); @@ -377,18 +448,51 @@ public class CommonBuilder extends ACBuilder { monitor.beginTask("", num + cfgs.length); //$NON-NLS-1$ - if(cfgs.length != 0) - ManagedBuildManager.buildConfigurations(cfgs, new SubProgressMonitor(monitor, 1)); + if(cfgs.length != 0){ + Set set = getProjectsSet(cfgs); + if(set.size() != 0){ + set.addAll(Arrays.asList(refProjects)); + refProjects = (IProject[])set.toArray(new IProject[set.size()]); + } + buildReferencedConfigs(cfgs, new SubProgressMonitor(monitor, 1)); + } for(int i = 0; i < num; i++){ - build(kind, builders[i], info, new SubProgressMonitor(monitor, 1)); + build(kind, new CfgBuildInfo(builders[i], true), new SubProgressMonitor(monitor, 1)); } } - updateOtherConfigs(builders, kind); + updateOtherConfigs(info, builders, kind); monitor.done(); - return getProject().getReferencedProjects(); + return project.getReferencedProjects(); + } + + private void buildReferencedConfigs(IConfiguration[] cfgs, IProgressMonitor monitor){ + cfgs = filterConfigsToBuild(cfgs); + if(cfgs.length != 0){ + monitor.beginTask("Building referenced configurations..", cfgs.length); + for(int i = 0; i < cfgs.length; i++){ + IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1); + try { + IConfiguration cfg = cfgs[i]; + IBuilder builder = cfg.getEditableBuilder(); + CfgBuildInfo bInfo = new CfgBuildInfo(builder, false); + build(INCREMENTAL_BUILD, bInfo, subMonitor); + } catch (CoreException e){ + ManagedBuilderCorePlugin.log(e); + } finally { + subMonitor.done(); + } + } + } else { + monitor.done(); + } + } + + private IConfiguration[] filterConfigsToBuild(IConfiguration[] cfgs){ + //TODO: + return cfgs; } private IConfiguration[] getReferencedConfigs(IBuilder[] builders){ @@ -403,6 +507,18 @@ public class CommonBuilder extends ACBuilder { return (IConfiguration[]) set.toArray(new Configuration[set.size()]); } + private Set getProjectsSet(IConfiguration[] cfgs){ + if(cfgs.length == 0) + return new HashSet(0); + + Set set = new HashSet(); + for(int i = 0; i < cfgs.length; i++){ + set.add(cfgs[i].getOwner().getProject()); + } + + return set; + } + protected MultiStatus checkBuilders(IBuilder builders[], IConfiguration activeCfg){ MultiStatus status = null; for(int i = 0; i < builders.length; i++){ @@ -458,11 +574,9 @@ public class CommonBuilder extends ACBuilder { return status; } - private void updateOtherConfigs(IBuilder builders[], int buildKind){ - //IProject project - IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); + private void updateOtherConfigs(IManagedBuildInfo info, IBuilder builders[], int buildKind){ IConfiguration allCfgs[] = info.getManagedProject().getConfigurations(); - new OtherConfigVerifier(builders, allCfgs).updateOtherConfigs(buildKind == FULL_BUILD ? null : getDelta(getProject())); + new OtherConfigVerifier(builders, allCfgs).updateOtherConfigs(buildKind == FULL_BUILD ? null : getDelta(info.getManagedProject().getOwner().getProject())); } protected class BuildStatus { @@ -509,7 +623,8 @@ public class CommonBuilder extends ACBuilder { } } - protected void build(int kind, IBuilder builder, IManagedBuildInfo info, IProgressMonitor monitor) throws CoreException{ + protected void build(int kind, CfgBuildInfo bInfo, IProgressMonitor monitor) throws CoreException{ + IBuilder builder = bInfo.getBuilder(); BuildStatus status = new BuildStatus(builder); if (!shouldBuild(kind, builder)) { return; @@ -529,20 +644,20 @@ public class CommonBuilder extends ACBuilder { if (status.isBuild()) { // IManagedBuilderMakefileGenerator makeGen = null; if(status.isManagedBuildOn()){ - status = performPrebuildGeneration(kind, builder, info, status, monitor); + status = performPrebuildGeneration(kind, bInfo, status, monitor); } IConfiguration cfg = builder.getParent().getParent(); if(status.isBuild()){ try { - boolean isClean = invokeBuilder(kind, builder, monitor); + boolean isClean = invokeBuilder(kind, bInfo, monitor); if (isClean) { forgetLastBuiltState(); cfg.setRebuildState(true); } else { if(status.isManagedBuildOn()){ - performPostbuildGeneration(kind, builder, info, status, monitor); + performPostbuildGeneration(kind, bInfo, status, monitor); } cfg.setRebuildState(false); } @@ -551,7 +666,7 @@ public class CommonBuilder extends ACBuilder { throw e; } } else if(status.getConsoleMessagesList().size() != 0) { - emitMessage(concatMessages(status.getConsoleMessagesList())); + emitMessage(bInfo, concatMessages(status.getConsoleMessagesList())); } } checkCancel(monitor); @@ -582,17 +697,19 @@ public class CommonBuilder extends ACBuilder { * @param status * @param configName */ - private String createNoSourceMessage(int buildType, IStatus status, String configName) throws CoreException { + private String createNoSourceMessage(int buildType, IStatus status, CfgBuildInfo bInfo) throws CoreException { StringBuffer buf = new StringBuffer(); String[] consoleHeader = new String[3]; + String configName = bInfo.getConfiguration().getName(); + String projName = bInfo.getProject().getName(); if (buildType == FULL_BUILD || buildType == INCREMENTAL_BUILD) { consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_INC); } else { consoleHeader[0] = new String(); - outputError(getProject().getName(), "The given build type is not supported in this context"); //$NON-NLS-1$ + outputError(projName, "The given build type is not supported in this context"); //$NON-NLS-1$ } consoleHeader[1] = configName; - consoleHeader[2] = getProject().getName(); + consoleHeader[2] = projName; buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$ buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader)); buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$ @@ -602,9 +719,9 @@ public class CommonBuilder extends ACBuilder { return buf.toString(); } - private void emitMessage(String msg) throws CoreException { + private void emitMessage(CfgBuildInfo info, String msg) throws CoreException { try { - IConsole console = getConsole(); + IConsole console = info.getConsole(); ConsoleOutputStream consoleOutStream = console.getOutputStream(); // Report a successful clean consoleOutStream.write(msg.getBytes()); @@ -619,11 +736,11 @@ public class CommonBuilder extends ACBuilder { } } - private IConsole getConsole(){ - IConsole console = CCorePlugin.getDefault().getConsole(); - console.start(getProject()); - return console; - } +// private IConsole getConsole(IProject project, boolean bg){ +// IConsole console = CCorePlugin.getDefault().getConsole(); +// console.start(project); +// return console; +// } /** * called to invoke the MBS Internal Builder for building the given configuration * @@ -635,16 +752,17 @@ public class CommonBuilder extends ACBuilder { * If false the build will stop on the first error * @param monitor monitor */ - protected boolean invokeInternalBuilder(int kind, IBuilder builder, + protected boolean invokeInternalBuilder(int kind, CfgBuildInfo bInfo, IProgressMonitor monitor) { - - IConfiguration cfg = builder.getParent().getParent(); + + IBuilder builder = bInfo.getBuilder(); + IConfiguration cfg = bInfo.getConfiguration(); boolean isParallel = builder.getParallelizationNum() != 0; // boolean buildIncrementaly = true; boolean resumeOnErr = !builder.isStopOnError(); // Get the project and make sure there's a monitor to cancel the build - IProject currentProject = cfg.getOwner().getProject(); + IProject currentProject = bInfo.getProject(); if (monitor == null) { monitor = new NullProgressMonitor(); } @@ -675,8 +793,9 @@ public class CommonBuilder extends ACBuilder { // Get a build console for the project StringBuffer buf = new StringBuffer(); - console = CCorePlugin.getDefault().getConsole(); - console.start(currentProject); +// console = CCorePlugin.getDefault().getConsole(); +// console.start(currentProject); + console = bInfo.getConsole(); consoleOutStream = console.getOutputStream(); String[] consoleHeader = new String[3]; if(buildIncrementaly) @@ -708,7 +827,7 @@ public class CommonBuilder extends ACBuilder { // Hook up an error parser manager String[] errorParsers = builder.getErrorParsers(); - ErrorParserManager epm = new ErrorParserManager(getProject(), des.getDefaultBuildDirLocation(), this, errorParsers); + ErrorParserManager epm = new ErrorParserManager(currentProject, des.getDefaultBuildDirLocation(), this, errorParsers); epm.setOutputStream(consoleOutStream); // This variable is necessary to ensure that the EPM stream stay open // until we explicitly close it. See bug#123302. @@ -771,7 +890,7 @@ public class CommonBuilder extends ACBuilder { epm.reportProblems(); } else { buf = new StringBuffer(); - buf.append(ManagedMakeMessages.getFormattedString(NOTHING_BUILT, getProject().getName())); + buf.append(ManagedMakeMessages.getFormattedString(NOTHING_BUILT, currentProject.getName())); buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$ consoleOutStream.write(buf.toString().getBytes()); consoleOutStream.flush(); @@ -854,7 +973,7 @@ public class CommonBuilder extends ACBuilder { * If false the build will stop on the first error * @param monitor Progress monitor. For every resource built this monitor will consume one unit of work. */ - public void invokeInternalBuilder(IResource[] resourcesToBuild, IConfiguration cfg, + private void invokeInternalBuilder(IResource[] resourcesToBuild, CfgBuildInfo bInfo, boolean buildIncrementaly, boolean resumeOnErr, boolean initNewConsole, @@ -862,7 +981,9 @@ public class CommonBuilder extends ACBuilder { IProgressMonitor monitor) { // Get the project and make sure there's a monitor to cancel the build - IProject currentProject = cfg.getOwner().getProject(); + IProject currentProject = bInfo.getProject(); + IConfiguration cfg = bInfo.getConfiguration(); + if (monitor == null) { monitor = new NullProgressMonitor(); } @@ -881,8 +1002,9 @@ public class CommonBuilder extends ACBuilder { msgs[0] = ManagedMakeMessages.getResourceString(INTERNAL_BUILDER); msgs[1] = currentProject.getName(); - IConsole console = CCorePlugin.getDefault().getConsole(); - console.start(currentProject); +// IConsole console = CCorePlugin.getDefault().getConsole(); +// console.start(currentProject); + IConsole console = bInfo.getConsole(); ConsoleOutputStream consoleOutStream = console.getOutputStream(); StringBuffer buf = new StringBuffer(); @@ -1044,7 +1166,8 @@ public class CommonBuilder extends ACBuilder { } } - protected BuildStatus performPostbuildGeneration(int kind, IBuilder builder, IManagedBuildInfo mInfo, BuildStatus buildStatus, IProgressMonitor monitor) throws CoreException{ + protected BuildStatus performPostbuildGeneration(int kind, CfgBuildInfo bInfo, BuildStatus buildStatus, IProgressMonitor monitor) throws CoreException{ + IBuilder builder = bInfo.getBuilder(); if(builder.isInternalBuilder()) return buildStatus; @@ -1057,18 +1180,18 @@ public class CommonBuilder extends ACBuilder { return buildStatus; } - protected BuildStatus performPrebuildGeneration(int kind, IBuilder builder, IManagedBuildInfo mInfo, BuildStatus buildStatus, IProgressMonitor monitor) throws CoreException{ + protected BuildStatus performPrebuildGeneration(int kind, CfgBuildInfo bInfo, BuildStatus buildStatus, IProgressMonitor monitor) throws CoreException{ + IBuilder builder = bInfo.getBuilder(); if(builder.isInternalBuilder()) return buildStatus; - IConfiguration cfg = builder.getParent().getParent(); - buildStatus = performCleanning(kind, cfg, builder, mInfo, buildStatus, monitor); + buildStatus = performCleanning(kind, bInfo, buildStatus, monitor); IManagedBuilderMakefileGenerator generator = builder.getBuildFileGenerator(); if(generator != null){ - initializeGenerator(generator, kind, cfg, builder, mInfo, monitor); + initializeGenerator(generator, kind, bInfo, monitor); buildStatus.setMakeGen(generator); - MultiStatus result = performMakefileGeneration(generator, buildStatus, monitor); + MultiStatus result = performMakefileGeneration(bInfo, generator, buildStatus, monitor); if (result.getCode() == IStatus.WARNING || result.getCode() == IStatus.INFO) { IStatus[] kids = result.getChildren(); for (int index = 0; index < kids.length; ++index) { @@ -1084,7 +1207,7 @@ public class CommonBuilder extends ACBuilder { // } if (status.getCode() == IManagedBuilderMakefileGenerator.NO_SOURCE_FOLDERS) { // performBuild = false; - buildStatus.getConsoleMessagesList().add(createNoSourceMessage(kind, status, cfg.getName())); + buildStatus.getConsoleMessagesList().add(createNoSourceMessage(kind, status, bInfo)); buildStatus.cancelBuild(); // break; @@ -1113,21 +1236,25 @@ public class CommonBuilder extends ACBuilder { return buildStatus; } - protected BuildStatus performCleanning(int kind, IConfiguration cfg, IBuilder builder, IManagedBuildInfo mInfo, BuildStatus status, IProgressMonitor monitor) throws CoreException{ + protected BuildStatus performCleanning(int kind, CfgBuildInfo bInfo, BuildStatus status, IProgressMonitor monitor) throws CoreException{ + IConfiguration cfg = bInfo.getConfiguration(); + IProject curProject = bInfo.getProject(); +// IBuilder builder = bInfo.getBuilder(); + boolean makefileRegenerationNeeded = false; //perform necessary cleaning and build type calculation if(cfg.needsFullRebuild()){ //configuration rebuild state is set to true, //full rebuild is needed in any case //clean first, then make a full build - outputTrace(getProject().getName(), "config rebuild state is set to true, making a full rebuild"); //$NON-NLS-1$ - clean(builder, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); + outputTrace(curProject.getName(), "config rebuild state is set to true, making a full rebuild"); //$NON-NLS-1$ + clean(bInfo, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); makefileRegenerationNeeded = true; } else { makefileRegenerationNeeded = cfg.needsRebuild(); IBuildDescription des = null; - IResourceDelta delta = kind == FULL_BUILD ? null : getDelta(getProject()); + IResourceDelta delta = kind == FULL_BUILD ? null : getDelta(curProject); if(delta == null) makefileRegenerationNeeded = true; if(cfg.needsRebuild() || delta != null){ @@ -1138,14 +1265,14 @@ public class CommonBuilder extends ACBuilder { if(delta != null) flags |= BuildDescriptionManager.REMOVED; - outputTrace(getProject().getName(), "using a build description.."); //$NON-NLS-1$ + outputTrace(curProject.getName(), "using a build description.."); //$NON-NLS-1$ - des = BuildDescriptionManager.createBuildDescription(cfg, getDelta(getProject()), flags); + des = BuildDescriptionManager.createBuildDescription(cfg, getDelta(curProject), flags); BuildDescriptionManager.cleanGeneratedRebuildResources(des); } catch (Throwable e){ //TODO: log error - outputError(getProject().getName(), "error occured while build description calculation: " + e.getLocalizedMessage()); //$NON-NLS-1$ + outputError(curProject.getName(), "error occured while build description calculation: " + e.getLocalizedMessage()); //$NON-NLS-1$ //in case an error occured, make it behave in the old stile: if(cfg.needsRebuild()){ //make a full clean if an info needs a rebuild @@ -1154,7 +1281,7 @@ public class CommonBuilder extends ACBuilder { } else if(delta != null && !makefileRegenerationNeeded){ // Create a delta visitor to detect the build type - ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(cfg, mInfo.getManagedProject().getConfigurations()); + ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(cfg, bInfo.getBuildInfo().getManagedProject().getConfigurations()); delta.accept(visitor); if (visitor.shouldBuildFull()) { clean(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); @@ -1171,22 +1298,23 @@ public class CommonBuilder extends ACBuilder { return status; } - protected MultiStatus performMakefileGeneration(IManagedBuilderMakefileGenerator generator, BuildStatus buildStatus, IProgressMonitor monitor) throws CoreException { + protected MultiStatus performMakefileGeneration(CfgBuildInfo bInfo, IManagedBuilderMakefileGenerator generator, BuildStatus buildStatus, IProgressMonitor monitor) throws CoreException { // Need to report status to the user + IProject curProject = bInfo.getProject(); if (monitor == null) { monitor = new NullProgressMonitor(); } // Ask the makefile generator to generate any makefiles needed to build delta checkCancel(monitor); - String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.update.makefiles", getProject().getName()); //$NON-NLS-1$ + String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.update.makefiles", curProject.getName()); //$NON-NLS-1$ monitor.subTask(statusMsg); MultiStatus result; if(buildStatus.isRebuild()){ result = generator.regenerateMakefiles(); } else { - result = generator.generateMakefiles(getDelta(getProject())); + result = generator.generateMakefiles(getDelta(curProject)); } return result; @@ -1201,45 +1329,47 @@ public class CommonBuilder extends ACBuilder { } - protected void initializeGenerator(IManagedBuilderMakefileGenerator generator, int kind, IConfiguration cfg, IBuilder builder, IManagedBuildInfo info, IProgressMonitor monitor){ + protected void initializeGenerator(IManagedBuilderMakefileGenerator generator, int kind, CfgBuildInfo bInfo, IProgressMonitor monitor){ if(generator instanceof IManagedBuilderMakefileGenerator2){ IManagedBuilderMakefileGenerator2 gen2 = (IManagedBuilderMakefileGenerator2)generator; - gen2.initialize(kind, cfg, builder, monitor); + gen2.initialize(kind, bInfo.getConfiguration(), bInfo.getBuilder(), monitor); } else { - generator.initialize(getProject(), info, monitor); + generator.initialize(bInfo.getProject(), bInfo.getBuildInfo(), monitor); } } protected void clean(IProgressMonitor monitor) throws CoreException { - IBuilder[] builders = BuilderFactory.createBuilders(getProject(), null); + IProject curProject = getProject(); + IBuilder[] builders = BuilderFactory.createBuilders(curProject, null); for(int i = 0; i < builders.length; i++){ IBuilder builder = builders[i]; - clean(builder, monitor); + CfgBuildInfo bInfo = new CfgBuildInfo(builder, true); + clean(bInfo, monitor); } } - protected void clean(IBuilder builder, IProgressMonitor monitor) throws CoreException{ - if (shouldBuild(CLEAN_BUILD, builder)) { + protected void clean(CfgBuildInfo bInfo, IProgressMonitor monitor) throws CoreException{ + if (shouldBuild(CLEAN_BUILD, bInfo.getBuilder())) { boolean performExternalClean = true; - if(shouldCleanProgrammatically(builder)){ + if(shouldCleanProgrammatically(bInfo)){ try { - cleanProgrammatically(builder, monitor); + cleanProgrammatically(bInfo, monitor); performExternalClean = false; } catch (CoreException e) { } } if(performExternalClean){ - performExternalClean(builder, false, monitor); + performExternalClean(bInfo, false, monitor); } } } - protected void performExternalClean(final IBuilder builder, boolean separateJob, IProgressMonitor monitor) throws CoreException { + protected void performExternalClean(final CfgBuildInfo bInfo, boolean separateJob, IProgressMonitor monitor) throws CoreException { IResourceRuleFactory ruleFactory= ResourcesPlugin.getWorkspace().getRuleFactory(); - final ISchedulingRule rule = ruleFactory.modifyRule(getProject()); + final ISchedulingRule rule = ruleFactory.modifyRule(bInfo.getProject()); if(separateJob){ Job backgroundJob = new Job("CDT Common Builder"){ //$NON-NLS-1$ @@ -1251,7 +1381,7 @@ public class CommonBuilder extends ACBuilder { ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { - invokeMake(CLEAN_BUILD, builder, monitor); + invokeMake(CLEAN_BUILD, bInfo, monitor); } }, rule, IWorkspace.AVOID_UPDATE, monitor); } catch (CoreException e) { @@ -1267,13 +1397,13 @@ public class CommonBuilder extends ACBuilder { backgroundJob.setRule(rule); backgroundJob.schedule(); } else { - invokeMake(CLEAN_BUILD, builder, monitor); + invokeMake(CLEAN_BUILD, bInfo, monitor); } } - protected boolean shouldCleanProgrammatically(IBuilder builder){ - if(!builder.isManagedBuildOn()) + protected boolean shouldCleanProgrammatically(CfgBuildInfo bInfo){ + if(!bInfo.getBuilder().isManagedBuildOn()) return false; return true; // IConfiguration cfg = builder.getParent().getParent(); @@ -1284,10 +1414,12 @@ public class CommonBuilder extends ACBuilder { // return cfg.getOwner().getProject().getFullPath().isPrefixOf(path); } - protected void cleanProgrammatically(IBuilder builder, IProgressMonitor monitor) throws CoreException { + protected void cleanProgrammatically(CfgBuildInfo bInfo, IProgressMonitor monitor) throws CoreException { // referencedProjects = getProject().getReferencedProjects(); - outputTrace(getProject().getName(), "Clean build requested"); //$NON-NLS-1$ - IConfiguration cfg = builder.getParent().getParent(); + IProject curProject = bInfo.getProject(); + outputTrace(curProject.getName(), "Clean build requested"); //$NON-NLS-1$ + IBuilder builder = bInfo.getBuilder(); + IConfiguration cfg = bInfo.getConfiguration(); IPath buildPath = ManagedBuildManager.getBuildFullPath(cfg, builder); if(buildPath == null){ throw new CoreException(new Status(IStatus.ERROR, @@ -1295,7 +1427,7 @@ public class CommonBuilder extends ACBuilder { ManagedMakeMessages.getResourceString("CommonBuilder.0"))); //$NON-NLS-1$ } - IPath projectFullPath = getProject().getFullPath(); + IPath projectFullPath = curProject.getFullPath(); if(!projectFullPath.isPrefixOf(buildPath)){ throw new CoreException(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.getUniqueIdentifier(), @@ -1326,13 +1458,15 @@ public class CommonBuilder extends ACBuilder { workspace.delete(new IResource[]{buildDir}, true, monitor); StringBuffer buf = new StringBuffer(); // write to the console - IConsole console = CCorePlugin.getDefault().getConsole(); - console.start(getProject()); +// +// IConsole console = CCorePlugin.getDefault().getConsole(); +// console.start(getProject()); + IConsole console = bInfo.getConsole(); ConsoleOutputStream consoleOutStream = console.getOutputStream(); String[] consoleHeader = new String[3]; consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_CLEAN); consoleHeader[1] = cfg.getName(); - consoleHeader[2] = getProject().getName(); + consoleHeader[2] = curProject.getName(); buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$ buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader)); buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$ @@ -1340,7 +1474,7 @@ public class CommonBuilder extends ACBuilder { consoleOutStream.flush(); buf = new StringBuffer(); // Report a successful clean - String successMsg = ManagedMakeMessages.getFormattedString(BUILD_FINISHED, getProject().getName()); + String successMsg = ManagedMakeMessages.getFormattedString(BUILD_FINISHED, curProject.getName()); buf.append(successMsg); buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$ consoleOutStream.write(buf.toString().getBytes()); @@ -1350,16 +1484,17 @@ public class CommonBuilder extends ACBuilder { } } - protected boolean invokeBuilder(int kind, IBuilder builder, IProgressMonitor monitor) throws CoreException { - if(builder.isInternalBuilder()) - return invokeInternalBuilder(kind, builder, monitor); - return invokeMake(kind, builder, monitor); + protected boolean invokeBuilder(int kind, CfgBuildInfo bInfo, IProgressMonitor monitor) throws CoreException { + if(bInfo.getBuilder().isInternalBuilder()) + return invokeInternalBuilder(kind, bInfo, monitor); + return invokeMake(kind, bInfo, monitor); } - protected boolean invokeMake(int kind, IBuilder builder, IProgressMonitor monitor) throws CoreException { + protected boolean invokeMake(int kind, CfgBuildInfo bInfo, IProgressMonitor monitor) throws CoreException { boolean isClean = false; - IProject currProject = getProject(); + IProject currProject = bInfo.getProject(); + IBuilder builder = bInfo.getBuilder(); if (monitor == null) { monitor = new NullProgressMonitor(); @@ -1369,8 +1504,9 @@ public class CommonBuilder extends ACBuilder { try { IPath buildCommand = builder.getBuildCommand(); if (buildCommand != null) { - IConsole console = CCorePlugin.getDefault().getConsole(); - console.start(currProject); +// IConsole console = CCorePlugin.getDefault().getConsole(); +// console.start(currProject); + IConsole console = bInfo.getConsole(); OutputStream cos = console.getOutputStream(); StringBuffer buf = new StringBuffer(); @@ -1387,9 +1523,9 @@ public class CommonBuilder extends ACBuilder { break; } - IConfiguration cfg = builder.getParent().getParent(); + IConfiguration cfg = bInfo.getConfiguration(); consoleHeader[1] = cfg.getName(); - consoleHeader[2] = getProject().getName(); + consoleHeader[2] = currProject.getName(); buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$ buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader)); buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$ @@ -1439,12 +1575,12 @@ public class CommonBuilder extends ACBuilder { // recon.invokeMakeRecon(); // cos = recon; QualifiedName qName = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "progressMonitor"); //$NON-NLS-1$ - Integer last = (Integer)getProject().getSessionProperty(qName); + Integer last = (Integer)currProject.getSessionProperty(qName); if (last == null) { last = new Integer(100); } StreamMonitor streamMon = new StreamMonitor(new SubProgressMonitor(monitor, 100), cos, last.intValue()); - ErrorParserManager epm = new ErrorParserManager(getProject(), workingDirectory, this, builder.getErrorParsers()); + ErrorParserManager epm = new ErrorParserManager(currProject, workingDirectory, this, builder.getErrorParsers()); epm.setOutputStream(streamMon); OutputStream stdout = epm.getOutputStream(); OutputStream stderr = epm.getOutputStream(); @@ -1487,7 +1623,7 @@ public class CommonBuilder extends ACBuilder { } else { errMsg = launcher.getErrorMessage(); } - getProject().setSessionProperty(qName, !monitor.isCanceled() && !isClean ? new Integer(streamMon.getWorkDone()) : null); + currProject.setSessionProperty(qName, !monitor.isCanceled() && !isClean ? new Integer(streamMon.getWorkDone()) : null); if (errMsg != null) { buf = new StringBuffer(buildCommand.toString() + " "); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java index 0052d474974..fa5e687d85d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java @@ -1349,4 +1349,35 @@ public class CoreModel { public ICProjectDescription getProjectDescription(IProject project, boolean write){ return descriptionManager.getProjectDescription(project, write); } + + /** + * forces the cached data of the specified projects to be re-calculated. + * if the projects argument is null al projects + * within the workspace are updated + * + * @param projects + * @param monitor + * @throws CoreException + */ + public void updateProjectDescriptions(IProject projects[], IProgressMonitor monitor) throws CoreException{ + descriptionManager.updateProjectDescriptions(projects, monitor); + } + + /** + * aswers whether the given project is a new-style project, i.e. CConfigurationDataProvider-driven + * @param project + * @return + */ + public boolean isNewStyleProject(IProject project){ + return descriptionManager.isNewStyleProject(project); + } + + /** + * aswers whether the given project is a new-style project, i.e. CConfigurationDataProvider-driven + * @param des + * @return + */ + public boolean isNewStyleProject(ICProjectDescription des){ + return descriptionManager.isNewStyleProject(des); + } } 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 c7e29ac91b9..8c228c139f6 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 @@ -174,7 +174,7 @@ public class CProjectDescriptionManager { // } // } - private class CompositeWorkspaceRunnable implements IWorkspaceRunnable { + static class CompositeWorkspaceRunnable implements IWorkspaceRunnable { private List fRunnables = new ArrayList(); private String fName; private boolean fStopOnErr; @@ -571,12 +571,13 @@ public class CProjectDescriptionManager { if(converter != null){ CProjectDescription convertedDes = (CProjectDescription)converter.convertProject(project, eDes, ownerId, des); if(convertedDes != null){ - ICConfigurationDescription activeCfg = convertedDes.getActiveConfiguration(); - if(activeCfg != null){ - checkBuildSystemChange(project, eDes, activeCfg.getBuildSystemId(), null, new NullProgressMonitor()); - // if(convertedDes != null) - des = convertedDes; - } +/// ICConfigurationDescription activeCfg = convertedDes.getActiveConfiguration(); + checkHandleActiveCfgChange(convertedDes, null, eDes, new NullProgressMonitor()); +// if(activeCfg != null){ +// checkBuildSystemChange(project, eDes, activeCfg.getBuildSystemId(), null, new NullProgressMonitor()); +// // if(convertedDes != null) +// des = convertedDes; +// } } } else { // des; @@ -703,10 +704,14 @@ public class CProjectDescriptionManager { // } } - public void updateProjectDescriptions(IProgressMonitor monitor) throws CoreException{ + public void updateProjectDescriptions(IProject[] projects, IProgressMonitor monitor) throws CoreException{ + if(monitor == null) + monitor = new NullProgressMonitor(); + try { IWorkspace wsp = ResourcesPlugin.getWorkspace(); - final IProject projects[] = wsp.getRoot().getProjects(); + if(projects == null) + projects = wsp.getRoot().getProjects(); final ICProjectDescription dess[] = new ICProjectDescription[projects.length]; int num = 0; for(int i = 0; i < projects.length; i++){ @@ -912,38 +917,45 @@ public class CProjectDescriptionManager { return getProjectDescription(project, true); } - private void storeActiveCfgId(ICProjectDescription des, String id){ + private void storeActiveCfgId(IProject project, String id){ try { - des.getProject().setPersistentProperty(ACTIVE_CFG_PROPERTY, id); + project.setPersistentProperty(ACTIVE_CFG_PROPERTY, id); } catch (CoreException e) { // Hitting this error just means the default config is not set } } - void checkActiveCfgChange(CProjectDescription newDes, CProjectDescription oldDes, IProgressMonitor monitor){ + /* + * returns true if the project description was modiofied false - otherwise + */ + boolean checkHandleActiveCfgChange(CProjectDescription newDes, CProjectDescription oldDes, IProjectDescription eDes, IProgressMonitor monitor){ if(newDes == null) - return; + return false; ICConfigurationDescription newCfg = newDes.getActiveConfiguration(); if(newCfg == null) - return; - + return false; ICConfigurationDescription oldCfg = oldDes != null ? oldDes.getActiveConfiguration() : null; - String newId = newCfg.getId(); - String oldId = oldCfg != null ? oldCfg.getId() : null; + checkActiveCfgChange(newDes, newCfg, oldCfg); - if(newDes.needsActiveCfgIdPersistence() || !newId.equals(oldId)){ - storeActiveCfgId(newDes, newId); + boolean modified = false; + + try { + if(checkBuildSystemChange(eDes, newCfg, oldCfg, monitor)) + modified = true; + } catch (CoreException e) { + CCorePlugin.log(e); } - String newBsId = newCfg.getBuildSystemId(); - String oldBsId = oldCfg != null ? oldCfg.getBuildSystemId() : null; - try { - checkBuildSystemChange(newDes.getProject(), newBsId, oldBsId, monitor); + if(checkProjectRefChange(eDes, newCfg, oldCfg, monitor)) + modified = true; } catch (CoreException e) { + CCorePlugin.log(e); } + + return modified; } String loadActiveCfgId(ICProjectDescription des){ @@ -954,13 +966,70 @@ public class CProjectDescriptionManager { } return null; } - - - private void checkBuildSystemChange(IProject project, String newBsId, String oldBsId, IProgressMonitor monitor) throws CoreException{ - checkBuildSystemChange(project, null, newBsId, oldBsId, monitor); + + private Set projSetFromProjNameSet(Set projNameSet){ + if(projNameSet.size() == 0) + return new HashSet(0); + + Set set = new HashSet(); + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + + for(Iterator iter = projNameSet.iterator(); iter.hasNext();){ + IProject proj = root.getProject((String)iter.next()); + set.add(proj); + } + + return set; } - private void checkBuildSystemChange(IProject project, IProjectDescription des, String newBsId, String oldBsId, IProgressMonitor monitor) throws CoreException{ + private boolean checkProjectRefChange(IProjectDescription des, ICConfigurationDescription newCfg, ICConfigurationDescription oldCfg, IProgressMonitor monitor) throws CoreException{ + if(newCfg == null) + return false; + + Map oldMap = oldCfg != null ? oldCfg.getReferenceInfo() : null; + Map newMap = newCfg != null ? newCfg.getReferenceInfo() : null; + Set oldProjSet = oldMap != null ? projSetFromProjNameSet(oldMap.keySet()) : new HashSet(0); + Set newProjSet = newMap != null ? projSetFromProjNameSet(newMap.keySet()) : new HashSet(0); + + Set tmp = new HashSet(newProjSet); + newProjSet.removeAll(oldProjSet); + oldProjSet.removeAll(tmp); + if(oldProjSet.size() != 0 || newProjSet.size() != 0){ + IProject[] refs = des.getReferencedProjects(); + Set set = new HashSet(Arrays.asList(refs)); + set.removeAll(oldProjSet); + set.addAll(newProjSet); + des.setReferencedProjects((IProject[])set.toArray(new IProject[set.size()])); + return true; + } + return false; + } + + +// private void checkBuildSystemChange(IProject project, String newBsId, String oldBsId, IProgressMonitor monitor) throws CoreException{ +// checkBuildSystemChange(project, null, newBsId, oldBsId, monitor); +// } + + private boolean checkActiveCfgChange(CProjectDescription des, + ICConfigurationDescription newCfg, + ICConfigurationDescription oldCfg){ + String newId = newCfg.getId(); + String oldId = oldCfg != null ? oldCfg.getId() : null; + + if(des.needsActiveCfgIdPersistence() || !newId.equals(oldId)){ + storeActiveCfgId(des.getProject(), newId); + return true; + } + return false; + } + + private boolean checkBuildSystemChange(IProjectDescription des, + ICConfigurationDescription newCfg, + ICConfigurationDescription oldCfg, + IProgressMonitor monitor) throws CoreException{ + String newBsId = newCfg != null ? newCfg.getBuildSystemId() : null; + String oldBsId = oldCfg != null ? oldCfg.getBuildSystemId() : null; + CConfigurationDataProviderDescriptor newDr = newBsId != null ? getCfgProviderDescriptor(newBsId) : null; CConfigurationDataProviderDescriptor oldDr = oldBsId != null ? getCfgProviderDescriptor(oldBsId) : null; @@ -973,11 +1042,11 @@ public class CProjectDescriptionManager { // List[] builderDiff = ListComparator.compare(newBuilderIds, oldBuilderIds); if(natureDiff != null /*|| builderDiff != null*/){ - boolean applyDes = false; - if(des == null){ - des = project.getDescription(); - applyDes = true; - } +// boolean applyDes = false; +// if(des == null){ +// des = project.getDescription(); +// applyDes = true; +// } String natureIds[] = des.getNatureIds(); if(natureDiff[1] != null){ @@ -1000,9 +1069,11 @@ public class CProjectDescriptionManager { if(natureDiff != null) des.setNatureIds(natureIds); - if(applyDes) - project.setDescription(des, monitor); +// if(applyDes) +// project.setDescription(des, monitor); + return true; } + return false; } public void setProjectDescription(IProject project, ICProjectDescription des) throws CoreException { @@ -1057,7 +1128,7 @@ public class CProjectDescriptionManager { // serialize(newDes); } - private IWorkspaceRunnable createDesSerializationRunnable(CProjectDescription des) throws CoreException{ + IWorkspaceRunnable createDesSerializationRunnable(CProjectDescription des) throws CoreException{ final ICStorageElement element = des.getRootStorageElement(); IWorkspaceRunnable r = new DesSerializationRunnable(des, element); @@ -1729,7 +1800,7 @@ public class CProjectDescriptionManager { } } - }, null); + }, new NullProgressMonitor()); //if refresh was performed "inline" without job scheduled if(job == null){ @@ -2994,6 +3065,17 @@ public class CProjectDescriptionManager { return isNewStyleCfg(cfgDes); return false; } + + public boolean isNewStyleProject(IProject project){ + return isNewStyleProject(getProjectDescription(project, false)); + } + + public boolean isNewStyleProject(ICProjectDescription des){ + if(des == null) + return false; + + return isNewStyleIndexCfg(des); + } public boolean isNewStyleCfg(ICConfigurationDescription cfgDes){ if(cfgDes == null) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ExternalSettingsManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ExternalSettingsManager.java index 49f9f59a955..9ed4edba38b 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ExternalSettingsManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ExternalSettingsManager.java @@ -467,7 +467,7 @@ public class ExternalSettingsManager { ICExternalSetting[][] newOldSettings = getNewOldSettings(projectDelta, cfgId); deltas = (ExtSettingsDelta[])deltaMap.get(cfgId); - updateReferencedSettings(cfgIter, refInfo, (CExternalSetting[])newOldSettings[0], deltas); + updateReferencedSettings(cfgIter, refInfo, (ICExternalSetting[])newOldSettings[0], deltas); } if(cfgIter.isWriteStatusChanged()){ @@ -479,8 +479,6 @@ public class ExternalSettingsManager { } } - - static class ExtSettingsDelta { ICExternalSetting fSetting; boolean fAdded; 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 9100b292122..b3a16dfbe35 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 @@ -10,12 +10,17 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.settings.model; +import org.eclipse.cdt.core.CCorePlugin; 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.internal.core.model.CModelOperation; +import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.CompositeWorkspaceRunnable; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; public class SetCProjectDescriptionOperation extends CModelOperation { @@ -35,7 +40,7 @@ public class SetCProjectDescriptionOperation extends CModelOperation { protected void executeOperation() throws CModelException { CProjectDescriptionManager mngr = CProjectDescriptionManager.getInstance(); ICProject cProject = (ICProject)getElementToProcess(); - IProject project = cProject.getProject(); + final IProject project = cProject.getProject(); CProjectDescription fOldDescriptionCache = (CProjectDescription)mngr.getProjectDescription(project, false); CProjectDescriptionEvent event = mngr.createAboutToApplyEvent(fSetDescription, fOldDescriptionCache); @@ -66,7 +71,23 @@ public class SetCProjectDescriptionOperation extends CModelOperation { } mngr.setLoaddedDescription(project, fNewDescriptionCache, true); - mngr.checkActiveCfgChange(fNewDescriptionCache, fOldDescriptionCache, new NullProgressMonitor()); + CompositeWorkspaceRunnable runnable = new CompositeWorkspaceRunnable("CDT Project settings serialization"); + + try { + final IProjectDescription eDes = project.getDescription(); + if(mngr.checkHandleActiveCfgChange(fNewDescriptionCache, fOldDescriptionCache, eDes, new NullProgressMonitor())){ + runnable.add(new IWorkspaceRunnable(){ + + public void run(IProgressMonitor monitor) + throws CoreException { + project.setDescription(eDes, monitor); + } + + }); + } + } catch (CoreException e2) { + CCorePlugin.log(e2); + } event = mngr.createDataAppliedEvent(fNewDescriptionCache, fOldDescriptionCache, fSetDescription, delta); mngr.notifyListeners(event); @@ -84,7 +105,8 @@ public class SetCProjectDescriptionOperation extends CModelOperation { mngr.notifyListeners(event); try { - mngr.serialize(fNewDescriptionCache); + runnable.add(mngr.createDesSerializationRunnable(fNewDescriptionCache)); + mngr.runWspModification(runnable, new NullProgressMonitor()); } catch (CoreException e) { throw new CModelException(e); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java index 50081c9ceeb..f4bd13ed7e5 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java @@ -1211,5 +1211,35 @@ public class CCorePlugin extends Plugin { public ICProjectDescription getProjectDescription(IProject project, boolean write){ return fNewCProjectDescriptionManager.getProjectDescription(project, write); } + + /** + * forces the cached data of the specified projects to be re-calculated. + * if the projects argument is null al projects + * within the workspace are updated + * + * @param projects + * @param monitor + * @throws CoreException + */ + public void updateProjectDescriptions(IProject projects[], IProgressMonitor monitor) throws CoreException{ + fNewCProjectDescriptionManager.updateProjectDescriptions(projects, monitor); + } + + /** + * aswers whether the given project is a new-style project, i.e. CConfigurationDataProvider-driven + * @param project + * @return + */ + public boolean isNewStyleProject(IProject project){ + return fNewCProjectDescriptionManager.isNewStyleProject(project); + } + /** + * aswers whether the given project is a new-style project, i.e. CConfigurationDataProvider-driven + * @param des + * @return + */ + public boolean isNewStyleProject(ICProjectDescription des){ + return fNewCProjectDescriptionManager.isNewStyleProject(des); + } } \ No newline at end of file