external make: better diagnostic message for fully rebuilt modules

This commit is contained in:
Eugene Zhuravlev
2013-02-26 16:37:41 +01:00
parent a914af49be
commit c092d7ea14
3 changed files with 56 additions and 15 deletions
@@ -22,13 +22,10 @@ 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;
@@ -51,25 +48,16 @@ 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) ||
(isTargetConfigChange = configuration.isTargetDirty()) ||
configuration.outputRootWasDeleted(context)) {
else if (context.getScope().isRecompilationForced(target) || configuration.isTargetDirty(context) || 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);
@@ -49,10 +49,12 @@ import org.jetbrains.jps.cmdline.ProjectDescriptor;
import org.jetbrains.jps.incremental.fs.BuildFSState;
import org.jetbrains.jps.incremental.java.ExternalJavacDescriptor;
import org.jetbrains.jps.incremental.messages.*;
import org.jetbrains.jps.incremental.storage.BuildTargetConfiguration;
import org.jetbrains.jps.incremental.storage.OneToManyPathsMapping;
import org.jetbrains.jps.indices.ModuleExcludeIndex;
import org.jetbrains.jps.model.java.JpsJavaExtensionService;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.service.SharedThreadPool;
import org.jetbrains.jps.util.JpsPathUtil;
@@ -177,6 +179,7 @@ public class IncProjectBuilder {
context = createContext(scope, isMake, isProjectRebuild);
runBuild(context, forceCleanCaches);
myProjectDescriptor.dataManager.saveVersion();
reportRebuiltModules(context);
}
catch (ProjectBuildException e) {
final Throwable cause = e.getCause();
@@ -191,8 +194,9 @@ public class IncProjectBuilder {
throw new RebuildRequestedException(cause);
}
else {
reportRebuiltModules(context);
if (cause == null) {
// some builder desided to stop the build
// some builder decided to stop the build
// report optional progress message if exists
final String msg = e.getMessage();
if (!StringUtil.isEmpty(msg)) {
@@ -222,6 +226,41 @@ public class IncProjectBuilder {
}
}
private static void reportRebuiltModules(CompileContextImpl context) {
final Set<JpsModule> modules = BuildTargetConfiguration.MODULES_WITH_TARGET_CONFIG_CHANGED_KEY.get(context);
if (modules == null || modules.isEmpty()) {
return;
}
final StringBuilder message = new StringBuilder();
if (modules.size() > 1) {
message.append("Modules ");
final int namesLimit = 5;
int idx = 0;
for (Iterator<JpsModule> iterator = modules.iterator(); iterator.hasNext(); ) {
final JpsModule module = iterator.next();
if (idx == namesLimit && iterator.hasNext()) {
message.append(" and ").append(modules.size() - namesLimit).append(" others");
break;
}
if (idx > 0) {
message.append(", ");
}
message.append("\"").append(module.getName()).append("\"");
idx += 1;
}
message.append(" were");
}
else {
message.append("Module \"").append(modules.iterator().next().getName()).append("\" was");
}
message.append(" fully rebuilt due to project configuration");
if (ModuleBuildTarget.REBUILD_ON_DEPENDENCY_CHANGE) {
message.append("/dependencies");
}
message.append(" changes");
context.processMessage(new CompilerMessage("", BuildMessage.Kind.INFO, message.toString()));
}
private static void flushContext(CompileContext context) {
if (context != null) {
final ProjectDescriptor pd = context.getProjectDescriptor();
@@ -16,6 +16,7 @@
package org.jetbrains.jps.incremental.storage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.SmartList;
@@ -23,6 +24,8 @@ import gnu.trove.THashSet;
import org.jetbrains.jps.builders.BuildTarget;
import org.jetbrains.jps.incremental.CompileContext;
import org.jetbrains.jps.incremental.GlobalContextKey;
import org.jetbrains.jps.incremental.ModuleBuildTarget;
import org.jetbrains.jps.model.module.JpsModule;
import java.io.*;
import java.util.Collection;
@@ -34,6 +37,7 @@ import java.util.Set;
* @author nik
*/
public class BuildTargetConfiguration {
public static final Key<Set<JpsModule>> MODULES_WITH_TARGET_CONFIG_CHANGED_KEY = GlobalContextKey.create("_modules_with_target_config_changed_");
private static final Logger LOG = Logger.getInstance(BuildTargetConfiguration.class);
private final BuildTarget<?> myTarget;
private final BuildTargetsState myTargetsState;
@@ -60,7 +64,7 @@ public class BuildTargetConfiguration {
return "";
}
public boolean isTargetDirty() {
public boolean isTargetDirty(CompileContext context) {
final String currentState = getCurrentState();
if (!currentState.equals(myConfiguration)) {
LOG.debug(myTarget + " configuration was changed:");
@@ -69,6 +73,16 @@ public class BuildTargetConfiguration {
LOG.debug("New:");
LOG.debug(currentState);
LOG.debug(myTarget + " will be recompiled");
if (myTarget instanceof ModuleBuildTarget) {
final JpsModule module = ((ModuleBuildTarget)myTarget).getModule();
synchronized (MODULES_WITH_TARGET_CONFIG_CHANGED_KEY) {
Set<JpsModule> modules = MODULES_WITH_TARGET_CONFIG_CHANGED_KEY.get(context);
if (modules == null) {
MODULES_WITH_TARGET_CONFIG_CHANGED_KEY.set(context, modules = new THashSet<JpsModule>());
}
modules.add(module);
}
}
return true;
}
return false;