From 4ef099036570984a40f9323c7d8d0e8855958cc4 Mon Sep 17 00:00:00 2001 From: Oleg Krasilnikov Date: Thu, 20 Mar 2008 16:41:09 +0000 Subject: [PATCH] Bug #194026 : Add "Build All Configurations" preference option --- .../scannerconfig/ScannerConfigBuilder.java | 4 +- .../internal/core/CommonBuilder.java | 44 +++--- .../core/GeneratedMakefileBuilder.java | 135 +++++++++--------- .../eclipse/cdt/core/resources/ACBuilder.java | 13 ++ .../ui/preferences/CPluginPreferencePage.java | 62 +++++++- .../ui/preferences/PreferencesMessages.java | 5 + .../PreferencesMessages.properties | 5 + 7 files changed, 184 insertions(+), 84 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/core/scannerconfig/ScannerConfigBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/core/scannerconfig/ScannerConfigBuilder.java index 02d0364fa4b..e20c686a577 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/core/scannerconfig/ScannerConfigBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/core/scannerconfig/ScannerConfigBuilder.java @@ -59,8 +59,6 @@ public class ScannerConfigBuilder extends ACBuilder { public final static String BUILDER_ID = ManagedBuilderCorePlugin.getUniqueIdentifier() + ".ScannerConfigBuilder"; //$NON-NLS-1$ - private static final boolean BUILD_ALL_CONFIGS = false; - public ScannerConfigBuilder() { super(); } @@ -78,7 +76,7 @@ public class ScannerConfigBuilder extends ACBuilder { if(bInfo != null){ IConfiguration cfgs[] = bInfo.getManagedProject().getConfigurations(); if(cfgs.length != 0){ - if(!BUILD_ALL_CONFIGS){ + if(!needAllConfigBuild()){ ICProjectDescription des = CoreModel.getDefault().getProjectDescription(getProject(), false); IConfiguration cfg = null; if(des != null){ 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 b0fc4662ce1..7c20c9d64df 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 @@ -502,9 +502,22 @@ public class CommonBuilder extends ACBuilder { if(VERBOSE) outputTrace(project.getName(), ">>build requested, type = " + kind); //$NON-NLS-1$ - IBuilder builders[] = ManagedBuilderCorePlugin.createBuilders(project, args); - IProject[] projects = build(kind, project, builders, true, monitor); - + IProject[] projects = null; + if (needAllConfigBuild()) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + IConfiguration[] cfgs = info.getManagedProject().getConfigurations(); + IConfiguration defCfg = info.getDefaultConfiguration(); + for (IConfiguration cfg : cfgs) { + info.setDefaultConfiguration(cfg); + IBuilder builders[] = ManagedBuilderCorePlugin.createBuilders(project, args); + projects = build(kind, project, builders, true, monitor); + } + info.setDefaultConfiguration(defCfg); + } else { + IBuilder builders[] = ManagedBuilderCorePlugin.createBuilders(project, args); + projects = build(kind, project, builders, true, monitor); + } + if(VERBOSE) outputTrace(project.getName(), "< set = buildReferencedConfigs(rcfgs, new SubProgressMonitor(monitor, 1));// = getProjectsSet(cfgs); if(set.size() != 0){ set.addAll(Arrays.asList(refProjects)); - refProjects = (IProject[])set.toArray(new IProject[set.size()]); + refProjects = set.toArray(new IProject[set.size()]); } } @@ -548,8 +561,8 @@ public class CommonBuilder extends ACBuilder { return project.getReferencedProjects(); } - private Set buildReferencedConfigs(IConfiguration[] cfgs, IProgressMonitor monitor){ - Set projSet = getProjectsSet(cfgs); + private Set buildReferencedConfigs(IConfiguration[] cfgs, IProgressMonitor monitor){ + Set projSet = getProjectsSet(cfgs); cfgs = filterConfigsToBuild(cfgs); if(cfgs.length != 0){ @@ -610,7 +623,7 @@ public class CommonBuilder extends ACBuilder { } private IConfiguration[] getReferencedConfigs(IBuilder[] builders){ - Set set = new HashSet(); + Set set = new HashSet(); for(int i = 0; i < builders.length; i++){ IConfiguration cfg = builders[i].getParent().getParent(); IConfiguration refs[] = ManagedBuildManager.getReferencedConfigurations(cfg); @@ -618,14 +631,14 @@ public class CommonBuilder extends ACBuilder { set.add(refs[k]); } } - return (IConfiguration[]) set.toArray(new Configuration[set.size()]); + return set.toArray(new Configuration[set.size()]); } - private Set getProjectsSet(IConfiguration[] cfgs){ + private Set getProjectsSet(IConfiguration[] cfgs){ if(cfgs.length == 0) - return new HashSet(0); + return new HashSet(0); - Set set = new HashSet(); + Set set = new HashSet(); for(int i = 0; i < cfgs.length; i++){ set.add(cfgs[i].getOwner().getProject()); } @@ -759,7 +772,6 @@ public class CommonBuilder extends ACBuilder { // } if (status.isBuild()) { -// IManagedBuilderMakefileGenerator makeGen = null; IConfiguration cfg = bInfo.getConfiguration(); if(!builder.isCustomBuilder()){ 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 1baaaa6a72c..9225141600d 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 @@ -417,80 +417,87 @@ public class GeneratedMakefileBuilder extends ACBuilder { return referencedProjects; } - IConfiguration cfg = info.getDefaultConfiguration(); - - updateOtherConfigs(cfg, kind); - - if(((Configuration)cfg).isInternalBuilderEnabled()){ - invokeInternalBuilder(cfg, kind != FULL_BUILD, ((Configuration)cfg).getInternalBuilderIgnoreErr(), monitor); - - // Scrub the build info the project - info.setRebuildState(false); - return referencedProjects; - } - - // Create a makefile generator for the build - IManagedBuilderMakefileGenerator generator = ManagedBuildManager.getBuildfileGenerator(info.getDefaultConfiguration()); - generator.initialize(getProject(), info, monitor); - - //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(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); - fullBuild(info, generator, monitor); + IConfiguration[] cfgs = null; + if (needAllConfigBuild()) { + cfgs = info.getManagedProject().getConfigurations(); } else { - boolean fullBuildNeeded = info.needsRebuild(); - IBuildDescription des = null; - - IResourceDelta delta = kind == FULL_BUILD ? null : getDelta(getProject()); - if(delta == null) - fullBuildNeeded = true; - if(cfg.needsRebuild() || delta != null){ - //use a build desacription model to calculate the resources to be cleaned - //only in case there are some changes to the project sources or build information - try{ - int flags = BuildDescriptionManager.REBUILD | BuildDescriptionManager.DEPFILES | BuildDescriptionManager.DEPS; - if(delta != null) - flags |= BuildDescriptionManager.REMOVED; + cfgs = new IConfiguration[] {info.getDefaultConfiguration() }; + } + + for (IConfiguration cfg : cfgs) { + updateOtherConfigs(cfg, kind); - outputTrace(getProject().getName(), "using a build description.."); //$NON-NLS-1$ + if(((Configuration)cfg).isInternalBuilderEnabled()){ + invokeInternalBuilder(cfg, kind != FULL_BUILD, ((Configuration)cfg).getInternalBuilderIgnoreErr(), monitor); - des = BuildDescriptionManager.createBuildDescription(info.getDefaultConfiguration(), getDelta(getProject()), flags); - - BuildDescriptionManager.cleanGeneratedRebuildResources(des); - } catch (Throwable e){ - //TODO: log error - outputError(getProject().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(info.needsRebuild()){ - //make a full clean if an info needs a rebuild - clean(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); - fullBuildNeeded = true; - } - else if(delta != null && !fullBuildNeeded){ - // Create a delta visitor to detect the build type - ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(info); - delta.accept(visitor); - if (visitor.shouldBuildFull()) { + // Scrub the build info the project + info.setRebuildState(false); + return referencedProjects; + } + + // Create a makefile generator for the build + IManagedBuilderMakefileGenerator generator = ManagedBuildManager.getBuildfileGenerator(info.getDefaultConfiguration()); + generator.initialize(getProject(), info, monitor); + + //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(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); + fullBuild(info, generator, monitor); + } else { + boolean fullBuildNeeded = info.needsRebuild(); + IBuildDescription des = null; + + IResourceDelta delta = kind == FULL_BUILD ? null : getDelta(getProject()); + if(delta == null) + fullBuildNeeded = true; + if(cfg.needsRebuild() || delta != null){ + //use a build desacription model to calculate the resources to be cleaned + //only in case there are some changes to the project sources or build information + try{ + int flags = BuildDescriptionManager.REBUILD | BuildDescriptionManager.DEPFILES | BuildDescriptionManager.DEPS; + if(delta != null) + flags |= BuildDescriptionManager.REMOVED; + + outputTrace(getProject().getName(), "using a build description.."); //$NON-NLS-1$ + + des = BuildDescriptionManager.createBuildDescription(info.getDefaultConfiguration(), getDelta(getProject()), flags); + + BuildDescriptionManager.cleanGeneratedRebuildResources(des); + } catch (Throwable e){ + //TODO: log error + outputError(getProject().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(info.needsRebuild()){ + //make a full clean if an info needs a rebuild clean(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); fullBuildNeeded = true; } + else if(delta != null && !fullBuildNeeded){ + // Create a delta visitor to detect the build type + ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(info); + delta.accept(visitor); + if (visitor.shouldBuildFull()) { + clean(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); + fullBuildNeeded = true; + } + } } } - } - if(fullBuildNeeded){ - outputTrace(getProject().getName(), "performing a full build"); //$NON-NLS-1$ - fullBuild(info, generator, monitor); - } else { - outputTrace(getProject().getName(), "performing an incremental build"); //$NON-NLS-1$ - incrementalBuild(delta, info, generator, monitor); + if(fullBuildNeeded){ + outputTrace(getProject().getName(), "performing a full build"); //$NON-NLS-1$ + fullBuild(info, generator, monitor); + } else { + outputTrace(getProject().getName(), "performing an incremental build"); //$NON-NLS-1$ + incrementalBuild(delta, info, generator, monitor); + } } } -/* + /* // So let's figure out why we got called if (kind == FULL_BUILD) { outputTrace(getProject().getName(), "Full build needed/requested"); //$NON-NLS-1$ @@ -544,7 +551,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { } } } -*/ + */ // Scrub the build info the project info.setRebuildState(false); // Ask build mechanism to compute deltas for project dependencies next time diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java index 643f2d3886a..b98e8e058e6 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java @@ -19,9 +19,13 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.Preferences; public abstract class ACBuilder extends IncrementalProjectBuilder implements IMarkerGenerator { + private static final String PREF_BUILD_ALL_CONFIGS = "build.all.configs.enabled"; + private static final Preferences prefs = CCorePlugin.getDefault().getPluginPreferences(); + /** * Constructor for ACBuilder */ @@ -90,4 +94,13 @@ public abstract class ACBuilder extends IncrementalProjectBuilder implements IMa } return IMarker.SEVERITY_ERROR; } + + public static boolean needAllConfigBuild() { + return prefs.getBoolean(PREF_BUILD_ALL_CONFIGS); + } + + public static void setAllConfigBuild(boolean enable) { + prefs.setValue(PREF_BUILD_ALL_CONFIGS, enable); + } + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CPluginPreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CPluginPreferencePage.java index 584a5ab6e49..cc0e3a82b2e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CPluginPreferencePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CPluginPreferencePage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2007 IBM Corporation and others. + * Copyright (c) 2000, 2008 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 @@ -18,13 +18,17 @@ import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.resources.ACBuilder; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; @@ -37,6 +41,9 @@ import org.eclipse.cdt.internal.ui.util.PixelConverter; public class CPluginPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { private static final String USE_STRUCTURAL_PARSE_MODE_LABEL= PreferencesMessages.CPluginPreferencePage_structuralParseMode_label; + private static final int GROUP_VINDENT = 5; + private static final int GROUP_HINDENT = 20; + private Button b1, b2; public CPluginPreferencePage() { super(GRID); @@ -71,6 +78,48 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); gd.horizontalSpan= 1; noteControl.setLayoutData(gd); + + // Build either default cfg or all. + Group gr = new Group(parent, SWT.NONE); + gr.setText(PreferencesMessages.CPluginPreferencePage_0); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.verticalIndent = GROUP_VINDENT; + gr.setLayoutData(gd); + gr.setLayout(new GridLayout()); + + Label l1 = new Label(gr, SWT.NONE); + l1.setText(PreferencesMessages.CPluginPreferencePage_1); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.verticalIndent = GROUP_VINDENT; + l1.setLayoutData(gd); + + boolean b = ACBuilder.needAllConfigBuild(); + + b1 = new Button(gr, SWT.RADIO); + b1.setText(PreferencesMessages.CPluginPreferencePage_2); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.verticalIndent = GROUP_VINDENT; + gd.horizontalIndent = GROUP_HINDENT; + b1.setLayoutData(gd); + b1.setSelection(!b); + + b2 = new Button(gr, SWT.RADIO); + b2.setText(PreferencesMessages.CPluginPreferencePage_3); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalIndent = GROUP_HINDENT; + b2.setLayoutData(gd); + b2.setSelection(b); + + noteControl= createNoteComposite( + JFaceResources.getDialogFont(), + gr, + PreferencesMessages.CPluginPreferencePage_note, + PreferencesMessages.CPluginPreferencePage_4); + gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.verticalIndent = GROUP_VINDENT; + noteControl.setLayoutData(gd); + + } protected void addFiller(Composite composite) { @@ -94,6 +143,9 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.PREF_USE_STRUCTURAL_PARSE_MODE); } + public static void setBuildAllMode3(boolean enable) { + } + /** * @see IWorkbenchPreferencePage#init */ @@ -106,6 +158,7 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements public static void initDefaults(IPreferenceStore prefs) { prefs.setDefault(PreferenceConstants.PREF_LINK_TO_EDITOR, false); prefs.setDefault(PreferenceConstants.PREF_USE_STRUCTURAL_PARSE_MODE, false); + ACBuilder.setAllConfigBuild(false); } /* (non-Javadoc) @@ -116,7 +169,14 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements return false; // tell the Core Plugin about this preference CCorePlugin.getDefault().setStructuralParseMode(useStructuralParseMode()); + ACBuilder.setAllConfigBuild(b2.getSelection()); return true; } + protected void performDefaults() { + super.performDefaults(); + ACBuilder.setAllConfigBuild(false); + b1.setSelection(true); + b2.setSelection(false); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java index c67f5911d78..d7864ca419a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java @@ -287,6 +287,11 @@ public final class PreferencesMessages extends NLS { public static String FileLanguagesPropertyPage_missingLanguage; public static String FileLanguagesPropertyPage_mappingTableTitle; + public static String CPluginPreferencePage_0; + public static String CPluginPreferencePage_1; + public static String CPluginPreferencePage_2; + public static String CPluginPreferencePage_3; + public static String CPluginPreferencePage_4; public static String CPluginPreferencePage_caption; public static String CPluginPreferencePage_structuralParseMode_label; public static String CPluginPreferencePage_note; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties index 54adc48378f..58c9791e1aa 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties @@ -325,6 +325,11 @@ FileLanguagesPropertyPage_mappingTableTitle = Language mappings for this file ProposalFilterPreferencesUtil_defaultFilterName= # C/C++ Preferences +CPluginPreferencePage_0=Build scope +CPluginPreferencePage_1=Functions 'Build project', 'Build All', 'Build Working Set' should... +CPluginPreferencePage_2=build ACTIVE CONFIGURATION in each project +CPluginPreferencePage_3=build ALL CONFIGURATIONS in each project +CPluginPreferencePage_4=This feature is applicable only to projects which support separate configurations. CPluginPreferencePage_caption= General settings for C/C++ Development: CPluginPreferencePage_structuralParseMode_label= Follow unindexed header files when producing the outline view CPluginPreferencePage_note= Note: