Update LOG process.

1. Sort all log messages by module. Logs at the bottom of build.log is all logs already print to cmd
2. Once one module occurs error, print all logs belongs to this module’s


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1516 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
wuyizhong 2006-09-12 07:16:25 +00:00
parent 63062e1ead
commit 498e9021f5
5 changed files with 102 additions and 33 deletions

View File

@ -103,7 +103,7 @@ public class FrameworkBuildTask extends Task{
///
/// The concurrent thread number
///
public static int MAX_CONCURRENT_THREAD_NUMBER = 1;
public static int MAX_CONCURRENT_THREAD_NUMBER = 2;
///
/// there are three type: all (build), clean and cleanall

View File

@ -600,7 +600,7 @@ public class GenBuildTask extends Ant {
ModuleIdentification[] libinstances = saq.getLibraryInstance(fpdModuleId.getArch());
String propertyLibs = "";
for (int i = 0; i < libinstances.length; i++) {
propertyLibs += " " + getProject().getProperty("BIN_DIR") + File.separatorChar + libinstances[i].getName() + ".lib";
propertyLibs += getProject().getProperty("BIN_DIR") + File.separatorChar + libinstances[i].getName() + ".lib" + " ";
}
getProject().setProperty("LIBS", propertyLibs.replaceAll("(\\\\)", "/"));

View File

@ -24,6 +24,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Property;
import org.tianocore.build.GenBuildTask;
import org.tianocore.build.fpd.FpdParserForThread;
import org.tianocore.build.global.GenBuildLogger;
import org.tianocore.build.id.FpdModuleIdentification;
import org.tianocore.build.id.ModuleIdentification;
import org.tianocore.common.logger.EdkLog;
@ -65,7 +66,9 @@ public class GenBuildThread implements Runnable {
}
status = FpdParserForThread.STATUS_START_RUN;
thread.start();
return true;
}
@ -129,27 +132,40 @@ public class GenBuildThread implements Runnable {
newProject.setInputHandler(project.getInputHandler());
Iterator listenerIter = project.getBuildListeners().iterator();
GenBuildLogger newLogger = null;
while (listenerIter.hasNext()) {
newProject.addBuildListener((BuildListener)listenerIter.next());
BuildListener item = (BuildListener)listenerIter.next();
if (item instanceof GenBuildLogger) {
newLogger = (GenBuildLogger)((GenBuildLogger)item).clone();
newLogger.setId(fpdModuleId);
newProject.addBuildListener(newLogger);
} else {
newProject.addBuildListener(item);
}
}
project.initSubProject(newProject);
genBuildTask.setProject(newProject);
genBuildTask.setExternalProperties(properties);
genBuildTask.parentId = parentModuleId;
genBuildTask.execute();
} catch (BuildException be) {
FpdParserForThread.tg.interrupt();
EdkLog.log("GenBuild", EdkLog.EDK_ALWAYS, moduleId + " with Arch " + arch +" build error. \n" + be.getMessage());
FpdParserForThread.isError = true;
if (FpdParserForThread.errorModule == null) {
FpdParserForThread.errorModule = fpdModuleId;
}
synchronized (FpdParserForThread.deamonSemaphore) {
FpdParserForThread.subCount();
FpdParserForThread.deamonSemaphore.notifyAll();
}
return ;
}

View File

@ -67,7 +67,7 @@ public class FpdParserForThread extends FpdParserTask {
public static ThreadGroup tg = new ThreadGroup("Framework");
public static boolean isError = false;
public static FpdModuleIdentification errorModule = null;
/**
Public construct method. It is necessary for ANT task.
@ -163,10 +163,7 @@ public class FpdParserForThread extends FpdParserTask {
// Waiting for all thread over, or time out
//
synchronized (deamonSemaphore) {
//
// Initialize BUGBUG
//
while (true) {
//
// If all modules are already built
@ -231,15 +228,22 @@ public class FpdParserForThread extends FpdParserTask {
try {
deamonSemaphore.wait();
if (isError) {
//
// if find error. Let other threads to finish
//
if (errorModule != null) {
while (currentRunNumber > 0) {
deamonSemaphore.wait();
}
GenBuildLogger.setCacheEnable(false);
GenBuildLogger.flushErrorModuleLog(errorModule);
EdkLog.flushLogToFile(new File(buildDir + File.separatorChar + "build.log"));
GenBuildLogger.maskAllLog(true);
FpdParserForThread.tg.destroy();
GenBuildLogger.maskAllLog(false);
throw new BuildException("One thread error. ");
throw new BuildException(errorModule + " build error. ");
}
} catch (InterruptedException ex) {
BuildException e = new BuildException("Thread wait Error. \n" + ex.getMessage());
@ -270,7 +274,6 @@ public class FpdParserForThread extends FpdParserTask {
ant.execute();
EdkLog.flushLogToFile(new File(buildDir + File.separatorChar + "build.log"));
}

View File

@ -24,7 +24,8 @@ import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
@ -36,13 +37,13 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.util.StringUtils;
import org.tianocore.build.id.Identification;
import org.tianocore.build.id.FpdModuleIdentification;
import org.tianocore.common.logger.EdkLog;
import org.tianocore.common.logger.LogMethod;
public class GenBuildLogger extends DefaultLogger implements LogMethod {
private Project project = null;
Project project = null;
///
/// flag to present whether cache all msg or not
@ -52,9 +53,9 @@ public class GenBuildLogger extends DefaultLogger implements LogMethod {
private static boolean enableFlag = true;
private static Map<Identification, List<String>> map = new HashMap<Identification, List<String> >(256);
private static Map<FpdModuleIdentification, List<String>> map = new LinkedHashMap<FpdModuleIdentification, List<String> >(256);
private Identification id = null;
private FpdModuleIdentification id = null;
public GenBuildLogger () {
@ -64,11 +65,6 @@ public class GenBuildLogger extends DefaultLogger implements LogMethod {
this.project = project;
}
public GenBuildLogger (Project project, Identification id) {
this.project = project;
this.id = id;
}
/**
Rules: flag = false: means no cache Action: Print it to console
@ -108,6 +104,16 @@ public class GenBuildLogger extends DefaultLogger implements LogMethod {
break;
}
}
public static void flushErrorModuleLog(FpdModuleIdentification errorModuleId) {
List<String> errorLogs = map.get(errorModuleId);
if (errorLogs != null) {
EdkLog.log("ErrorLog", EdkLog.EDK_ERROR, errorModuleId + " error logs: ");
for(int i = 0; i < errorLogs.size(); i++) {
EdkLog.log(EdkLog.EDK_ERROR, errorLogs.get(i));
}
}
}
public void flushToFile(File file) {
//
@ -117,10 +123,33 @@ public class GenBuildLogger extends DefaultLogger implements LogMethod {
log("Logging", msg, Project.MSG_INFO);
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
List<String> allMessages = map.get(null);
for(int i = 0; i < allMessages.size(); i++) {
bw.write(allMessages.get(i));
Iterator<FpdModuleIdentification> iter = map.keySet().iterator();
List<String> mainLogs = null;
while (iter.hasNext()) {
FpdModuleIdentification item = iter.next();
if(item == null) {
mainLogs = map.get(item);
continue ;
}
bw.write(">>>>>>>>>>>>>");
bw.write(" " + item + " Build Log ");
bw.write(">>>>>>>>>>>>>");
bw.newLine();
List<String> allMessages = map.get(item);
for(int i = 0; i < allMessages.size(); i++) {
bw.write(allMessages.get(i));
bw.newLine();
}
}
if (mainLogs != null) {
bw.write(">>>>>>>>>>>>>");
bw.write(" Main Logs (already print to command) ");
bw.write(">>>>>>>>>>>>>");
bw.newLine();
for(int i = 0; i < mainLogs.size(); i++) {
bw.write(mainLogs.get(i));
bw.newLine();
}
}
bw.flush();
bw.close();
@ -197,7 +226,6 @@ public class GenBuildLogger extends DefaultLogger implements LogMethod {
} else if(!flag) {
printMessage(msg, out, currentLevel);
}
log(msg);
}
}
@ -222,4 +250,26 @@ public class GenBuildLogger extends DefaultLogger implements LogMethod {
map.put(this.id, list);
}
}
public Object clone() {
GenBuildLogger newLogger = new GenBuildLogger();
//
// Transfer emacs mode, out, err, level to new Logger
//
newLogger.setEmacsMode(this.emacsMode);
newLogger.setOutputPrintStream(this.out);
newLogger.setErrorPrintStream(this.err);
newLogger.setMessageOutputLevel(this.msgOutputLevel);
//
// Transfer project
//
newLogger.project = this.project;
return newLogger;
}
public void setId(FpdModuleIdentification id) {
this.id = id;
}
}