]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FlashMapTask.java
Restructuring for better separation of Tool packages.
[mirror_edk2.git] / Tools / Java / Source / FrameworkTasks / org / tianocore / framework / tasks / FlashMapTask.java
CommitLineData
a15bb0d3 1/** @file\r
2 FlashMapTask class.\r
3\r
4 FlashMapTask is used to call FlashMap.exe to lay out the flash.\r
ff225cbb 5\r
6\r
a15bb0d3 7 Copyright (c) 2006, Intel Corporation\r
8 All rights reserved. This program and the accompanying materials\r
9 are licensed and made available under the terms and conditions of the BSD License\r
10 which accompanies this distribution. The full text of the license may be found at\r
11 http://opensource.org/licenses/bsd-license.php\r
ff225cbb 12\r
a15bb0d3 13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15\r
16 **/\r
17package org.tianocore.framework.tasks;\r
18\r
19import java.io.File;\r
4b134847 20import java.io.FileReader;\r
21import java.io.BufferedReader;\r
22\r
23import java.util.List;\r
24import java.util.ArrayList;\r
25import java.util.regex.Pattern;\r
26import java.util.regex.Matcher;\r
27\r
a15bb0d3 28import org.apache.tools.ant.Task;\r
29import org.apache.tools.ant.Project;\r
30import org.apache.tools.ant.BuildException;\r
93f5dd0a 31import org.apache.tools.ant.taskdefs.Execute;\r
32import org.apache.tools.ant.taskdefs.LogStreamHandler;\r
33import org.apache.tools.ant.types.Commandline;\r
ff225cbb 34\r
35import org.tianocore.common.logger.EdkLog;\r
a15bb0d3 36\r
37/**\r
219e2247 38 * FlashMapTask class.\r
ff225cbb 39 *\r
219e2247 40 * FlashMapTask is used to call FlashMap.exe to generate flash map defition files and fd files.\r
a15bb0d3 41 */\r
42public class FlashMapTask extends Task implements EfiDefine {\r
93f5dd0a 43 //\r
44 // tool name\r
45 //\r
4b134847 46 private static final String toolName = "FlashMap";\r
a15bb0d3 47\r
4b134847 48 //\r
49 // \r
50 // \r
51 private static Pattern fileBlock = Pattern.compile("\\s*File\\s*\\{([^\\{\\}]+)\\}");\r
52 private static Pattern fileNameDef = Pattern.compile("\\bName\\s*=\\s*\"([^\"]+)\"");\r
53 \r
93f5dd0a 54 //\r
55 // Flash definition file\r
56 //\r
57 private FileArg flashDefFile = new FileArg();\r
58\r
59 //\r
60 // Flash device\r
61 //\r
62 private ToolArg flashDevice = new ToolArg();\r
63\r
64 //\r
65 // Flash device Image\r
66 //\r
67 private ToolArg flashDeviceImage = new ToolArg();\r
68\r
69 //\r
70 // MCI file\r
71 //\r
72 private FileArg mciFile = new FileArg();\r
73\r
74 //\r
75 // MCO file\r
76 //\r
77 private FileArg mcoFile = new FileArg();\r
78\r
79 //\r
80 // Discover FD image\r
81 //\r
82 private ToolArg fdImage = new ToolArg();\r
83\r
84 //\r
85 // Dsc file\r
86 //\r
87 private FileArg dscFile = new FileArg();\r
88\r
89 //\r
90 // Asm INC file\r
91 //\r
92 private FileArg asmIncFile = new FileArg();\r
93\r
94 //\r
95 // Image out file\r
96 //\r
97 private FileArg imageOutFile = new FileArg();\r
98\r
99 //\r
100 // Header file\r
101 //\r
102 private FileArg headerFile = new FileArg();\r
103\r
104 //\r
105 // Input string file\r
106 //\r
a15bb0d3 107 private String inStrFile = "";\r
108\r
93f5dd0a 109 //\r
110 // Output string file\r
111 //\r
a15bb0d3 112 private String outStrFile = "";\r
113\r
93f5dd0a 114 //\r
76c86b3a 115 //\r
116 //\r
93f5dd0a 117 private FileArg strFile = new FileArg();\r
118 //\r
119 // Base address\r
120 //\r
121 private ToolArg baseAddr = new ToolArg();\r
122\r
123 //\r
124 // Aligment\r
125 //\r
126 private ToolArg aligment = new ToolArg();\r
127\r
128 //\r
129 // Padding value\r
130 //\r
131 private ToolArg padValue = new ToolArg();\r
132\r
133 //\r
134 // output directory\r
135 //\r
57cc2ee7 136 private String outputDir = ".";\r
a15bb0d3 137\r
93f5dd0a 138 //\r
139 // MCI file array\r
140 //\r
141 FileArg mciFileArray = new FileArg();\r
a15bb0d3 142\r
143 /**\r
93f5dd0a 144 execute\r
76c86b3a 145\r
93f5dd0a 146 FlashMapTask execute function is to assemble tool command line & execute\r
147 tool command line\r
76c86b3a 148\r
93f5dd0a 149 @throws BuidException\r
150 **/\r
a15bb0d3 151 public void execute() throws BuildException {\r
d946661a 152 if (isUptodate()) {\r
76c86b3a 153 EdkLog.log(this, EdkLog.EDK_VERBOSE, headerFile.toFileList()\r
d946661a 154 + imageOutFile.toFileList()\r
155 + mcoFile.toFileList()\r
156 + dscFile.toFileList()\r
157 + asmIncFile.toFileList()\r
158 + outStrFile\r
4b134847 159 + " is up-to-date!");\r
d946661a 160 return;\r
161 }\r
a15bb0d3 162\r
163 Project project = this.getOwningTarget().getProject();\r
164 //\r
a15bb0d3 165 // absolute path of efi tools\r
166 //\r
167 String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");\r
168 String command;\r
169 if (path == null) {\r
170 command = toolName;\r
171 } else {\r
93f5dd0a 172 command = path + File.separator + toolName;\r
a15bb0d3 173 }\r
a15bb0d3 174\r
175 //\r
176 // add substituted input file and output file\r
177 //\r
178 if (this.inStrFile != null && this.outStrFile != null\r
93f5dd0a 179 && this.inStrFile.length() > 0 && this.outStrFile.length() > 0) {\r
180 strFile.setPrefix(" -strsub ");\r
181 strFile.insValue(this.inStrFile);\r
182 strFile.insValue(this.outStrFile);\r
a15bb0d3 183 }\r
ff225cbb 184\r
93f5dd0a 185 String argument = "" + flashDefFile + flashDevice + flashDeviceImage\r
186 + mciFile + mcoFile + fdImage + dscFile + asmIncFile\r
187 + imageOutFile + headerFile + strFile + baseAddr\r
188 + aligment + padValue + mciFileArray;\r
ff225cbb 189\r
a15bb0d3 190\r
a15bb0d3 191 //\r
192 // lauch the program\r
193 //\r
93f5dd0a 194 // ProcessBuilder pb = new ProcessBuilder(argList);\r
195 // pb.directory(new File(outputDir));\r
a15bb0d3 196 int exitCode = 0;\r
197 try {\r
93f5dd0a 198 Commandline cmdline = new Commandline();\r
199 cmdline.setExecutable(command);\r
200 cmdline.createArgument().setLine(argument);\r
201\r
202 LogStreamHandler streamHandler = new LogStreamHandler(this,\r
203 Project.MSG_INFO, Project.MSG_WARN);\r
204 Execute runner = new Execute(streamHandler, null);\r
a15bb0d3 205\r
93f5dd0a 206 runner.setAntRun(project);\r
207 runner.setCommandline(cmdline.getCommandline());\r
208\r
209 if (outputDir != null) {\r
76c86b3a 210 runner.setWorkingDirectory(new File(outputDir));\r
93f5dd0a 211 }\r
a15bb0d3 212 //\r
213 // log command line string.\r
214 //\r
93f5dd0a 215 EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));\r
76c86b3a 216 EdkLog.log(this, flashDefFile.toFileList()\r
93f5dd0a 217 + mciFile.toFileList()\r
218 + mciFileArray.toFileList()\r
219 + fdImage.toFileList()\r
220 + inStrFile\r
76c86b3a 221 + " => "\r
222 + headerFile.toFileList()\r
93f5dd0a 223 + imageOutFile.toFileList()\r
224 + mcoFile.toFileList()\r
225 + dscFile.toFileList()\r
226 + asmIncFile.toFileList()\r
227 + outStrFile);\r
228\r
229 exitCode = runner.execute();\r
a15bb0d3 230 if (exitCode != 0) {\r
93f5dd0a 231 EdkLog.log(this, "ERROR = " + Integer.toHexString(exitCode));\r
a15bb0d3 232 } else {\r
91f7d582 233 EdkLog.log(this, EdkLog.EDK_VERBOSE, "FlashMap succeeded!");\r
a15bb0d3 234 }\r
235 } catch (Exception e) {\r
236 throw new BuildException(e.getMessage());\r
237 } finally {\r
238 if (exitCode != 0) {\r
219e2247 239 throw new BuildException("FlashMap failed!");\r
a15bb0d3 240 }\r
241 }\r
242 }\r
243\r
244 /**\r
93f5dd0a 245 getFlashDefFile\r
76c86b3a 246\r
93f5dd0a 247 This function is to get class member "flashDefFile"\r
76c86b3a 248\r
93f5dd0a 249 @return flashDeFile Name of flash definition file.\r
250 **/\r
a15bb0d3 251 public String getFlashDefFile() {\r
93f5dd0a 252 return this.flashDefFile.getValue();\r
a15bb0d3 253 }\r
254\r
255 /**\r
93f5dd0a 256 setFlashDefFile\r
76c86b3a 257\r
93f5dd0a 258 This function is to set class member "flashDefFile"\r
76c86b3a 259\r
93f5dd0a 260 @param flashDefFile\r
261 Name of flash definition file.\r
262 **/\r
a15bb0d3 263 public void setFlashDefFile(String flashDefFile) {\r
93f5dd0a 264 this.flashDefFile.setArg(" -fdf ", flashDefFile);\r
a15bb0d3 265 }\r
266\r
267 /**\r
93f5dd0a 268 getAligment\r
76c86b3a 269\r
93f5dd0a 270 This function is to get class member "aligment"\r
76c86b3a 271\r
93f5dd0a 272 @return aligment String of aligment value.\r
273 **/\r
a15bb0d3 274 public String getAligment() {\r
93f5dd0a 275 return this.aligment.getValue();\r
a15bb0d3 276 }\r
277\r
278 /**\r
93f5dd0a 279 setAligment\r
76c86b3a 280\r
93f5dd0a 281 This function is to set class member "aligment"\r
76c86b3a 282\r
93f5dd0a 283 @param aligment\r
284 String of aligment value.\r
285 **/\r
a15bb0d3 286 public void setAligment(String aligment) {\r
93f5dd0a 287 this.aligment.setArg(" -align ", aligment);\r
a15bb0d3 288 }\r
289\r
290 /**\r
93f5dd0a 291 getAsmIncFile\r
76c86b3a 292\r
93f5dd0a 293 This function is to get class member "asmIncFile"\r
76c86b3a 294\r
93f5dd0a 295 @return asmIncFile String of ASM include file.\r
296 **/\r
a15bb0d3 297 public String getAsmIncFile() {\r
93f5dd0a 298 return this.asmIncFile.getValue();\r
a15bb0d3 299 }\r
300\r
301 /**\r
93f5dd0a 302 setAsmIncFile\r
76c86b3a 303\r
93f5dd0a 304 This function is to set class member "asmIncFile"\r
76c86b3a 305\r
93f5dd0a 306 @param asmIncFile\r
307 String of ASM include file.\r
308 **/\r
a15bb0d3 309 public void setAsmIncFile(String asmIncFile) {\r
93f5dd0a 310 this.asmIncFile.setArg(" -asmincfile ", asmIncFile);\r
a15bb0d3 311 }\r
312\r
313 /**\r
93f5dd0a 314 getBaseAddr\r
76c86b3a 315\r
93f5dd0a 316 This function is to get class member "baseAddr"\r
76c86b3a 317\r
93f5dd0a 318 @return baseAddr String of base address value.\r
319 **/\r
a15bb0d3 320 public String getBaseAddr() {\r
93f5dd0a 321 return this.baseAddr.getValue();\r
a15bb0d3 322 }\r
323\r
324 /**\r
93f5dd0a 325 setBaseAddr\r
76c86b3a 326\r
93f5dd0a 327 This function is to set class member "baseAddr"\r
76c86b3a 328\r
93f5dd0a 329 @param baseAddr\r
330 String of base address value.\r
331 **/\r
a15bb0d3 332 public void setBaseAddr(String baseAddr) {\r
93f5dd0a 333 this.baseAddr.setArg(" -baseaddr ", baseAddr);\r
a15bb0d3 334 }\r
335\r
336 /**\r
93f5dd0a 337 getDscFile\r
76c86b3a 338\r
93f5dd0a 339 This function is to get class member "dscFile"\r
76c86b3a 340\r
93f5dd0a 341 @return dscFile name of DSC file\r
342 **/\r
a15bb0d3 343 public String getDscFile() {\r
93f5dd0a 344 return this.dscFile.getValue();\r
a15bb0d3 345 }\r
346\r
347 /**\r
93f5dd0a 348 setDscFile\r
76c86b3a 349\r
93f5dd0a 350 This function is to set class member "dscFile"\r
76c86b3a 351\r
93f5dd0a 352 @param dscFile\r
353 name of DSC file\r
354 **/\r
a15bb0d3 355 public void setDscFile(String dscFile) {\r
93f5dd0a 356 this.dscFile.setArg(" -dsc ", dscFile);\r
a15bb0d3 357 }\r
358\r
359 /**\r
93f5dd0a 360 getFdImage\r
76c86b3a 361\r
93f5dd0a 362 This function is to get class member "fdImage"\r
76c86b3a 363\r
93f5dd0a 364 @return fdImage name of input FDI image file.\r
365 **/\r
a15bb0d3 366 public String getFdImage() {\r
93f5dd0a 367 return this.fdImage.getValue();\r
a15bb0d3 368 }\r
369\r
370 /**\r
93f5dd0a 371 setFdImage\r
76c86b3a 372\r
93f5dd0a 373 This function is to set class member "fdImage"\r
76c86b3a 374\r
93f5dd0a 375 @param fdImage\r
376 name of input FDI image file.\r
377 **/\r
a15bb0d3 378 public void setFdImage(String fdImage) {\r
93f5dd0a 379 this.fdImage.setArg(" -discover ", fdImage);\r
a15bb0d3 380 }\r
381\r
382 /**\r
93f5dd0a 383 getFlashDevice\r
76c86b3a 384\r
93f5dd0a 385 This function is to get class member "flashDevice".\r
76c86b3a 386\r
93f5dd0a 387 @return flashDevice name of flash device.\r
388 **/\r
a15bb0d3 389 public String getFlashDevice() {\r
93f5dd0a 390 return this.flashDevice.getValue();\r
a15bb0d3 391 }\r
392\r
393 /**\r
93f5dd0a 394 setFlashDevice\r
76c86b3a 395\r
93f5dd0a 396 This function is to set class member "flashDevice"\r
76c86b3a 397\r
93f5dd0a 398 @param flashDevice\r
399 name of flash device.\r
400 **/\r
a15bb0d3 401 public void setFlashDevice(String flashDevice) {\r
93f5dd0a 402 this.flashDevice.setArg(" -flashdevice ", flashDevice);\r
a15bb0d3 403 }\r
404\r
405 /**\r
93f5dd0a 406 getFlashDeviceImage\r
76c86b3a 407\r
93f5dd0a 408 This function is to get class member "flashDeviceImage"\r
76c86b3a 409\r
93f5dd0a 410 @return flashDeviceImage name of flash device image\r
411 **/\r
a15bb0d3 412 public String getFlashDeviceImage() {\r
93f5dd0a 413 return this.flashDeviceImage.getValue();\r
a15bb0d3 414 }\r
415\r
416 /**\r
93f5dd0a 417 setFlashDeviceImage\r
76c86b3a 418\r
93f5dd0a 419 This function is to set class member "flashDeviceImage"\r
76c86b3a 420\r
93f5dd0a 421 @param flashDeviceImage\r
422 name of flash device image\r
423 **/\r
a15bb0d3 424 public void setFlashDeviceImage(String flashDeviceImage) {\r
93f5dd0a 425 this.flashDeviceImage.setArg(" -flashdeviceimage ", flashDeviceImage);\r
a15bb0d3 426\r
427 }\r
428\r
429 /**\r
93f5dd0a 430 getHeaderFile\r
76c86b3a 431\r
93f5dd0a 432 This function is to get class member "headerFile"\r
76c86b3a 433\r
93f5dd0a 434 @return headerFile name of include file\r
435 **/\r
a15bb0d3 436 public String getHeaderFile() {\r
93f5dd0a 437 return this.headerFile.getValue();\r
a15bb0d3 438 }\r
439\r
440 /**\r
93f5dd0a 441 setHeaderFile\r
76c86b3a 442\r
93f5dd0a 443 This function is to set class member "headerFile"\r
76c86b3a 444\r
93f5dd0a 445 @param headerFile\r
446 name of include file\r
447 **/\r
a15bb0d3 448 public void setHeaderFile(String headerFile) {\r
93f5dd0a 449 this.headerFile.setArg(" -hfile ", headerFile);\r
a15bb0d3 450 }\r
451\r
452 /**\r
93f5dd0a 453 getImageOutFile\r
76c86b3a 454\r
93f5dd0a 455 This function is to get class member "imageOutFile"\r
76c86b3a 456\r
93f5dd0a 457 @return imageOutFile name of output image file\r
458 **/\r
a15bb0d3 459 public String getImageOutFile() {\r
93f5dd0a 460 return this.imageOutFile.getValue();\r
a15bb0d3 461 }\r
462\r
463 /**\r
93f5dd0a 464 setImageOutFile\r
76c86b3a 465\r
93f5dd0a 466 This function is to set class member "ImageOutFile"\r
76c86b3a 467\r
93f5dd0a 468 @param imageOutFile\r
469 name of output image file\r
470 **/\r
a15bb0d3 471 public void setImageOutFile(String imageOutFile) {\r
93f5dd0a 472 this.imageOutFile.setArg(" -imageout ", imageOutFile);\r
a15bb0d3 473 }\r
474\r
475 /**\r
93f5dd0a 476 getInStrFile\r
76c86b3a 477\r
93f5dd0a 478 This function is to get class member "inStrFile"\r
76c86b3a 479\r
93f5dd0a 480 @return inStrFile name of input file which used to replace symbol names.\r
481 **/\r
a15bb0d3 482 public String getInStrFile() {\r
93f5dd0a 483 return this.inStrFile;\r
a15bb0d3 484 }\r
485\r
486 /**\r
93f5dd0a 487 setInStrFile\r
76c86b3a 488\r
93f5dd0a 489 This function is to set class member "inStrFile"\r
76c86b3a 490\r
93f5dd0a 491 @param inStrFile\r
492 name of input file which used to replace symbol names.\r
493 **/\r
a15bb0d3 494 public void setInStrFile(String inStrFile) {\r
495 this.inStrFile = inStrFile;\r
496 }\r
497\r
498 /**\r
93f5dd0a 499 getMciFile\r
76c86b3a 500\r
93f5dd0a 501 This function is to get class member "mciFile"\r
76c86b3a 502\r
93f5dd0a 503 @return mciFile name of input microcode file\r
504 **/\r
a15bb0d3 505 public String getMciFile() {\r
93f5dd0a 506 return this.mciFile.getValue();\r
a15bb0d3 507 }\r
508\r
509 /**\r
93f5dd0a 510 setMciFile\r
76c86b3a 511\r
93f5dd0a 512 This function is to set class member "mciFile"\r
76c86b3a 513\r
93f5dd0a 514 @param mciFile\r
515 name of input microcode file\r
516 **/\r
a15bb0d3 517 public void setMciFile(String mciFile) {\r
93f5dd0a 518 this.mciFile.setArg(" -mci ", mciFile);\r
a15bb0d3 519 }\r
520\r
521 /**\r
93f5dd0a 522 getMcoFile\r
76c86b3a 523\r
93f5dd0a 524 This function is to get class member "mcoFile"\r
76c86b3a 525\r
93f5dd0a 526 @return mcoFile name of output binary microcode image\r
527 **/\r
a15bb0d3 528 public String getMcoFile() {\r
93f5dd0a 529 return this.mcoFile.getValue();\r
a15bb0d3 530 }\r
531\r
532 /**\r
93f5dd0a 533 setMcoFile\r
76c86b3a 534\r
93f5dd0a 535 This function is to set class member "mcoFile"\r
76c86b3a 536\r
93f5dd0a 537 @param mcoFile\r
538 name of output binary microcode image\r
539 **/\r
a15bb0d3 540 public void setMcoFile(String mcoFile) {\r
93f5dd0a 541 this.mcoFile.setArg(" -mco ", mcoFile);\r
a15bb0d3 542 }\r
543\r
544 /**\r
93f5dd0a 545 getOutStrFile\r
76c86b3a 546\r
93f5dd0a 547 This function is to get class member "outStrFile"\r
76c86b3a 548\r
93f5dd0a 549 @return outStrFile name of output string substitution file\r
550 **/\r
a15bb0d3 551 public String getOutStrFile() {\r
93f5dd0a 552 return this.outStrFile;\r
a15bb0d3 553 }\r
554\r
555 /**\r
93f5dd0a 556 setOutStrFile\r
76c86b3a 557\r
93f5dd0a 558 This function is to set class member "outStrFile"\r
76c86b3a 559\r
93f5dd0a 560 @param outStrFile\r
561 name of output string substitution file\r
562 **/\r
a15bb0d3 563 public void setOutStrFile(String outStrFile) {\r
564 this.outStrFile = outStrFile;\r
565 }\r
566\r
567 /**\r
93f5dd0a 568 getPadValue\r
76c86b3a 569\r
93f5dd0a 570 This function is to get class member "padValue"\r
76c86b3a 571\r
93f5dd0a 572 @return padValue string of byte value to use as padding\r
573 **/\r
a15bb0d3 574 public String getPadValue() {\r
93f5dd0a 575 return this.padValue.getValue();\r
a15bb0d3 576 }\r
577\r
578 /**\r
93f5dd0a 579 setPadValue\r
76c86b3a 580\r
93f5dd0a 581 This function is to set class member "padValue"\r
76c86b3a 582\r
93f5dd0a 583 @param padValue\r
584 string of byte value to use as padding\r
585 **/\r
a15bb0d3 586 public void setPadValue(String padValue) {\r
93f5dd0a 587 this.padValue.setArg(" -padvalue ", padValue);\r
a15bb0d3 588 }\r
589\r
590 /**\r
93f5dd0a 591 addMciFile\r
76c86b3a 592\r
93f5dd0a 593 This function is to add Microcode binary file\r
76c86b3a 594\r
93f5dd0a 595 @param mciFile\r
596 instance of input class\r
597 **/\r
598 public void addConfiguredMciFile(FileArg mciFile) {\r
599 this.mciFileArray.setPrefix(" -mcmerge ");\r
600 this.mciFileArray.insert(mciFile);\r
a15bb0d3 601 }\r
602\r
603 /**\r
93f5dd0a 604 getOutputDir\r
76c86b3a 605\r
93f5dd0a 606 This function is to get class member "outputDir"\r
76c86b3a 607\r
93f5dd0a 608 @return outputDir string of output directory\r
609 **/\r
a15bb0d3 610 public String getOutputDir() {\r
611 return outputDir;\r
612 }\r
613\r
614 /**\r
93f5dd0a 615 setOutputDir\r
76c86b3a 616\r
93f5dd0a 617 This function is to set class member "outputDir"\r
76c86b3a 618\r
93f5dd0a 619 @param outputDir\r
620 string of output directory\r
621 **/\r
a15bb0d3 622 public void setOutputDir(String outputDir) {\r
623 this.outputDir = outputDir;\r
624 }\r
d946661a 625\r
626 //\r
627 // Dependency check\r
76c86b3a 628 //\r
d946661a 629 private boolean isUptodate() {\r
630 long srcTimeStamp = 0;\r
631 String srcName = "";\r
d946661a 632 String dstName = "";\r
633 long timeStamp = 0;\r
634\r
635 if (!flashDefFile.isEmpty()) {\r
636 srcName = flashDefFile.getValue();\r
637 timeStamp = new File(srcName).lastModified();\r
638 if (timeStamp > srcTimeStamp) {\r
639 srcTimeStamp = timeStamp;\r
640 }\r
641 }\r
642\r
643 if (!mciFile.isEmpty()) {\r
644 srcName = mciFile.getValue();\r
645 timeStamp = new File(srcName).lastModified();\r
646 if (timeStamp > srcTimeStamp) {\r
647 srcTimeStamp = timeStamp;\r
648 }\r
649 }\r
650\r
651 if (!fdImage.isEmpty()) {\r
652 srcName = fdImage.getValue();\r
653 timeStamp = new File(srcName).lastModified();\r
654 if (timeStamp > srcTimeStamp) {\r
655 srcTimeStamp = timeStamp;\r
656 }\r
657 }\r
658\r
659 if (inStrFile.length() != 0) {\r
660 srcName = inStrFile;\r
661 timeStamp = new File(srcName).lastModified();\r
662 if (timeStamp > srcTimeStamp) {\r
663 srcTimeStamp = timeStamp;\r
664 }\r
665 }\r
666\r
667 if (!mciFileArray.isEmpty()) {\r
668 for (int i = 0; i < mciFileArray.nameList.size(); ++i) {\r
669 srcName += mciFileArray.nameList.get(i) + " ";\r
670 timeStamp = new File(mciFileArray.nameList.get(i)).lastModified();\r
671 if (timeStamp > srcTimeStamp) {\r
672 srcTimeStamp = timeStamp;\r
673 }\r
674 }\r
675 }\r
676\r
677 if (!headerFile.isEmpty()) {\r
678 dstName = headerFile.getValue();\r
679 File dstFile = new File(dstName);\r
680 if (!dstFile.isAbsolute()) {\r
681 dstName = outputDir + File.separator + dstName;\r
682 dstFile = new File(dstName);\r
683 }\r
684\r
685 if (srcTimeStamp > dstFile.lastModified()) {\r
686 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
687 return false;\r
688 }\r
689 }\r
690\r
691 if (!imageOutFile.isEmpty()) {\r
692 dstName = imageOutFile.getValue();\r
693 File dstFile = new File(dstName);\r
694 if (!dstFile.isAbsolute()) {\r
695 dstName = outputDir + File.separator + dstName;\r
696 dstFile = new File(dstName);\r
697 }\r
698\r
699 if (srcTimeStamp > dstFile.lastModified()) {\r
700 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
701 return false;\r
702 }\r
4b134847 703\r
704 //\r
705 // we need to check the time stamp of each FV file specified in fdf file\r
706 // \r
707 if (!isFdUptodate(dstName, getFvFiles(flashDefFile.getValue()))) {\r
708 return false;\r
709 }\r
d946661a 710 }\r
711\r
712 if (!mcoFile.isEmpty()) {\r
713 dstName = mcoFile.getValue();\r
714 File dstFile = new File(dstName);\r
715 if (!dstFile.isAbsolute()) {\r
716 dstName = outputDir + File.separator + dstName;\r
717 dstFile = new File(dstName);\r
718 }\r
719\r
720 if (srcTimeStamp > dstFile.lastModified()) {\r
721 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
722 return false;\r
723 }\r
724 }\r
725\r
726 if (!dscFile.isEmpty()) {\r
727 dstName = dscFile.getValue();\r
728 File dstFile = new File(dstName);\r
729 if (!dstFile.isAbsolute()) {\r
730 dstName = outputDir + File.separator + dstName;\r
731 dstFile = new File(dstName);\r
732 }\r
733\r
734 if (srcTimeStamp > dstFile.lastModified()) {\r
735 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
736 return false;\r
737 }\r
738 }\r
739\r
740 if (!asmIncFile.isEmpty()) {\r
741 dstName = asmIncFile.getValue();\r
742 File dstFile = new File(dstName);\r
743 if (!dstFile.isAbsolute()) {\r
744 dstName = outputDir + File.separator + dstName;\r
745 dstFile = new File(dstName);\r
746 }\r
747\r
748 if (srcTimeStamp > dstFile.lastModified()) {\r
749 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
750 return false;\r
751 }\r
752 }\r
753\r
754 if (outStrFile.length() != 0) {\r
755 dstName = outStrFile;\r
756 File dstFile = new File(dstName);\r
757 if (!dstFile.isAbsolute()) {\r
758 dstName = outputDir + File.separator + dstName;\r
759 dstFile = new File(dstName);\r
760 }\r
761\r
762 if (srcTimeStamp > dstFile.lastModified()) {\r
763 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
764 return false;\r
765 }\r
766 }\r
767\r
768 return true;\r
769 }\r
4b134847 770\r
771 //\r
772 // Parse the flash definition file and find out the FV file names\r
773 // \r
774 private List<String> getFvFiles(String fdfFileName) {\r
775 File fdfFile = new File(fdfFileName);\r
776 int fileLength = (int)fdfFile.length();\r
777 char[] fdfContent = new char[fileLength];\r
778 List<String> fileList = new ArrayList<String>();\r
779\r
780 try {\r
781 FileReader reader = new FileReader(fdfFile);\r
782 BufferedReader in = new BufferedReader(reader);\r
783\r
784 in.read(fdfContent, 0, fileLength);\r
785 String str = new String(fdfContent);\r
786\r
787 //\r
788 // match the \r
789 // File {\r
790 // ...\r
791 // }\r
792 // block\r
793 // \r
794 Matcher matcher = fileBlock.matcher(str);\r
795 while (matcher.find()) {\r
796 String fileBlockContent = str.substring(matcher.start(1), matcher.end(1));\r
797 //\r
798 // match the definition like\r
799 // Name = "..."\r
800 // \r
801 Matcher nameMatcher = fileNameDef.matcher(fileBlockContent);\r
802 if (nameMatcher.find()) {\r
803 fileList.add(fileBlockContent.substring(nameMatcher.start(1), nameMatcher.end(1)));\r
804 }\r
805 }\r
806\r
807 in.close();\r
808 reader.close();\r
809 } catch (Exception ex) {\r
810 throw new BuildException(ex.getMessage());\r
811 }\r
812\r
813 return fileList;\r
814 }\r
815\r
816 private boolean isFdUptodate(String fdFile, List<String> fvFileList) {\r
817 String fvDir = ".";\r
818 File fd = new File(fdFile);\r
819\r
820 if (outputDir.equals(".")) {\r
821 if (!fd.isAbsolute()) {\r
822 //\r
823 // If we cannot get the absolute path of fd file, we caanot\r
824 // get its time stamp. Re-generate it always in such situation.\r
825 // \r
826 EdkLog.log(this, EdkLog.EDK_VERBOSE, "Cannot retrieve the time stamp of " + fdFile);\r
827 return false;\r
828 }\r
829 fvDir = fd.getParent();\r
830 } else {\r
831 fvDir = outputDir;\r
832 if (!fd.isAbsolute()) {\r
833 fd = new File(fvDir + File.separator + fdFile);\r
834 }\r
835 }\r
836\r
837 long fdTimeStamp = fd.lastModified();\r
838 for (int i = 0; i < fvFileList.size(); ++i) {\r
839 File fv = new File(fvDir + File.separator + fvFileList.get(i));\r
840 if (fv.lastModified() > fdTimeStamp) {\r
841 EdkLog.log(this, EdkLog.EDK_VERBOSE, fv.getPath() + " has been changed since last build!");\r
842 return false;\r
843 }\r
844 }\r
845\r
846 return true;\r
847 }\r
a15bb0d3 848}\r