2 This file is ANT task FpdParserTask.
4 FpdParserTask is used to parse FPD (Framework Platform Description) and generate
5 build.out.xml. It is for Package or Platform build use.
7 Copyright (c) 2006, Intel Corporation
8 All rights reserved. This program and the accompanying materials
9 are licensed and made available under the terms and conditions of the BSD License
10 which accompanies this distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 package org
.tianocore
.build
.fpd
;
18 import java
.io
.BufferedWriter
;
20 import java
.io
.FileWriter
;
21 import java
.io
.IOException
;
22 import java
.util
.HashMap
;
23 import java
.util
.Iterator
;
24 import java
.util
.LinkedHashMap
;
25 import java
.util
.LinkedHashSet
;
28 import java
.util
.Vector
;
30 import org
.apache
.tools
.ant
.BuildException
;
31 import org
.apache
.tools
.ant
.Task
;
32 import org
.apache
.tools
.ant
.taskdefs
.Ant
;
33 import org
.apache
.tools
.ant
.taskdefs
.Property
;
34 import org
.apache
.xmlbeans
.XmlException
;
35 import org
.apache
.xmlbeans
.XmlObject
;
37 import org
.tianocore
.common
.definitions
.EdkDefinitions
;
38 import org
.tianocore
.common
.exception
.EdkException
;
39 import org
.tianocore
.common
.logger
.EdkLog
;
40 import org
.tianocore
.pcd
.action
.ActionMessage
;
41 import org
.tianocore
.build
.FrameworkBuildTask
;
42 import org
.tianocore
.build
.global
.GlobalData
;
43 import org
.tianocore
.build
.global
.OutputManager
;
44 import org
.tianocore
.build
.global
.SurfaceAreaQuery
;
45 import org
.tianocore
.build
.id
.FpdModuleIdentification
;
46 import org
.tianocore
.build
.id
.ModuleIdentification
;
47 import org
.tianocore
.build
.id
.PackageIdentification
;
48 import org
.tianocore
.build
.id
.PlatformIdentification
;
49 import org
.tianocore
.build
.pcd
.action
.PlatformPcdPreprocessActionForBuilding
;
50 import org
.tianocore
.build
.toolchain
.ToolChainAttribute
;
51 import org
.tianocore
.build
.toolchain
.ToolChainElement
;
52 import org
.tianocore
.build
.toolchain
.ToolChainMap
;
53 import org
.w3c
.dom
.NamedNodeMap
;
54 import org
.w3c
.dom
.Node
;
55 import org
.w3c
.dom
.NodeList
;
58 <code>FpdParserTask</code> is an ANT task. The main function is parsing Framework
59 Platform Descritpion (FPD) XML file and generating its ANT build script for
60 corresponding platform.
62 <p>The task sets global properties PLATFORM, PLATFORM_DIR, PLATFORM_RELATIVE_DIR
65 <p>The task generates ${PLATFORM}_build.xml file which will be called by top level
66 build.xml. The task also generate Fv.inf files (File is for Tool GenFvImage). </p>
68 <p>FpdParserTask task stores all FPD information to GlobalData. And parse
69 tools definition file to set up compiler options for different Target and
70 different ToolChainTag. </p>
72 <p>The method parseFpdFile is also prepared for single module build. </p>
76 public class FpdParserTask
extends Task
{
78 private File fpdFile
= null;
80 PlatformIdentification platformId
;
85 /// Mapping from modules identification to out put file name
87 Map
<FpdModuleIdentification
, String
> outfiles
= new LinkedHashMap
<FpdModuleIdentification
, String
>();
90 /// Mapping from FV name to its modules
92 Map
<String
, Set
<FpdModuleIdentification
>> fvs
= new HashMap
<String
, Set
<FpdModuleIdentification
>>();
95 /// FpdParserTask can specify some ANT properties.
97 private Vector
<Property
> properties
= new Vector
<Property
>();
99 SurfaceAreaQuery saq
= null;
101 boolean isUnified
= true;
104 Public construct method. It is necessary for ANT task.
106 public FpdParserTask() {
110 ANT task's entry method. The main steps is described as following:
113 <li>Initialize global information (Framework DB, SPD files and all MSA files
114 listed in SPD). This step will execute only once in whole build process;</li>
115 <li>Parse specified FPD file; </li>
116 <li>Generate FV.inf files; </li>
117 <li>Generate PlatformName_build.xml file for Flatform build; </li>
118 <li>Collect PCD information. </li>
121 @throws BuildException
122 Surface area is not valid.
124 public void execute() throws BuildException
{
125 this.setTaskName("FpdParser");
135 isUnified
= OutputManager
.getInstance().prepareBuildDir(getProject());
137 String buildDir
= getProject().getProperty("BUILD_DIR");
139 // For every Target and ToolChain
141 String
[] targetList
= GlobalData
.getToolChainInfo().getTargets();
142 for (int i
= 0; i
< targetList
.length
; i
++) {
143 String
[] toolchainList
= GlobalData
.getToolChainInfo().getTagnames();
144 for(int j
= 0; j
< toolchainList
.length
; j
++) {
148 String ffsCommonDir
= buildDir
+ File
.separatorChar
149 + targetList
[i
] + "_"
151 File fvDir
= new File(ffsCommonDir
+ File
.separatorChar
+ "FV");
153 getProject().setProperty("FV_DIR", fvDir
.getPath().replaceAll("(\\\\)", "/"));
158 genFvInfFiles(ffsCommonDir
);
165 String platformBuildFile
= buildDir
+ File
.separatorChar
+ platformId
.getName() + "_build.xml";
166 PlatformBuildFileGenerator fileGenerator
= new PlatformBuildFileGenerator(getProject(), outfiles
, fvs
, isUnified
, saq
, platformBuildFile
);
167 fileGenerator
.genBuildFile();
170 // Ant call ${PLATFORM}_build.xml
173 ant
.setProject(getProject());
174 ant
.setAntfile(platformBuildFile
);
176 ant
.setInheritAll(true);
182 Generate Fv.inf files. The Fv.inf file is composed with four
183 parts: Options, Attributes, Components and Files. The Fv.inf files
184 will be under FV_DIR.
186 @throws BuildException
187 File write FV.inf files error.
189 void genFvInfFiles(String ffsCommonDir
) throws BuildException
{
190 String
[] validFv
= saq
.getFpdValidImageNames();
191 for (int i
= 0; i
< validFv
.length
; i
++) {
193 // Get all global variables from FPD and set them to properties
195 String
[][] globalVariables
= saq
.getFpdGlobalVariable();
196 for (int j
= 0; j
< globalVariables
.length
; j
++) {
197 getProject().setProperty(globalVariables
[j
][0], globalVariables
[j
][1]);
200 getProject().setProperty("FV_FILENAME", validFv
[i
]);
202 File fvFile
= new File(getProject().replaceProperties( getProject().getProperty("FV_DIR") + File
.separatorChar
+ validFv
[i
] + ".inf"));
203 if (fvFile
.exists() && (fvFile
.lastModified() >= fpdFile
.lastModified())) {
205 // don't re-generate FV.inf if fpd has not been changed
209 fvFile
.getParentFile().mkdirs();
212 FileWriter fw
= new FileWriter(fvFile
);
213 BufferedWriter bw
= new BufferedWriter(fw
);
218 String
[][] options
= saq
.getFpdOptions(validFv
[i
]);
219 if (options
.length
> 0) {
220 bw
.write("[options]");
222 for (int j
= 0; j
< options
.length
; j
++) {
223 StringBuffer str
= new StringBuffer(100);
224 str
.append(options
[j
][0]);
225 while (str
.length() < 40) {
229 str
.append(options
[j
][1]);
230 bw
.write(getProject().replaceProperties(str
.toString()));
239 String
[][] attributes
= saq
.getFpdAttributes(validFv
[i
]);
240 if (attributes
.length
> 0) {
241 bw
.write("[attributes]");
243 for (int j
= 0; j
< attributes
.length
; j
++) {
244 StringBuffer str
= new StringBuffer(100);
245 str
.append(attributes
[j
][0]);
246 while (str
.length() < 40) {
250 str
.append(attributes
[j
][1]);
251 bw
.write(getProject().replaceProperties(str
.toString()));
260 String
[][] components
= saq
.getFpdComponents(validFv
[i
]);
261 if (components
.length
> 0) {
262 bw
.write("[components]");
264 for (int j
= 0; j
< components
.length
; j
++) {
265 StringBuffer str
= new StringBuffer(100);
266 str
.append(components
[j
][0]);
267 while (str
.length() < 40) {
271 str
.append(components
[j
][1]);
272 bw
.write(getProject().replaceProperties(str
.toString()));
281 Set
<FpdModuleIdentification
> moduleSeqSet
= getModuleSequenceForFv(validFv
[i
]);
283 Set
<FpdModuleIdentification
> filesSet
= fvs
.get(validFv
[i
]);
285 FpdModuleIdentification
[] files
= null;
286 if (moduleSeqSet
== null) {
287 if (filesSet
!= null) {
288 files
= filesSet
.toArray(new FpdModuleIdentification
[filesSet
.size()]);
292 // if moduleSeqSet and filesSet is inconsistent, report error
294 if (filesSet
== null && moduleSeqSet
.size() != 0) {
295 throw new BuildException("Can not find any modules belongs to FV[" + validFv
[i
] + "], but listed some in BuildOptions.UserExtensions[@UserID='IMAGES' @Identifier='1']");
296 } else if(moduleSeqSet
.size() != filesSet
.size()){
297 throw new BuildException("Modules for FV[" + validFv
[i
] + "] defined in FrameworkModules and in BuildOptions.UserExtensions[@UserID='IMAGES' @Identifier='1'] are inconsistent. ");
300 // whether all modules in moduleSeqSet listed in filesSet
302 Iterator
<FpdModuleIdentification
> iter
= moduleSeqSet
.iterator();
303 while (iter
.hasNext()) {
304 FpdModuleIdentification item
= iter
.next();
305 if (!filesSet
.contains(item
)) {
306 throw new BuildException("Can not find " + item
+ " belongs to FV[" + validFv
[i
] + "]");
311 files
= moduleSeqSet
.toArray(new FpdModuleIdentification
[moduleSeqSet
.size()]);
318 for (int j
= 0; j
< files
.length
; j
++) {
319 String str
= ffsCommonDir
+ File
.separatorChar
+ outfiles
.get(files
[j
]);
320 bw
.write(getProject().replaceProperties("EFI_FILE_NAME = " + str
));
327 } catch (IOException ex
) {
328 BuildException buildException
= new BuildException("Generation of the FV file [" + fvFile
.getPath() + "] failed!\n" + ex
.getMessage());
329 buildException
.setStackTrace(ex
.getStackTrace());
330 throw buildException
;
331 } catch (EdkException ex
) {
332 BuildException buildException
= new BuildException("Generation of the FV file [" + fvFile
.getPath() + "] failed!\n" + ex
.getMessage());
333 buildException
.setStackTrace(ex
.getStackTrace());
334 throw buildException
;
339 This method is used for Single Module Build.
342 @throws BuildException
343 FPD file is not valid.
345 public void parseFpdFile(File fpdFile
) throws BuildException
, EdkException
{
346 this.fpdFile
= fpdFile
;
350 // Call Platform_build.xml prebuild firstly in stand-alone build
353 isUnified
= OutputManager
.getInstance().prepareBuildDir(getProject());
355 String buildDir
= getProject().getProperty("BUILD_DIR");
357 // For every Target and ToolChain
359 String
[] targetList
= GlobalData
.getToolChainInfo().getTargets();
360 for (int i
= 0; i
< targetList
.length
; i
++) {
361 String
[] toolchainList
= GlobalData
.getToolChainInfo().getTagnames();
362 for(int j
= 0; j
< toolchainList
.length
; j
++) {
366 String ffsCommonDir
= buildDir
+ File
.separatorChar
367 + targetList
[i
] + "_"
369 File fvDir
= new File(ffsCommonDir
+ File
.separatorChar
+ "FV");
374 String platformBuildFile
= buildDir
+ File
.separatorChar
+ platformId
.getName() + "_build.xml";
375 PlatformBuildFileGenerator fileGenerator
= new PlatformBuildFileGenerator(getProject(), outfiles
, fvs
, isUnified
, saq
, platformBuildFile
);
376 fileGenerator
.genBuildFile();
379 ant
.setProject(getProject());
380 ant
.setAntfile(platformBuildFile
);
381 ant
.setTarget("prebuild");
382 ant
.setInheritAll(true);
390 @throws BuildException
391 FPD file is not valid.
393 void parseFpdFile() throws BuildException
{
395 XmlObject doc
= XmlObject
.Factory
.parse(fpdFile
);
397 if (!doc
.validate()) {
398 throw new BuildException("Platform Surface Area file [" + fpdFile
.getPath() + "] format is invalid!");
401 Map
<String
, XmlObject
> map
= new HashMap
<String
, XmlObject
>();
402 map
.put("PlatformSurfaceArea", doc
);
403 saq
= new SurfaceAreaQuery(map
);
408 platformId
= saq
.getFpdHeader();
409 platformId
.setFpdFile(fpdFile
);
410 getProject().setProperty("PLATFORM", platformId
.getName());
411 getProject().setProperty("PLATFORM_FILE", platformId
.getRelativeFpdFile().replaceAll("(\\\\)", "/"));
412 getProject().setProperty("PLATFORM_DIR", platformId
.getFpdFile().getParent().replaceAll("(\\\\)", "/"));
413 getProject().setProperty("PLATFORM_RELATIVE_DIR", platformId
.getPlatformRelativeDir().replaceAll("(\\\\)", "/"));
415 if( !FrameworkBuildTask
.multithread
) {
416 FrameworkBuildTask
.originalProperties
.put("PLATFORM", platformId
.getName());
417 FrameworkBuildTask
.originalProperties
.put("PLATFORM_FILE", platformId
.getRelativeFpdFile().replaceAll("(\\\\)", "/"));
418 FrameworkBuildTask
.originalProperties
.put("PLATFORM_DIR", platformId
.getFpdFile().getParent().replaceAll("(\\\\)", "/"));
419 FrameworkBuildTask
.originalProperties
.put("PLATFORM_RELATIVE_DIR", platformId
.getPlatformRelativeDir().replaceAll("(\\\\)", "/"));
423 // Build mode. User-defined output dir.
425 String buildMode
= saq
.getFpdIntermediateDirectories();
426 String userDefinedOutputDir
= saq
.getFpdOutputDirectory();
428 OutputManager
.getInstance().setup(userDefinedOutputDir
, buildMode
);
431 // TBD. Deal PCD and BuildOption related Info
433 GlobalData
.setFpdBuildOptions(saq
.getFpdBuildOptions());
435 GlobalData
.setToolChainPlatformInfo(saq
.getFpdToolChainInfo());
438 // Parse all list modules SA
440 parseModuleSAFiles();
443 // TBD. Deal PCD and BuildOption related Info
445 parseToolChainFamilyOptions();
446 parseToolChainOptions();
451 // Pcd Collection. Call CollectPCDAction to collect pcd info.
453 PlatformPcdPreprocessActionForBuilding ca
= new PlatformPcdPreprocessActionForBuilding();
454 ca
.perform(platformId
.getFpdFile().getPath(), ActionMessage
.NULL_MESSAGE_LEVEL
);
455 } catch (IOException ex
) {
456 BuildException buildException
= new BuildException("Parsing of the FPD file [" + fpdFile
.getPath() + "] failed!\n" + ex
.getMessage());
457 buildException
.setStackTrace(ex
.getStackTrace());
458 throw buildException
;
459 } catch (XmlException ex
) {
460 BuildException buildException
= new BuildException("Parsing of the FPD file [" + fpdFile
.getPath() + "] failed!\n" + ex
.getMessage());
461 buildException
.setStackTrace(ex
.getStackTrace());
462 throw buildException
;
463 } catch (EdkException ex
) {
464 BuildException buildException
= new BuildException("Parsing of the FPD file [" + fpdFile
.getPath() + "] failed!\n" + ex
.getMessage());
465 buildException
.setStackTrace(ex
.getStackTrace());
466 throw buildException
;
471 Parse all modules listed in FPD file.
473 void parseModuleSAFiles() throws EdkException
{
474 Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> moduleSAs
= saq
.getFpdModules();
477 // For every Module lists in FPD file.
479 Set
<FpdModuleIdentification
> keys
= moduleSAs
.keySet();
480 Iterator iter
= keys
.iterator();
481 while (iter
.hasNext()) {
482 FpdModuleIdentification fpdModuleId
= (FpdModuleIdentification
) iter
.next();
485 // Judge if Module is existed?
487 GlobalData
.registerFpdModuleSA(fpdModuleId
, moduleSAs
.get(fpdModuleId
));
490 // Put fpdModuleId to the corresponding FV
492 saq
.push(GlobalData
.getDoc(fpdModuleId
));
493 String fvBinding
= saq
.getModuleFvBindingKeyword();
495 fpdModuleId
.setFvBinding(fvBinding
);
496 updateFvs(fvBinding
, fpdModuleId
);
499 // Prepare for out put file name
501 ModuleIdentification moduleId
= fpdModuleId
.getModule();
503 String baseName
= saq
.getModuleOutputFileBasename();
505 if (baseName
== null) {
506 baseName
= moduleId
.getName();
508 outfiles
.put(fpdModuleId
, fpdModuleId
.getArch() + File
.separatorChar
509 + moduleId
.getGuid() + "-" + baseName
510 + getSuffix(moduleId
.getModuleType()));
513 // parse module build options, if any
515 GlobalData
.addModuleToolChainOption(fpdModuleId
, parseModuleBuildOptions(false));
516 GlobalData
.addModuleToolChainFamilyOption(fpdModuleId
, parseModuleBuildOptions(true));
521 ToolChainMap
parseModuleBuildOptions(boolean toolChainFamilyFlag
) throws EdkException
{
522 String
[][] options
= saq
.getModuleBuildOptions(toolChainFamilyFlag
);
523 if (options
== null || options
.length
== 0) {
524 return new ToolChainMap();
526 return parseOptions(options
);
529 private ToolChainMap
parsePlatformBuildOptions(boolean toolChainFamilyFlag
) throws EdkException
{
530 String
[][] options
= saq
.getPlatformBuildOptions(toolChainFamilyFlag
);
531 if (options
== null || options
.length
== 0) {
532 return new ToolChainMap();
534 return parseOptions(options
);
537 private ToolChainMap
parseOptions(String
[][] options
) throws EdkException
{
538 ToolChainMap map
= new ToolChainMap();
539 int flagIndex
= ToolChainElement
.ATTRIBUTE
.value
;
541 for (int i
= 0; i
< options
.length
; ++i
) {
542 String flagString
= options
[i
][flagIndex
];
543 if (flagString
== null) {
546 options
[i
][flagIndex
] = ToolChainAttribute
.FLAGS
+ "";
547 map
.put(options
[i
], flagString
.trim());
553 private void parseToolChainFamilyOptions() throws EdkException
{
554 GlobalData
.setPlatformToolChainFamilyOption(parsePlatformBuildOptions(true));
557 private void parseToolChainOptions() throws EdkException
{
558 GlobalData
.setPlatformToolChainOption(parsePlatformBuildOptions(false));
562 Add the current module to corresponding FV.
564 @param fvName current FV name
565 @param moduleName current module identification
567 void updateFvs(String fvName
, FpdModuleIdentification fpdModuleId
) {
568 if (fvName
== null || fvName
.trim().length() == 0) {
571 String
[] fvNameArray
= fvName
.split("[, \t]+");
572 for (int i
= 0; i
< fvNameArray
.length
; i
++) {
574 // Put module to corresponding fvName
576 if (fvs
.containsKey(fvNameArray
[i
])) {
577 Set
<FpdModuleIdentification
> set
= fvs
.get(fvNameArray
[i
]);
578 set
.add(fpdModuleId
);
580 Set
<FpdModuleIdentification
> set
= new LinkedHashSet
<FpdModuleIdentification
>();
581 set
.add(fpdModuleId
);
582 fvs
.put(fvNameArray
[i
], set
);
588 Get the suffix based on module type. Current relationship are listed:
591 <b>ModuleType</b> <b>Suffix</b>
598 DXE_RUNTIME_DRIVER .DXE
603 UEFI_APPLICATION .APP
607 @param moduleType module type
609 @throws BuildException
610 If module type is null
612 public static String
getSuffix(String moduleType
) throws BuildException
{
613 if (moduleType
== null) {
614 throw new BuildException("Module type is not specified.");
617 String
[][] suffix
= EdkDefinitions
.ModuleTypeExtensions
;
619 for (int i
= 0; i
< suffix
.length
; i
++) {
620 if (suffix
[i
][0].equalsIgnoreCase(moduleType
)) {
634 public void addProperty(Property p
) {
635 properties
.addElement(p
);
638 public void setFpdFile(File fpdFile
) {
639 this.fpdFile
= fpdFile
;
642 public void setType(String type
) {
646 public String
getAllArchForModule(ModuleIdentification moduleId
) {
648 Iterator
<FpdModuleIdentification
> iter
= outfiles
.keySet().iterator();
649 while (iter
.hasNext()) {
650 FpdModuleIdentification fpdModuleId
= iter
.next();
652 if (fpdModuleId
.getModule().equals(moduleId
)) {
653 archs
+= fpdModuleId
.getArch() + " ";
660 private Set
<FpdModuleIdentification
> getModuleSequenceForFv(String fvName
) throws EdkException
{
661 Node node
= saq
.getFpdModuleSequence(fvName
);
662 Set
<FpdModuleIdentification
> result
= new LinkedHashSet
<FpdModuleIdentification
>();
665 EdkLog
.log(this, EdkLog
.EDK_WARNING
, "FV[" + fvName
+ "] does not specify module sequence in FPD. Assuming present sequence as default sequence in FV. ");
668 NodeList childNodes
= node
.getChildNodes();
669 for (int i
= 0; i
< childNodes
.getLength(); i
++) {
670 Node childItem
= childNodes
.item(i
);
671 if (childItem
.getNodeType() == Node
.ELEMENT_NODE
) {
673 // Find child elements "IncludeModules"
675 if (childItem
.getNodeName().compareTo("IncludeModules") == 0) {
677 // result will be updated
679 processNodes(childItem
, result
);
680 } else if (childItem
.getNodeName().compareTo("FvName") == 0) {
682 } else if (childItem
.getNodeName().compareTo("InfFileName") == 0) {
688 EdkLog
.log(this, EdkLog
.EDK_WARNING
, "Unrecognised element " + childItem
.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1']");
697 private void processNodes(Node node
, Set
<FpdModuleIdentification
> result
) throws EdkException
{
699 // Found out all elements "Module"
701 NodeList childNodes
= node
.getChildNodes();
702 for (int j
= 0; j
< childNodes
.getLength(); j
++) {
703 Node childItem
= childNodes
.item(j
);
704 if (childItem
.getNodeType() == Node
.ELEMENT_NODE
) {
705 if (childItem
.getNodeName().compareTo("Module") == 0) {
706 String moduleGuid
= null;
707 String moduleVersion
= null;
708 String packageGuid
= null;
709 String packageVersion
= null;
712 NamedNodeMap attr
= childItem
.getAttributes();
713 for (int i
= 0; i
< attr
.getLength(); i
++) {
714 Node attrItem
= attr
.item(i
);
715 if (attrItem
.getNodeName().compareTo("ModuleGuid") == 0) {
716 moduleGuid
= attrItem
.getNodeValue();
717 } else if (attrItem
.getNodeName().compareTo("ModuleVersion") == 0) {
718 moduleVersion
= attrItem
.getNodeValue();
719 } else if (attrItem
.getNodeName().compareTo("PackageGuid") == 0) {
720 packageGuid
= attrItem
.getNodeValue();
721 } else if (attrItem
.getNodeName().compareTo("PackageVersion") == 0) {
722 packageVersion
= attrItem
.getNodeValue();
723 } else if (attrItem
.getNodeName().compareTo("Arch") == 0) {
724 arch
= attrItem
.getNodeValue();
729 EdkLog
.log(this, EdkLog
.EDK_WARNING
, "Unrecognised attribute " + attrItem
.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1'].IncludeModules.Module");
733 PackageIdentification packageId
= new PackageIdentification(packageGuid
, packageVersion
);
734 GlobalData
.refreshPackageIdentification(packageId
);
736 ModuleIdentification moduleId
= new ModuleIdentification(moduleGuid
, moduleVersion
);
737 moduleId
.setPackage(packageId
);
738 GlobalData
.refreshModuleIdentification(moduleId
);
741 throw new EdkException("Attribute [Arch] is required for element FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1'].IncludeModules.Module. ");
744 result
.add(new FpdModuleIdentification(moduleId
, arch
));
749 EdkLog
.log(this, EdkLog
.EDK_WARNING
, "Unrecognised element " + childItem
.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1'].IncludeModules");