]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Java/Source/GenBuild/org/tianocore/build/global/GenBuildLogger.java
Support MSA build options. Now the build options from four places: 1. tools_def.txt
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / global / GenBuildLogger.java
CommitLineData
b9546cc8 1/*++\r
2\r
c8df018e 3 Copyright (c) 2006, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
b9546cc8 8\r
c8df018e 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
b9546cc8 11\r
c8df018e 12 Module Name:\r
13 GenBuildLogger.java\r
b9546cc8 14\r
c8df018e 15 Abstract:\r
b9546cc8 16\r
c8df018e 17 --*/\r
b9546cc8 18\r
19package org.tianocore.build.global;\r
ff225cbb 20\r
2eb7d78d 21import java.io.BufferedReader;\r
22import java.io.BufferedWriter;\r
c8df018e 23import java.io.File;\r
2eb7d78d 24import java.io.FileWriter;\r
25import java.io.IOException;\r
26import java.io.StringReader;\r
498e9021 27import java.util.Iterator;\r
28import java.util.LinkedHashMap;\r
c8df018e 29import java.util.List;\r
2eb7d78d 30import java.util.Map;\r
c8df018e 31import java.util.Vector;\r
32\r
2eb7d78d 33import org.apache.tools.ant.BuildEvent;\r
34import org.apache.tools.ant.BuildException;\r
35import org.apache.tools.ant.DefaultLogger;\r
b9546cc8 36import org.apache.tools.ant.Project;\r
91f7d582 37import org.apache.tools.ant.Task;\r
2eb7d78d 38import org.apache.tools.ant.util.StringUtils;\r
ff225cbb 39\r
498e9021 40import org.tianocore.build.id.FpdModuleIdentification;\r
c8df018e 41import org.tianocore.common.logger.EdkLog;\r
ff225cbb 42import org.tianocore.common.logger.LogMethod;\r
b9546cc8 43\r
2eb7d78d 44public class GenBuildLogger extends DefaultLogger implements LogMethod {\r
45 \r
498e9021 46 Project project = null;\r
188fdd0a 47 \r
c8df018e 48 ///\r
49 /// flag to present whether cache all msg or not\r
2eb7d78d 50 /// true means to cache.\r
c8df018e 51 ///\r
2eb7d78d 52 private static boolean flag = false;\r
c8df018e 53\r
498e9021 54 private static Map<FpdModuleIdentification, List<String>> map = new LinkedHashMap<FpdModuleIdentification, List<String> >(256);\r
2eb7d78d 55 \r
498e9021 56 private FpdModuleIdentification id = null;\r
5776c5c0 57 //\r
58 // semaroph for multi thread\r
59 // \r
60 public static Object semaphore = new Object();\r
2eb7d78d 61 \r
62 public GenBuildLogger () {\r
63 \r
64 }\r
c8df018e 65\r
66 public GenBuildLogger (Project project) {\r
67 this.project = project;\r
68 }\r
69\r
c8df018e 70 /**\r
2eb7d78d 71 Rules: flag = false: means no cache Action: Print it to console\r
c8df018e 72 \r
2eb7d78d 73 flag = true: mean cache all msg exception some special Action: loglevel\r
c8df018e 74 is EDK_ALWAYS -- Print but no cache loglevel is EDK_ERROR -- Print and\r
75 cache the msg others -- No print and cache the msg\r
76 **/\r
2eb7d78d 77 public synchronized void putMessage(Object msgSource, int msgLevel, String msg) {\r
c8df018e 78 if (this.project == null) {\r
79 return;\r
80 }\r
188fdd0a 81\r
c8df018e 82 //\r
83 // If msgLevel is always print, then print it\r
84 //\r
85 switch (msgLevel) {\r
86 case EdkLog.EDK_ALWAYS:\r
2eb7d78d 87 //\r
88 // Do some special\r
89 //\r
90 log(msgSource, msg, Project.MSG_ERR);\r
c8df018e 91 break;\r
92 case EdkLog.EDK_ERROR:\r
2eb7d78d 93 log(msgSource, msg, Project.MSG_ERR);\r
c8df018e 94 break;\r
95 case EdkLog.EDK_WARNING:\r
2eb7d78d 96 log(msgSource, msg, Project.MSG_WARN);\r
c8df018e 97 break;\r
98 case EdkLog.EDK_INFO:\r
2eb7d78d 99 log(msgSource, msg, Project.MSG_INFO);\r
c8df018e 100 break;\r
188fdd0a 101 case EdkLog.EDK_VERBOSE:\r
2eb7d78d 102 log(msgSource, msg, Project.MSG_VERBOSE);\r
c8df018e 103 break;\r
104 case EdkLog.EDK_DEBUG:\r
2eb7d78d 105 log(msgSource, msg, Project.MSG_DEBUG);\r
c8df018e 106 break;\r
b9546cc8 107 }\r
c8df018e 108 }\r
498e9021 109 \r
110 public static void flushErrorModuleLog(FpdModuleIdentification errorModuleId) {\r
111 List<String> errorLogs = map.get(errorModuleId);\r
112 if (errorLogs != null) {\r
113 EdkLog.log("ErrorLog", EdkLog.EDK_ERROR, errorModuleId + " error logs: ");\r
114 for(int i = 0; i < errorLogs.size(); i++) {\r
115 EdkLog.log(EdkLog.EDK_ERROR, errorLogs.get(i));\r
116 }\r
117 }\r
118 }\r
c8df018e 119\r
120 public void flushToFile(File file) {\r
121 //\r
2eb7d78d 122 // Put all messages in map to file\r
c8df018e 123 //\r
2eb7d78d 124 String msg = "Writing log to file [" + file.getPath() + "]";\r
125 log("Logging", msg, Project.MSG_INFO);\r
126 try {\r
127 BufferedWriter bw = new BufferedWriter(new FileWriter(file));\r
498e9021 128 Iterator<FpdModuleIdentification> iter = map.keySet().iterator();\r
129 List<String> mainLogs = null;\r
130 while (iter.hasNext()) {\r
131 FpdModuleIdentification item = iter.next();\r
132 if(item == null) {\r
133 mainLogs = map.get(item);\r
134 continue ;\r
135 }\r
136 bw.write(">>>>>>>>>>>>>");\r
137 bw.write(" " + item + " Build Log ");\r
138 bw.write(">>>>>>>>>>>>>");\r
139 bw.newLine();\r
140 List<String> allMessages = map.get(item);\r
141 for(int i = 0; i < allMessages.size(); i++) {\r
142 bw.write(allMessages.get(i));\r
143 bw.newLine();\r
144 }\r
145 }\r
146 if (mainLogs != null) {\r
147 bw.write(">>>>>>>>>>>>>");\r
148 bw.write(" Main Logs (already print to command) ");\r
149 bw.write(">>>>>>>>>>>>>");\r
2eb7d78d 150 bw.newLine();\r
498e9021 151 for(int i = 0; i < mainLogs.size(); i++) {\r
152 bw.write(mainLogs.get(i));\r
153 bw.newLine();\r
154 }\r
2eb7d78d 155 }\r
156 bw.flush();\r
157 bw.close();\r
158 } catch (IOException e) {\r
159 new BuildException("Writing log error. " + e.getMessage());\r
160 }\r
161 \r
b9546cc8 162 }\r
91f7d582 163 \r
164 private void log(Object msgSource, String msg, int level) {\r
165 if (msgSource instanceof Task) {\r
d965d1f6 166 ((Task)msgSource).getProject().log((Task)msgSource, msg, level);\r
2619585a 167 } else if (msgSource instanceof String){\r
2619585a 168 //\r
2eb7d78d 169 // Pad 12 space to keep message in unify format\r
2619585a 170 //\r
171 msg = msg.replaceAll("\n", "\n ");\r
172 this.project.log(String.format("%12s", "[" + msgSource + "] ") + msg, level);\r
91f7d582 173 } else {\r
174 this.project.log(msg, level);\r
175 }\r
176 }\r
2eb7d78d 177 public void targetStarted(BuildEvent event) {\r
178 if (!flag) {\r
179 super.targetStarted(event);\r
180 }\r
181 }\r
182 \r
183 public void messageLogged(BuildEvent event) {\r
188fdd0a 184 \r
185 int currentLevel = event.getPriority();\r
2eb7d78d 186 //\r
187 // If current level is upper than Ant Level, skip it\r
188 //\r
189 if (currentLevel <= this.msgOutputLevel) {\r
190 String originalMessage = event.getMessage();\r
191\r
192 StringBuffer message = new StringBuffer();\r
193 if (!emacsMode && event.getTask() != null) {\r
194 String label = String.format("%12s", "[" + event.getTask().getTaskName() + "] ");\r
195 //\r
196 // Append label first\r
197 //\r
198 message.append(label);\r
199 \r
200 //\r
201 // Format all output message's line separator\r
202 //\r
203 try {\r
204 BufferedReader r = new BufferedReader(new StringReader(originalMessage));\r
205 boolean ifFirstLine = true;\r
206 String line = null;\r
207 while ((line = r.readLine()) != null) {\r
208 if (!ifFirstLine) {\r
209 message.append(StringUtils.LINE_SEP);\r
210 }\r
211 ifFirstLine = false;\r
212 message.append(line);\r
213 }\r
214 } catch (IOException e) {\r
215 message.append(originalMessage);\r
216 }\r
217 } else {\r
218 message.append(originalMessage);\r
219 }\r
220\r
221 String msg = message.toString();\r
222 if (currentLevel == Project.MSG_ERR) {\r
223 printMessage(msg, err, currentLevel);\r
224 } else if(currentLevel == Project.MSG_WARN) {\r
225 printMessage(msg, out, currentLevel);\r
226 } else if(!flag) {\r
227 printMessage(msg, out, currentLevel);\r
228 } \r
2eb7d78d 229 log(msg);\r
230 }\r
231 }\r
232 \r
233 public static void setCacheEnable(boolean enable) {\r
234 flag = enable;\r
235 }\r
236 \r
237 protected synchronized void log(String message) {\r
238 //\r
239 // cache log\r
240 //\r
241 if (map.containsKey(this.id)) {\r
242 map.get(this.id).add(message);\r
243 } else {\r
244 List<String> list = new Vector<String>(1024);\r
245 list.add(message);\r
246 map.put(this.id, list);\r
247 }\r
248 }\r
498e9021 249 \r
250 public Object clone() {\r
251 GenBuildLogger newLogger = new GenBuildLogger();\r
252 //\r
253 // Transfer emacs mode, out, err, level to new Logger\r
254 //\r
255 newLogger.setEmacsMode(this.emacsMode);\r
256 newLogger.setOutputPrintStream(this.out);\r
257 newLogger.setErrorPrintStream(this.err);\r
258 newLogger.setMessageOutputLevel(this.msgOutputLevel);\r
259 \r
260 //\r
261 // Transfer project\r
262 //\r
263 newLogger.project = this.project;\r
264 return newLogger;\r
265 }\r
266\r
267 public void setId(FpdModuleIdentification id) {\r
268 this.id = id;\r
269 }\r
a06a5417 270\r
271 public void buildFinished(BuildEvent event) {\r
5776c5c0 272 if (this.msgOutputLevel >= Project.MSG_VERBOSE) {\r
273 int level = this.msgOutputLevel;\r
274 synchronized(semaphore){\r
275 this.msgOutputLevel = this.msgOutputLevel - 1;\r
276 super.buildFinished(event);\r
277 this.msgOutputLevel = level;\r
278 }\r
279 } else {\r
280 super.buildFinished(event);\r
281 }\r
a06a5417 282 }\r
b9546cc8 283}