diff --git a/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form b/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form index 729a320ebec4..976e2ed482a3 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form +++ b/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form @@ -1,6 +1,6 @@
- + @@ -10,7 +10,7 @@ - + @@ -95,7 +95,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -119,7 +119,7 @@ - + @@ -149,6 +149,14 @@ + + + + + + + + diff --git a/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java b/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java index 57e1ad71c8f7..1119311d695e 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java +++ b/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java @@ -55,6 +55,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura private JTextField myVMOptionsField; private JLabel myHeapSizeLabel; private JLabel myVMOptionsLabel; + private JCheckBox myCbRebuildOnDependencyChange; public CompilerUIConfigurable(final Project project) { myProject = project; @@ -84,6 +85,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura myCbUseExternalBuild.setSelected(workspaceConfiguration.USE_COMPILE_SERVER); myCbEnableAutomake.setSelected(workspaceConfiguration.MAKE_PROJECT_ON_SAVE); myCbParallelCompilation.setSelected(workspaceConfiguration.PARALLEL_COMPILATION); + myCbRebuildOnDependencyChange.setSelected(workspaceConfiguration.REBUILD_ON_DEPENDENCY_CHANGE); myHeapSizeField.setText(String.valueOf(workspaceConfiguration.COMPILER_PROCESS_HEAP_SIZE)); final String options = workspaceConfiguration.COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS; myVMOptionsField.setText(options == null? "" : options.trim()); @@ -115,6 +117,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura workspaceConfiguration.USE_COMPILE_SERVER = myCbUseExternalBuild.isSelected(); workspaceConfiguration.MAKE_PROJECT_ON_SAVE = myCbEnableAutomake.isSelected(); workspaceConfiguration.PARALLEL_COMPILATION = myCbParallelCompilation.isSelected(); + workspaceConfiguration.REBUILD_ON_DEPENDENCY_CHANGE = myCbRebuildOnDependencyChange.isSelected(); try { workspaceConfiguration.COMPILER_PROCESS_HEAP_SIZE = Integer.parseInt(myHeapSizeField.getText().trim()); } @@ -173,6 +176,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura isModified |= ComparingUtils.isModified(myCbUseExternalBuild, workspaceConfiguration.USE_COMPILE_SERVER); isModified |= ComparingUtils.isModified(myCbEnableAutomake, workspaceConfiguration.MAKE_PROJECT_ON_SAVE); isModified |= ComparingUtils.isModified(myCbParallelCompilation, workspaceConfiguration.PARALLEL_COMPILATION); + isModified |= ComparingUtils.isModified(myCbRebuildOnDependencyChange, workspaceConfiguration.REBUILD_ON_DEPENDENCY_CHANGE); isModified |= ComparingUtils.isModified(myHeapSizeField, workspaceConfiguration.COMPILER_PROCESS_HEAP_SIZE); isModified |= ComparingUtils.isModified(myVMOptionsField, workspaceConfiguration.COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS); @@ -211,6 +215,7 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura private void updateExternalMakeOptionControls(boolean enabled) { myCbEnableAutomake.setEnabled(enabled); myCbParallelCompilation.setEnabled(enabled); + myCbRebuildOnDependencyChange.setEnabled(enabled); myHeapSizeField.setEnabled(enabled); myVMOptionsField.setEnabled(enabled); myHeapSizeLabel.setEnabled(enabled); diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index c37fd886da48..e16b3d91c4c1 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -827,6 +827,7 @@ public class BuildManager implements ApplicationComponent{ cmdLine.addParameter("-D"+ GlobalOptions.GENERATE_CLASSPATH_INDEX_OPTION +"=" + shouldGenerateIndex); } cmdLine.addParameter("-D"+ GlobalOptions.COMPILE_PARALLEL_OPTION +"=" + Boolean.toString(config.PARALLEL_COMPILATION)); + cmdLine.addParameter("-D"+ GlobalOptions.REBUILD_ON_DEPENDENCY_CHANGE_OPTION + "=" + Boolean.toString(config.REBUILD_ON_DEPENDENCY_CHANGE)); if (Boolean.TRUE.equals(Boolean.valueOf(System.getProperty("java.net.preferIPv4Stack", "false")))) { cmdLine.addParameter("-Djava.net.preferIPv4Stack=true"); diff --git a/java/compiler/openapi/src/com/intellij/compiler/CompilerWorkspaceConfiguration.java b/java/compiler/openapi/src/com/intellij/compiler/CompilerWorkspaceConfiguration.java index 89fdd636d344..0445ab0cd742 100644 --- a/java/compiler/openapi/src/com/intellij/compiler/CompilerWorkspaceConfiguration.java +++ b/java/compiler/openapi/src/com/intellij/compiler/CompilerWorkspaceConfiguration.java @@ -42,6 +42,7 @@ public class CompilerWorkspaceConfiguration implements PersistentStateComponent< public boolean PARALLEL_COMPILATION = false; public int COMPILER_PROCESS_HEAP_SIZE = DEFAULT_COMPILE_PROCESS_HEAP_SIZE; public String COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS = DEFAULT_COMPILE_PROCESS_VM_OPTIONS; + public boolean REBUILD_ON_DEPENDENCY_CHANGE = true; public static CompilerWorkspaceConfiguration getInstance(Project project) { return ServiceManager.getService(project, CompilerWorkspaceConfiguration.class); diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/GlobalOptions.java b/jps/jps-builders/src/org/jetbrains/jps/api/GlobalOptions.java index d772b3c6c1b4..67073eb67b94 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/GlobalOptions.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/GlobalOptions.java @@ -25,4 +25,5 @@ public interface GlobalOptions { String GENERATE_CLASSPATH_INDEX_OPTION = "generate.classpath.index"; String COMPILE_PARALLEL_OPTION = "compile.parallel"; String COMPILE_PARALLEL_MAX_THREADS_OPTION = "compile.parallel.max.threads"; + String REBUILD_ON_DEPENDENCY_CHANGE_OPTION = "rebuild.on.dependency.change"; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java index c924d6d5e345..25effec23dca 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java @@ -22,10 +22,13 @@ import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.impl.BuildOutputConsumerImpl; import org.jetbrains.jps.builders.impl.BuildTargetChunk; import org.jetbrains.jps.builders.impl.DirtyFilesHolderBase; +import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.builders.logging.ProjectBuilderLogger; import org.jetbrains.jps.builders.storage.SourceToOutputMapping; import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.fs.BuildFSState; +import org.jetbrains.jps.incremental.messages.BuildMessage; +import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.incremental.messages.DoneSomethingNotification; import org.jetbrains.jps.incremental.messages.FileDeletedEvent; import org.jetbrains.jps.incremental.storage.BuildDataManager; @@ -48,17 +51,25 @@ public class BuildOperations { final ProjectDescriptor pd = context.getProjectDescriptor(); final Timestamps timestamps = pd.timestamps.getStorage(); final BuildTargetConfiguration configuration = pd.getTargetsState().getTargetConfiguration(target); - + boolean isTargetConfigChange = false; if (context.isProjectRebuild()) { FSOperations.markDirtyFiles(context, target, timestamps, true, null, null); pd.fsState.markInitialScanPerformed(target); configuration.save(); } - else if (context.getScope().isRecompilationForced(target) || configuration.isTargetDirty() || configuration.outputRootWasDeleted(context)) { + else if (context.getScope().isRecompilationForced(target) || + (isTargetConfigChange = configuration.isTargetDirty()) || + configuration.outputRootWasDeleted(context)) { initTargetFSState(context, target, true); IncProjectBuilder.clearOutputFiles(context, target); pd.dataManager.cleanTargetStorages(target); configuration.save(); + + if (isTargetConfigChange && ModuleBuildTarget.REBUILD_ON_DEPENDENCY_CHANGE && JavaModuleBuildTargetType.PRODUCTION.equals(target.getTargetType())) { + final String moduleName = ((ModuleBuildTarget)target).getModule().getName(); + context.processMessage(new CompilerMessage("", BuildMessage.Kind.INFO, "Rebuilding module \"" + moduleName + "\" because of dependencies change")); + } + } else if (!pd.fsState.isInitialScanPerformed(target)) { initTargetFSState(context, target, false); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java index e27534b98d40..2ae917dcf319 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java @@ -22,6 +22,7 @@ import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.ProjectPaths; +import org.jetbrains.jps.api.GlobalOptions; import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.java.ExcludedJavaSourceRootProvider; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; @@ -50,6 +51,9 @@ import java.util.Set; * @author nik */ public final class ModuleBuildTarget extends JVMModuleBuildTarget { + public static final Boolean REBUILD_ON_DEPENDENCY_CHANGE = Boolean.valueOf( + System.getProperty(GlobalOptions.REBUILD_ON_DEPENDENCY_CHANGE_OPTION, "true") + ); private final JavaModuleBuildTargetType myTargetType; public ModuleBuildTarget(@NotNull JpsModule module, JavaModuleBuildTargetType targetType) { @@ -169,10 +173,13 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget