\r
import org.tianocore.common.definitions.EdkDefinitions;\r
import org.tianocore.common.exception.EdkException;\r
+import org.tianocore.common.logger.EdkLog;\r
import org.tianocore.pcd.action.ActionMessage;\r
import org.tianocore.build.FrameworkBuildTask;\r
import org.tianocore.build.global.GlobalData;\r
import org.tianocore.build.global.SurfaceAreaQuery;\r
import org.tianocore.build.id.FpdModuleIdentification;\r
import org.tianocore.build.id.ModuleIdentification;\r
+import org.tianocore.build.id.PackageIdentification;\r
import org.tianocore.build.id.PlatformIdentification;\r
import org.tianocore.build.pcd.action.PlatformPcdPreprocessActionForBuilding;\r
import org.tianocore.build.toolchain.ToolChainAttribute;\r
import org.tianocore.build.toolchain.ToolChainElement;\r
import org.tianocore.build.toolchain.ToolChainMap;\r
+import org.w3c.dom.NamedNodeMap;\r
+import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
\r
/**\r
<code>FpdParserTask</code> is an ANT task. The main function is parsing Framework\r
Surface area is not valid.\r
**/\r
public void execute() throws BuildException {\r
+ this.setTaskName("FpdParser");\r
+ \r
//\r
// Parse FPD file\r
//\r
getProject().setProperty("FV_FILENAME", validFv[i]);\r
\r
File fvFile = new File(getProject().replaceProperties( getProject().getProperty("FV_DIR") + File.separatorChar + validFv[i] + ".inf"));\r
+ if (fvFile.exists() && (fvFile.lastModified() >= fpdFile.lastModified())) {\r
+ //\r
+ // don't re-generate FV.inf if fpd has not been changed\r
+ // \r
+ continue;\r
+ }\r
fvFile.getParentFile().mkdirs();\r
\r
try {\r
}\r
bw.newLine();\r
}\r
-\r
+ \r
//\r
// Files\r
//\r
+ Set<FpdModuleIdentification> moduleSeqSet = getModuleSequenceForFv(validFv[i]);\r
+ \r
Set<FpdModuleIdentification> filesSet = fvs.get(validFv[i]);\r
- if (filesSet != null) {\r
- FpdModuleIdentification[] files = filesSet.toArray(new FpdModuleIdentification[filesSet.size()]);\r
+ \r
+ FpdModuleIdentification[] files = null;\r
+ \r
+ if (moduleSeqSet == null) {\r
+ if (filesSet != null) {\r
+ files = filesSet.toArray(new FpdModuleIdentification[filesSet.size()]);\r
+ }\r
+ } else if (filesSet == null) {\r
+ if (moduleSeqSet.size() != 0) {\r
+ throw new BuildException("Can not find any modules belongs to FV[" + validFv[i] + "], but listed some in BuildOptions.UserExtensions[@UserID='IMAGES' @Identifier='1']");\r
+ }\r
+ } else {\r
+ //\r
+ // if moduleSeqSet and filesSet is inconsistent, report error\r
+ //\r
+ if(moduleSeqSet.size() != filesSet.size()){\r
+ throw new BuildException("Modules for FV[" + validFv[i] + "] defined in FrameworkModules and in BuildOptions.UserExtensions[@UserID='IMAGES' @Identifier='1'] are inconsistent. ");\r
+ } else {\r
+ //\r
+ // whether all modules in moduleSeqSet listed in filesSet\r
+ //\r
+ Iterator<FpdModuleIdentification> iter = moduleSeqSet.iterator();\r
+ while (iter.hasNext()) {\r
+ FpdModuleIdentification item = iter.next();\r
+ if (!filesSet.contains(item)) {\r
+ throw new BuildException("Can not find " + item + " belongs to FV[" + validFv[i] + "]");\r
+ }\r
+ }\r
+ }\r
+ \r
+ files = moduleSeqSet.toArray(new FpdModuleIdentification[moduleSeqSet.size()]);\r
+ }\r
+ \r
+ \r
+ if (files != null) {\r
bw.write("[files]");\r
bw.newLine();\r
for (int j = 0; j < files.length; j++) {\r
BuildException buildException = new BuildException("Generation of the FV file [" + fvFile.getPath() + "] failed!\n" + ex.getMessage());\r
buildException.setStackTrace(ex.getStackTrace());\r
throw buildException;\r
+ } catch (EdkException ex) {\r
+ BuildException buildException = new BuildException("Generation of the FV file [" + fvFile.getPath() + "] failed!\n" + ex.getMessage());\r
+ buildException.setStackTrace(ex.getStackTrace());\r
+ throw buildException;\r
}\r
}\r
}\r
\r
return archs;\r
}\r
+ \r
+ private Set<FpdModuleIdentification> getModuleSequenceForFv(String fvName) throws EdkException {\r
+ Node node = saq.getFpdModuleSequence(fvName);\r
+ Set<FpdModuleIdentification> result = new LinkedHashSet<FpdModuleIdentification>();\r
+ \r
+ if ( node == null) {\r
+ EdkLog.log(this, EdkLog.EDK_WARNING, "FV[" + fvName + "] does not specify module sequence in FPD. Assuming present sequence as default sequence in FV. ");\r
+ return null;\r
+ } else {\r
+ NodeList childNodes = node.getChildNodes();\r
+ for (int i = 0; i < childNodes.getLength(); i++) {\r
+ Node childItem = childNodes.item(i);\r
+ if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
+ //\r
+ // Find child elements "IncludeModules"\r
+ //\r
+ if (childItem.getNodeName().compareTo("IncludeModules") == 0) {\r
+ //\r
+ // result will be updated\r
+ //\r
+ processNodes(childItem, result);\r
+ } else if (childItem.getNodeName().compareTo("FvName") == 0) {\r
+ \r
+ } else if (childItem.getNodeName().compareTo("InfFileName") == 0) {\r
+ \r
+ } else {\r
+ //\r
+ // Report Warning\r
+ //\r
+ EdkLog.log(this, EdkLog.EDK_WARNING, "Unrecognised element " + childItem.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1']");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ return result;\r
+ }\r
+ \r
+ private void processNodes(Node node, Set<FpdModuleIdentification> result) throws EdkException {\r
+ //\r
+ // Found out all elements "Module"\r
+ //\r
+ NodeList childNodes = node.getChildNodes();\r
+ for (int j = 0; j < childNodes.getLength(); j++) {\r
+ Node childItem = childNodes.item(j);\r
+ if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
+ if (childItem.getNodeName().compareTo("Module") == 0) {\r
+ String moduleGuid = null;\r
+ String moduleVersion = null;\r
+ String packageGuid = null;\r
+ String packageVersion = null;\r
+ String arch = null;\r
+ \r
+ NamedNodeMap attr = childItem.getAttributes();\r
+ for (int i = 0; i < attr.getLength(); i++) {\r
+ Node attrItem = attr.item(i);\r
+ if (attrItem.getNodeName().compareTo("ModuleGuid") == 0) {\r
+ moduleGuid = attrItem.getNodeValue();\r
+ } else if (attrItem.getNodeName().compareTo("ModuleVersion") == 0) {\r
+ moduleVersion = attrItem.getNodeValue();\r
+ } else if (attrItem.getNodeName().compareTo("PackageGuid") == 0) {\r
+ packageGuid = attrItem.getNodeValue();\r
+ } else if (attrItem.getNodeName().compareTo("PackageVersion") == 0) {\r
+ packageVersion = attrItem.getNodeValue();\r
+ } else if (attrItem.getNodeName().compareTo("Arch") == 0) {\r
+ arch = attrItem.getNodeValue();\r
+ } else {\r
+ //\r
+ // Report warning\r
+ //\r
+ EdkLog.log(this, EdkLog.EDK_WARNING, "Unrecognised attribute " + attrItem.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1'].IncludeModules.Module");\r
+ }\r
+ }\r
+ \r
+ PackageIdentification packageId = new PackageIdentification(packageGuid, packageVersion);\r
+ GlobalData.refreshPackageIdentification(packageId);\r
+ \r
+ ModuleIdentification moduleId = new ModuleIdentification(moduleGuid, moduleVersion);\r
+ moduleId.setPackage(packageId);\r
+ GlobalData.refreshModuleIdentification(moduleId);\r
+ \r
+ if (arch == null) {\r
+ throw new EdkException("Attribute [Arch] is required for element FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1'].IncludeModules.Module. ");\r
+ }\r
+ \r
+ result.add(new FpdModuleIdentification(moduleId, arch));\r
+ } else {\r
+ //\r
+ // Report Warning\r
+ //\r
+ EdkLog.log(this, EdkLog.EDK_WARNING, "Unrecognised element " + childItem.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='IMAGES' Identifier='1'].IncludeModules");\r
+ }\r
+ }\r
+ }\r
+ }\r
}\r