]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/FrameworkTasks/org/tianocore/framework/tasks/FlashMapTask.java
1) Add FileTimeStamp class to centralize the cache mechanism for file time stamp...
[mirror_edk2.git] / Tools / 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
632 long dstTimeStamp = 0;\r
633 String dstName = "";\r
634 long timeStamp = 0;\r
635\r
636 if (!flashDefFile.isEmpty()) {\r
637 srcName = flashDefFile.getValue();\r
638 timeStamp = new File(srcName).lastModified();\r
639 if (timeStamp > srcTimeStamp) {\r
640 srcTimeStamp = timeStamp;\r
641 }\r
642 }\r
643\r
644 if (!mciFile.isEmpty()) {\r
645 srcName = mciFile.getValue();\r
646 timeStamp = new File(srcName).lastModified();\r
647 if (timeStamp > srcTimeStamp) {\r
648 srcTimeStamp = timeStamp;\r
649 }\r
650 }\r
651\r
652 if (!fdImage.isEmpty()) {\r
653 srcName = fdImage.getValue();\r
654 timeStamp = new File(srcName).lastModified();\r
655 if (timeStamp > srcTimeStamp) {\r
656 srcTimeStamp = timeStamp;\r
657 }\r
658 }\r
659\r
660 if (inStrFile.length() != 0) {\r
661 srcName = inStrFile;\r
662 timeStamp = new File(srcName).lastModified();\r
663 if (timeStamp > srcTimeStamp) {\r
664 srcTimeStamp = timeStamp;\r
665 }\r
666 }\r
667\r
668 if (!mciFileArray.isEmpty()) {\r
669 for (int i = 0; i < mciFileArray.nameList.size(); ++i) {\r
670 srcName += mciFileArray.nameList.get(i) + " ";\r
671 timeStamp = new File(mciFileArray.nameList.get(i)).lastModified();\r
672 if (timeStamp > srcTimeStamp) {\r
673 srcTimeStamp = timeStamp;\r
674 }\r
675 }\r
676 }\r
677\r
678 if (!headerFile.isEmpty()) {\r
679 dstName = headerFile.getValue();\r
680 File dstFile = new File(dstName);\r
681 if (!dstFile.isAbsolute()) {\r
682 dstName = outputDir + File.separator + dstName;\r
683 dstFile = new File(dstName);\r
684 }\r
685\r
686 if (srcTimeStamp > dstFile.lastModified()) {\r
687 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
688 return false;\r
689 }\r
690 }\r
691\r
692 if (!imageOutFile.isEmpty()) {\r
693 dstName = imageOutFile.getValue();\r
694 File dstFile = new File(dstName);\r
695 if (!dstFile.isAbsolute()) {\r
696 dstName = outputDir + File.separator + dstName;\r
697 dstFile = new File(dstName);\r
698 }\r
699\r
700 if (srcTimeStamp > dstFile.lastModified()) {\r
701 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
702 return false;\r
703 }\r
4b134847 704\r
705 //\r
706 // we need to check the time stamp of each FV file specified in fdf file\r
707 // \r
708 if (!isFdUptodate(dstName, getFvFiles(flashDefFile.getValue()))) {\r
709 return false;\r
710 }\r
d946661a 711 }\r
712\r
713 if (!mcoFile.isEmpty()) {\r
714 dstName = mcoFile.getValue();\r
715 File dstFile = new File(dstName);\r
716 if (!dstFile.isAbsolute()) {\r
717 dstName = outputDir + File.separator + dstName;\r
718 dstFile = new File(dstName);\r
719 }\r
720\r
721 if (srcTimeStamp > dstFile.lastModified()) {\r
722 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
723 return false;\r
724 }\r
725 }\r
726\r
727 if (!dscFile.isEmpty()) {\r
728 dstName = dscFile.getValue();\r
729 File dstFile = new File(dstName);\r
730 if (!dstFile.isAbsolute()) {\r
731 dstName = outputDir + File.separator + dstName;\r
732 dstFile = new File(dstName);\r
733 }\r
734\r
735 if (srcTimeStamp > dstFile.lastModified()) {\r
736 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
737 return false;\r
738 }\r
739 }\r
740\r
741 if (!asmIncFile.isEmpty()) {\r
742 dstName = asmIncFile.getValue();\r
743 File dstFile = new File(dstName);\r
744 if (!dstFile.isAbsolute()) {\r
745 dstName = outputDir + File.separator + dstName;\r
746 dstFile = new File(dstName);\r
747 }\r
748\r
749 if (srcTimeStamp > dstFile.lastModified()) {\r
750 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
751 return false;\r
752 }\r
753 }\r
754\r
755 if (outStrFile.length() != 0) {\r
756 dstName = outStrFile;\r
757 File dstFile = new File(dstName);\r
758 if (!dstFile.isAbsolute()) {\r
759 dstName = outputDir + File.separator + dstName;\r
760 dstFile = new File(dstName);\r
761 }\r
762\r
763 if (srcTimeStamp > dstFile.lastModified()) {\r
764 EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");\r
765 return false;\r
766 }\r
767 }\r
768\r
769 return true;\r
770 }\r
4b134847 771\r
772 //\r
773 // Parse the flash definition file and find out the FV file names\r
774 // \r
775 private List<String> getFvFiles(String fdfFileName) {\r
776 File fdfFile = new File(fdfFileName);\r
777 int fileLength = (int)fdfFile.length();\r
778 char[] fdfContent = new char[fileLength];\r
779 List<String> fileList = new ArrayList<String>();\r
780\r
781 try {\r
782 FileReader reader = new FileReader(fdfFile);\r
783 BufferedReader in = new BufferedReader(reader);\r
784\r
785 in.read(fdfContent, 0, fileLength);\r
786 String str = new String(fdfContent);\r
787\r
788 //\r
789 // match the \r
790 // File {\r
791 // ...\r
792 // }\r
793 // block\r
794 // \r
795 Matcher matcher = fileBlock.matcher(str);\r
796 while (matcher.find()) {\r
797 String fileBlockContent = str.substring(matcher.start(1), matcher.end(1));\r
798 //\r
799 // match the definition like\r
800 // Name = "..."\r
801 // \r
802 Matcher nameMatcher = fileNameDef.matcher(fileBlockContent);\r
803 if (nameMatcher.find()) {\r
804 fileList.add(fileBlockContent.substring(nameMatcher.start(1), nameMatcher.end(1)));\r
805 }\r
806 }\r
807\r
808 in.close();\r
809 reader.close();\r
810 } catch (Exception ex) {\r
811 throw new BuildException(ex.getMessage());\r
812 }\r
813\r
814 return fileList;\r
815 }\r
816\r
817 private boolean isFdUptodate(String fdFile, List<String> fvFileList) {\r
818 String fvDir = ".";\r
819 File fd = new File(fdFile);\r
820\r
821 if (outputDir.equals(".")) {\r
822 if (!fd.isAbsolute()) {\r
823 //\r
824 // If we cannot get the absolute path of fd file, we caanot\r
825 // get its time stamp. Re-generate it always in such situation.\r
826 // \r
827 EdkLog.log(this, EdkLog.EDK_VERBOSE, "Cannot retrieve the time stamp of " + fdFile);\r
828 return false;\r
829 }\r
830 fvDir = fd.getParent();\r
831 } else {\r
832 fvDir = outputDir;\r
833 if (!fd.isAbsolute()) {\r
834 fd = new File(fvDir + File.separator + fdFile);\r
835 }\r
836 }\r
837\r
838 long fdTimeStamp = fd.lastModified();\r
839 for (int i = 0; i < fvFileList.size(); ++i) {\r
840 File fv = new File(fvDir + File.separator + fvFileList.get(i));\r
841 if (fv.lastModified() > fdTimeStamp) {\r
842 EdkLog.log(this, EdkLog.EDK_VERBOSE, fv.getPath() + " has been changed since last build!");\r
843 return false;\r
844 }\r
845 }\r
846\r
847 return true;\r
848 }\r
a15bb0d3 849}\r