diff options
8 files changed, 176 insertions, 177 deletions
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java index f1307bb6bac..98498c8cb4d 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java @@ -14,7 +14,6 @@ import org.eclipse.cdt.core.settings.model.ICMultiItemsHolder; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildProperty; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue; import org.eclipse.cdt.managedbuilder.internal.core.Builder; -import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; /** * This class is to combine multiple configurations to one to support @@ -26,12 +25,13 @@ import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; public interface IMultiConfiguration extends IConfiguration, ICMultiItemsHolder { /** - * Check if the configuration's builder is operating in parallel mode. - * @return {@code true} if parallel mode is enabled, {@code false} otherwise. + * Check if all configurations' builders are operating in parallel mode. + * @return {@code true} if parallel mode is enabled for all configurations, + * {@code false} otherwise. */ boolean getParallelDef(); /** - * Set parallel execution mode for the configuration's builder. + * Set same parallel execution mode for all configurations' builders. * @see Builder#setParallelBuildOn(boolean) * * @param parallel - the flag to enable or disable parallel mode. @@ -39,18 +39,16 @@ public interface IMultiConfiguration extends IConfiguration, ICMultiItemsHolder void setParallelDef(boolean parallel); /** - * Returns maximum number of parallel threads/jobs used by the configuration's builder. - * Note that this function can return negative value to indicate "optimal" number. - * + * Returns maximum number of parallel threads/jobs used by the configurations' builders. * @see #setParallelDef(boolean) - * @see Builder#getParallelizationNum() * - * @return - maximum number of parallel threads or jobs used by the builder or negative number. - * For exact interpretation see table in {@link IMakeCommonBuildInfo#getParallelizationNum()} + * @return - maximum number of parallel threads or jobs used by each builder or 0 if the numbers + * don't match. */ int getParallelNumber(); + /** - * Sets maximum number of parallel threads/jobs to be used by builder. + * Sets maximum number of parallel threads/jobs to be used by each builder. * Note that the number will be set only if the builder is in "parallel" * mode. * @@ -61,10 +59,9 @@ public interface IMultiConfiguration extends IConfiguration, ICMultiItemsHolder void setParallelNumber(int jobs); /** - * returns the Internal Builder parallel mode - * if true, internal builder will work in parallel mode - * otherwise it will use only one thread - * @return boolean + * Check if all configurations' internal builders are operating in parallel mode. + * @return {@code true} if parallel mode is enabled for all configurations, + * {@code false} otherwise. * * @deprecated since CDT 9.0. Use {@link #getParallelDef()} */ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java index 502c13732da..8c2cf096a4f 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java @@ -65,7 +65,7 @@ public class InternalBuildRunner extends AbstractBuildRunner { public boolean invokeBuild(int kind, IProject project, IConfiguration configuration, IBuilder builder, IConsole console, IMarkerGenerator markerGenerator, IncrementalProjectBuilder projectBuilder, IProgressMonitor monitor) throws CoreException { - boolean isParallel = Math.abs(builder.getParallelizationNum()) > 1; + boolean isParallel = builder.getParallelizationNum() > 1; // boolean buildIncrementaly = true; boolean resumeOnErr = !builder.isStopOnError(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java index 7dfcedf63c4..814e0310bf8 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java @@ -206,7 +206,7 @@ public class ParallelBuilder { if(cwd == null) cwd = des.getDefaultBuildDirLocation(); int threads = 1; if (cfg instanceof Configuration) { - threads = Math.abs(((Configuration)cfg).getParallelNumber()); + threads = ((Configuration)cfg).getParallelNumber(); } ParallelBuilder builder = new ParallelBuilder(cwd, dirs, out, err, monitor, resumeOnErrors, buildIncrementally); builder.enqueueAll(des); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java index 22172cf3b8a..b9e27e02f97 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java @@ -67,6 +67,7 @@ import org.eclipse.cdt.managedbuilder.makegen.gnu.GnuMakefileGenerator; import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; +import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; @@ -123,7 +124,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider // parallelization private String parallelBuildCmd; private Boolean isParallelBuildEnabled; - private Integer parallelJobsNumber; // negative number denotes "optimal" value, see getOptimalParallelJobNum() + private Integer parallelNumberAttribute; // negative number denotes "optimal" value, see getOptimalParallelJobNum() private boolean isTest; @@ -331,7 +332,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider ignoreErrCmd = builder.ignoreErrCmd; isParallelBuildEnabled = builder.isParallelBuildEnabled; - parallelJobsNumber = builder.parallelJobsNumber; + parallelNumberAttribute = builder.parallelNumberAttribute; parallelBuildCmd = builder.parallelBuildCmd; if(builder.outputEntries != null){ @@ -381,9 +382,9 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } catch (CoreException e) { } } - if (getParallelizationNum() != builder.getParallelizationNum() && supportsParallelBuild()) { + if (getParallelizationNumAttribute() != builder.getParallelizationNumAttribute() && supportsParallelBuild()) { try { - setParallelizationNum(builder.getParallelizationNum()); + setParallelizationNum(builder.getParallelizationNumAttribute()); } catch (CoreException e) { } } @@ -631,29 +632,29 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider private void decodeParallelizationNumber(String value) { if (VALUE_OPTIMAL.equals(value)) { - parallelJobsNumber = -getOptimalParallelJobNum(); + parallelNumberAttribute = -getOptimalParallelJobNum(); } else if (VALUE_UNLIMITED.equals(value)) { if (!isInternalBuilder()) { - parallelJobsNumber = Integer.MAX_VALUE; + parallelNumberAttribute = Integer.MAX_VALUE; } else { ManagedBuilderCorePlugin.error("'unlimited' number of jobs is not allowed for Internal Builder, switching to 'optimal'"); - parallelJobsNumber = -getOptimalParallelJobNum(); + parallelNumberAttribute = -getOptimalParallelJobNum(); } } else { try { - parallelJobsNumber = Integer.decode(value); + parallelNumberAttribute = Integer.decode(value); } catch (NumberFormatException e) { ManagedBuilderCorePlugin.log(e); - parallelJobsNumber = getOptimalParallelJobNum(); + parallelNumberAttribute = getOptimalParallelJobNum(); } - if (parallelJobsNumber <= 0) { + if (parallelNumberAttribute <= 0) { // compatibility with legacy representation - it was that inconsistent if (isInternalBuilder()) { // "optimal" for Internal Builder - parallelJobsNumber = -getOptimalParallelJobNum(); + parallelNumberAttribute = -getOptimalParallelJobNum(); } else { // unlimited for External Builder - parallelJobsNumber = Integer.MAX_VALUE; + parallelNumberAttribute = Integer.MAX_VALUE; } } } @@ -918,8 +919,8 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider if (isParallelBuildEnabled != null) element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_ON, isParallelBuildEnabled.toString()); - if (isParallelBuildOn() && parallelJobsNumber != null) - element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, encodeParallelizationNumber(parallelJobsNumber)); + if (isParallelBuildOn() && parallelNumberAttribute != null) + element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, encodeParallelizationNumber(parallelNumberAttribute)); // Note: build file generator cannot be specified in a project file because // an IConfigurationElement is needed to load it! @@ -1016,8 +1017,8 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider if (isParallelBuildEnabled != null) element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_ON, isParallelBuildEnabled.toString()); - if (isParallelBuildOn() && parallelJobsNumber != null) - element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, encodeParallelizationNumber(parallelJobsNumber)); + if (isParallelBuildOn() && parallelNumberAttribute != null) + element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, encodeParallelizationNumber(parallelNumberAttribute)); // Note: build file generator cannot be specified in a project file because // an IConfigurationElement is needed to load it! @@ -1095,10 +1096,11 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider public String getArguments() { String args = getArgumentsAttribute(); String stopOnErrCmd = getStopOnErrCmd(isStopOnError()); - String parallelCmd = isParallelBuildOn() ? getParallelizationCmd(getParallelizationNum()) : EMPTY_STRING; + int parallelNum = getParallelizationNum(); + String parallelCmd = isParallelBuildOn() ? getParallelizationCmd(parallelNum) : EMPTY_STRING; String reversedStopOnErrCmd = getStopOnErrCmd(!isStopOnError()); - String reversedParallelBuildCmd = !isParallelBuildOn() ? getParallelizationCmd(getParallelizationNum()) : EMPTY_STRING; + String reversedParallelBuildCmd = !isParallelBuildOn() ? getParallelizationCmd(parallelNum) : EMPTY_STRING; args = removeCmd(args, reversedStopOnErrCmd); args = removeCmd(args, reversedParallelBuildCmd); @@ -1167,16 +1169,14 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return index; } - public String getParallelizationCmd(int num){ + public String getParallelizationCmd(int num) { String pattern = getParrallelBuildCmd(); - if(pattern.length() == 0){ - return EMPTY_STRING; - }if(num == 0){ + if (pattern.length() == 0 || num == 0) { return EMPTY_STRING; } // "unlimited" number of jobs results in not adding the number to parallelization cmd // that behavior corresponds that of "make" flag "-j". - return processParallelPattern(pattern, num == Integer.MAX_VALUE, Math.abs(num)); + return processParallelPattern(pattern, num == Integer.MAX_VALUE, num); } /** @@ -1188,6 +1188,8 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider * <br>Where # is num or empty if {@code empty} is {@code true}) */ private String processParallelPattern(String pattern, boolean empty, int num){ + Assert.isTrue(num > 0); + int start = pattern.indexOf(PARALLEL_PATTERN_NUM_START); int end = -1; boolean hasStartChar = false; @@ -2527,46 +2529,40 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } /** - * {@inheritDoc} - * - * Returns the number of parallel jobs to be used for a build. + * Returns the internal representation of maximum number of parallel jobs + * to be used for a build. * Note that "optimal" value is represented by negative number. - * See the table at {@link IMakeCommonBuildInfo#getParallelizationNum()}. + * + * The value of the number is encoded as follows: + * <pre> + * Status Returns + * No parallel 1 + * Optimal -CPU# (negative number of processors) + * Specific >0 (positive number) + * Unlimited Integer.MAX (N/A for Internal Builder) + * </pre> */ - @Override - public int getParallelizationNum() { + public int getParallelizationNumAttribute() { if (!isParallelBuildOn()) return 1; - - if(parallelJobsNumber == null){ - if(superClass != null){ - return ((Builder)superClass).getParallelizationNum(); - } - return 1; - } - return parallelJobsNumber.intValue(); - } - - public int getParallelizationNumAttribute(){ - if(parallelJobsNumber == null){ + + if(parallelNumberAttribute == null){ if(superClass != null){ return ((Builder)superClass).getParallelizationNumAttribute(); } return 1; } - return parallelJobsNumber.intValue(); + return parallelNumberAttribute.intValue(); + } + + @Override + public int getParallelizationNum() { + return Math.abs(getParallelizationNumAttribute()); } - /** - * {@inheritDoc} - * - * @param jobs - maximum number of jobs or threads. If the number is 0 - * or negative, negative "optimal" number will be set, see - * {@link #getOptimalParallelJobNum()}. - */ @Override public void setParallelizationNum(int jobs) throws CoreException { - if (isParallelBuildOn() && (parallelJobsNumber == null || parallelJobsNumber != jobs)) { + if (isParallelBuildOn() && (parallelNumberAttribute == null || parallelNumberAttribute != jobs)) { String curCmd = getParallelizationCmd(getParallelizationNum()); String args = getArgumentsAttribute(); String updatedArgs = removeCmd(args, curCmd); @@ -2579,10 +2575,10 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider jobs = -1; } if (jobs > 0) { - parallelJobsNumber = jobs; + parallelNumberAttribute = jobs; } else { // "optimal" - parallelJobsNumber = -getOptimalParallelJobNum(); + parallelNumberAttribute = -getOptimalParallelJobNum(); } setDirty(true); } @@ -2647,7 +2643,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider * * @param on - the flag to enable or disable parallel mode. * <br>{@code true} to enable, in this case the maximum number of jobs - * will be set to negative "optimal" number, see {@link #getOptimalParallelJobNum()}. + * will be set to "optimal" number, see {@link #getOptimalParallelJobNum()}. * <br>{@code false} to disable, the number of jobs will be set to 1. */ @Override @@ -2668,9 +2664,9 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider if (isParallelBuildEnabled) { // "optimal" - parallelJobsNumber = -getOptimalParallelJobNum(); + parallelNumberAttribute = -getOptimalParallelJobNum(); } else { - parallelJobsNumber = 1; + parallelNumberAttribute = 1; } setDirty(true); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index 271b1c94aef..5d552fc9594 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -2273,8 +2273,8 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * mode. * * @param jobs - maximum number of jobs or threads. If the number is 0 - * or negative, negative "optimal" number will be set, see - * {@link Builder#getOptimalParallelJobNum()}. + * or negative, "optimal" number will be set, + * see {@link Builder#getOptimalParallelJobNum()}. */ public void setParallelNumber(int jobs){ try { @@ -2286,13 +2286,9 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /** * Returns maximum number of parallel threads/jobs used by the configuration's builder. - * Note that this function can return negative value to indicate "optimal" number. - * * @see #setParallelDef(boolean) - * @see Builder#getParallelizationNum() * - * @return - maximum number of parallel threads or jobs used by the builder or negative number. - * For exact interpretation see table in {@link IMakeCommonBuildInfo#getParallelizationNum()} + * @return - maximum number of parallel threads or jobs used by the builder. */ public int getParallelNumber(){ return getBuilder().getParallelizationNum(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java index 3d1a919d7fa..553c78170b9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java @@ -44,15 +44,7 @@ public interface IMakeCommonBuildInfo { boolean supportsStopOnError(boolean on); /** - * @return the current number of parallel jobs. - * The value of the number is encoded as follows: - * <pre> - * Status Returns - * No parallel 1 - * Unlimited Integer.MAX (N/A for Internal Builder) - * Optimal -CPU# (negative number of processors) - * Specific >0 (positive number) - * </pre> + * @return the maximum number of parallel jobs to be used for build. */ int getParallelizationNum(); @@ -61,21 +53,25 @@ public interface IMakeCommonBuildInfo { * Note that the number will be set only if the builder is in "parallel" * mode. * - * @param jobs - number of jobs according table {@link #getParallelizationNum()}. + * @param jobs - maximum number of jobs. * Any number <=0 is treated as setting "optimal" property, - * the value of the number itself is ignored. + * the value of the number itself is ignored in this case. */ void setParallelizationNum(int jobs) throws CoreException; + /** * @return {@code true} if builder supports parallel build, * {@code false} otherwise. */ + boolean supportsParallelBuild(); + /** * @return {@code true} if builder support for parallel build is enabled, * {@code false} otherwise. */ boolean isParallelBuildOn(); + /** * Set parallel execution mode for the builder. * @see Builder#setParallelBuildOn(boolean) diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java index 0193eeb2362..543259ae733 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java @@ -25,7 +25,6 @@ import org.eclipse.cdt.managedbuilder.internal.core.Configuration; import org.eclipse.cdt.managedbuilder.internal.core.MultiConfiguration; import org.eclipse.cdt.managedbuilder.internal.ui.Messages; import org.eclipse.cdt.newmake.core.IMakeBuilderInfo; -import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; import org.eclipse.cdt.ui.newui.AbstractCPropertyTab; import org.eclipse.cdt.ui.newui.ICPropertyProvider; import org.eclipse.core.runtime.CoreException; @@ -231,12 +230,12 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { * 0: isStopOnError * 1: supportsStopOnError(true) * 2: bld.supportsStopOnError(false) - * 3: cfg.getParallelDef() + * 3: N/A * Mode 2: * 0: b.isAutoBuildEnable() * 1: b.isIncrementalBuildEnabled() * 2: b.isCleanBuildEnabled() - * 3: getParallelDef() + * 3: N/A */ static int[] calc3states(ICPropertyProvider p, IConfiguration mcfg, int mode) { if (p.isMultiCfg() && mcfg instanceof ICMultiItemsHolder) { @@ -253,8 +252,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { (m1 ? bldr0.supportsStopOnError(true) : bldr0.isIncrementalBuildEnabled() ); b[2] = m0 ? bldr0.canKeepEnvironmentVariablesInBuildfile() : (m1 ? bldr0.supportsStopOnError(false) : bldr0.isCleanBuildEnabled()); - b[3] = m0 ? bldr0.keepEnvironmentVariablesInBuildfile() : - (m1 ? ((Configuration)cfgs[0]).getParallelDef() : getParallelDef(mcfg)); + b[3] = m0 ? bldr0.keepEnvironmentVariablesInBuildfile() : false; for (int i=1; i<cfgs.length; i++) { IBuilder bldr = cfgs[i].getBuilder(); if (b[0] != (m0 ? bldr.isManagedBuildOn() : @@ -266,9 +264,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { if (b[2] != (m0 ? bldr.canKeepEnvironmentVariablesInBuildfile() : (m1 ? bldr.supportsStopOnError(false) : bldr.isCleanBuildEnabled()))) res[2] = TRI_UNKNOWN; - if ((b[3] != (m0 ? bldr.keepEnvironmentVariablesInBuildfile() : - (m1 ? ((Configuration)cfgs[i]).getParallelDef() : getParallelDef(mcfg)))) - || ((IMultiConfiguration) mcfg).getParallelNumber() == 0) { + if (b[3] != (m0 ? bldr.keepEnvironmentVariablesInBuildfile() : false)) { res[3] = TRI_UNKNOWN; } } @@ -304,60 +300,22 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { bldr.supportsStopOnError(false)); } - // Parallel build - boolean isParallelSupported = bldr.supportsParallelBuild(); - boolean isExternalBuilder = ! isInternalBuilderEnabled(); - - b_parallel.setVisible(isParallelSupported); - b_parallelOptimal.setVisible(isParallelSupported); - b_parallelSpecific.setVisible(isParallelSupported); - b_parallelUnlimited.setVisible(isParallelSupported && isExternalBuilder); - s_parallelNumber.setVisible(isParallelSupported); - - if (isParallelSupported) { - if (extStates == null) { - setTriSelection(b_parallel, getParallelDef()); - } else { - setTriSelection(b_parallel, extStates[3]); - } - boolean isParallelSelected = b_parallel.getSelection(); - int optimalParallelNumber = bldr.getOptimalParallelJobNum(); - b_parallelOptimal.setText(MessageFormat.format(Messages.BuilderSettingsTab_UseOptimalJobs, optimalParallelNumber)); - b_parallelOptimal.setEnabled(isParallelSelected); - b_parallelSpecific.setEnabled(isParallelSelected); - b_parallelUnlimited.setEnabled(isParallelSelected && isExternalBuilder); - - extStates = calc3states(page, icfg, 2); - if (extStates == null) { - setTriSelection(b_autoBuild, bldr.isAutoBuildEnable()); - setTriSelection(b_cmdBuild, bldr.isIncrementalBuildEnabled()); - setTriSelection(b_cmdClean, bldr.isCleanBuildEnabled()); - } else { // multiple configurations selected - setTriSelection(b_autoBuild, extStates[0]); - setTriSelection(b_cmdBuild, extStates[1]); - setTriSelection(b_cmdClean, extStates[2]); - } - if ((extStates == null || extStates[3] != TRI_UNKNOWN) && isParallelSelected) { - // single configuration or matching multiple configurations here - int parallelNumber = getParallelNumber(); - boolean isOptimal = parallelNumber <= 0; - boolean isUnlimited = parallelNumber == Integer.MAX_VALUE; - b_parallelOptimal.setSelection(isOptimal); - b_parallelSpecific.setSelection(!isOptimal && !isUnlimited); - b_parallelUnlimited.setSelection(isUnlimited); - s_parallelNumber.setEnabled(b_parallelSpecific.getEnabled() && b_parallelSpecific.getSelection()); - s_parallelNumber.setSelection(s_parallelNumber.isEnabled() ? parallelNumber : optimalParallelNumber); - } else { - b_parallelOptimal.setSelection(true); - b_parallelSpecific.setSelection(false); - b_parallelUnlimited.setSelection(false); - s_parallelNumber.setEnabled(false); - s_parallelNumber.setSelection(optimalParallelNumber); - } - } + updateParallelBlock(); // Build commands + extStates = calc3states(page, icfg, 2); + if (extStates != null) { + // multiple configurations selected + setTriSelection(b_autoBuild, extStates[0]); + setTriSelection(b_cmdBuild, extStates[1]); + setTriSelection(b_cmdClean, extStates[2]); + } else { + setTriSelection(b_autoBuild, bldr.isAutoBuildEnable()); + setTriSelection(b_cmdBuild, bldr.isIncrementalBuildEnabled()); + setTriSelection(b_cmdClean, bldr.isCleanBuildEnabled()); + } + if (page.isMultiCfg()) { MultiConfiguration mc = (MultiConfiguration)icfg; t_autoBuild.setText(mc.getBuildAttribute(IBuilder.BUILD_TARGET_AUTO, EMPTY_STR)); @@ -377,7 +335,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { ((Control)t_cmdBuild.getData()).setVisible(external); t_cmdClean.setVisible(external); ((Control)t_cmdClean.getData()).setVisible(external); - + if (external) { checkPressed(b_autoBuild, false); checkPressed(b_cmdBuild, false); @@ -386,6 +344,86 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { canModify = true; } + private void updateParallelBlock() { + // note: for multi-config selection bldr is from Active cfg + + boolean isAnyInternalBuilder = bldr.isInternalBuilder(); + boolean isAnyExternalBuilder = ! bldr.isInternalBuilder(); + + boolean isParallelSupported = bldr.supportsParallelBuild(); + boolean isParallelOn = bldr.isParallelBuildOn(); + int triSelection = isParallelOn ? TRI_YES : TRI_NO; + + int parallelizationNumInternal = bldr.getParallelizationNumAttribute(); + int optimalParallelNumber = bldr.getOptimalParallelJobNum(); + int parallelNumber = bldr.getParallelizationNum(); + boolean isUnlimited = parallelizationNumInternal == Integer.MAX_VALUE; + + if (icfg instanceof ICMultiItemsHolder) { + IConfiguration[] cfgs = (IConfiguration[])((ICMultiItemsHolder)icfg).getItems(); + boolean isAnyParallelOn = isParallelOn; + boolean isAnyParallelSupported = isParallelSupported; + boolean isParallelDiffers = false; + for (IConfiguration cfg : cfgs) { + Builder builder = (Builder) cfg.getBuilder(); + isParallelDiffers = isParallelDiffers + || builder.isParallelBuildOn() != isParallelOn + || builder.getParallelizationNumAttribute() != parallelizationNumInternal; + + isAnyParallelOn = isAnyParallelOn || builder.isParallelBuildOn(); + isAnyParallelSupported = isAnyParallelSupported || builder.supportsParallelBuild(); + isAnyInternalBuilder = isAnyInternalBuilder || builder.isInternalBuilder(); + isAnyExternalBuilder = isAnyExternalBuilder || !builder.isInternalBuilder(); + } + + // reset initial display to "optimal" to enhance user experience: + if ((!isParallelSupported && isAnyParallelSupported) // parallel is supported by other than Active cfg + || (!isParallelOn && isAnyParallelOn) // prevent showing the 1 job as parallel in the spinner + || (isUnlimited && isAnyInternalBuilder) // can't show "unlimited" as it won't be selectable if Internal Builder present + ) { + isParallelSupported = true; + parallelizationNumInternal = -optimalParallelNumber; + parallelNumber = optimalParallelNumber; + isUnlimited = false; + } + if (isParallelSupported && isParallelDiffers) { + triSelection = TRI_UNKNOWN; + } + } + + b_parallel.setVisible(isParallelSupported); + b_parallelOptimal.setVisible(isParallelSupported); + b_parallelSpecific.setVisible(isParallelSupported); + b_parallelUnlimited.setVisible(isParallelSupported && isAnyExternalBuilder); + s_parallelNumber.setVisible(isParallelSupported); + + if (isParallelSupported) { + setTriSelection(b_parallel, triSelection); + boolean isParallelSelected = b_parallel.getSelection(); + + b_parallelOptimal.setText(MessageFormat.format(Messages.BuilderSettingsTab_UseOptimalJobs, optimalParallelNumber)); + b_parallelOptimal.setEnabled(isParallelSelected); + b_parallelSpecific.setEnabled(isParallelSelected); + b_parallelUnlimited.setEnabled(isParallelSelected && !isAnyInternalBuilder); + + if (isParallelSelected) { + boolean isOptimal = parallelizationNumInternal <= 0; + + b_parallelOptimal.setSelection(isOptimal); + b_parallelSpecific.setSelection(!isOptimal && !isUnlimited); + b_parallelUnlimited.setSelection(isUnlimited); + s_parallelNumber.setEnabled(b_parallelSpecific.getEnabled() && b_parallelSpecific.getSelection()); + s_parallelNumber.setSelection(s_parallelNumber.isEnabled() ? parallelNumber : optimalParallelNumber); + } else { + b_parallelOptimal.setSelection(true); + b_parallelSpecific.setSelection(false); + b_parallelUnlimited.setSelection(false); + s_parallelNumber.setEnabled(false); + s_parallelNumber.setSelection(optimalParallelNumber); + } + } + } + /** * Sets up text + corresponding button * Checkbox can be implemented either by Button or by TriButton @@ -489,7 +527,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { } b2.setStopOnError(b1.isStopOnError()); b2.setParallelBuildOn(b1.isParallelBuildOn()); - b2.setParallelizationNum(b1.getParallelizationNum()); + b2.setParallelizationNum(((Builder) b1).getParallelizationNumAttribute()); if (b2.canKeepEnvironmentVariablesInBuildfile()) b2.setKeepEnvironmentVariablesInBuildfile(b1.keepEnvironmentVariablesInBuildfile()); ((Builder)b2).setBuildPath(((Builder)b1).getBuildPathAttribute()); @@ -531,22 +569,6 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { updateData(getResDesc()); } - private static boolean getParallelDef(IConfiguration cfg) { - if (cfg instanceof Configuration) - return ((Configuration)cfg).getParallelDef(); - if (cfg instanceof IMultiConfiguration) - return ((IMultiConfiguration)cfg).getParallelDef(); - return false; - } - - private boolean getParallelDef() { - if (icfg instanceof Configuration) - return ((Configuration)icfg).getParallelDef(); - if (icfg instanceof IMultiConfiguration) - return ((IMultiConfiguration)icfg).getParallelDef(); - return false; - } - private void setParallelDef(boolean def) { if (icfg instanceof Configuration) ((Configuration)icfg).setParallelDef(def); @@ -554,16 +576,6 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { ((IMultiConfiguration)icfg).setParallelDef(def); } - /** - * @see IMakeCommonBuildInfo#getParallelizationNum() for interpretation of the number. - */ - private int getParallelNumber() { - if (icfg instanceof Configuration) - return ((Configuration)icfg).getParallelNumber(); - if (icfg instanceof IMultiConfiguration) - return ((IMultiConfiguration)icfg).getParallelNumber(); - return 0; - } private void setParallelNumber(int num) { if (icfg instanceof Configuration) ((Configuration)icfg).setParallelNumber(num); diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuilderSettingsTab.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuilderSettingsTab.java index f36ce4480e8..70f95210099 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuilderSettingsTab.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuilderSettingsTab.java @@ -87,6 +87,7 @@ public class BuilderSettingsTab extends AbstractCBuildPropertyTab { setupLabel(g1, Messages.BuilderSettingsTab_5, 1, GridData.BEGINNING); t_buildCmd = setupBlock(g1, b_useDefault); t_buildCmd.addModifyListener(new ModifyListener() { + @Override public void modifyText(ModifyEvent e) { if (! canModify) return; @@ -111,6 +112,7 @@ public class BuilderSettingsTab extends AbstractCBuildPropertyTab { setupLabel(group_dir, Messages.BuilderSettingsTab_22, 1, GridData.BEGINNING); t_dir = setupText(group_dir, 1, GridData.FILL_HORIZONTAL); t_dir.addModifyListener(new ModifyListener() { + @Override public void modifyText(ModifyEvent e) { if (canModify) setBuildPath(t_dir.getText()); |