///\r
Map<String, Set<FpdModuleIdentification>> fvs = new HashMap<String, Set<FpdModuleIdentification>>();\r
\r
+ ///\r
+ /// Mapping from FV apriori file to its type (PEI or DXE)\r
+ ///\r
+ Map<String, String> aprioriType = new HashMap<String, String>();\r
+ \r
///\r
/// FpdParserTask can specify some ANT properties.\r
///\r
private Vector<Property> properties = new Vector<Property>();\r
\r
SurfaceAreaQuery saq = null;\r
- \r
- boolean isUnified = true;\r
\r
+ boolean isUnified = true;\r
+ \r
+ public static String PEI_APRIORI_GUID = "1b45cc0a-156a-428a-af62-49864da0e6e6";\r
+ \r
+ public static String DXE_APRIORI_GUID = "fc510ee7-ffdc-11d4-bd41-0080c73c8881";\r
+ \r
/**\r
Public construct method. It is necessary for ANT task.\r
**/\r
// Gen build.xml\r
//\r
String platformBuildFile = buildDir + File.separatorChar + platformId.getName() + "_build.xml";\r
- PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile);\r
+ PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile, aprioriType);\r
fileGenerator.genBuildFile();\r
\r
//\r
if (files != null) {\r
bw.write("[files]");\r
bw.newLine();\r
+ \r
+ Set<FpdModuleIdentification> modules = null;\r
+ \r
+ if ( (modules = getPeiApriori(validFv[i])) != null) {\r
+ //\r
+ // Special GUID - validFv[i].FFS\r
+ //\r
+ String str = ffsCommonDir + File.separatorChar + "FV" + File.separatorChar + PEI_APRIORI_GUID + "-" + validFv[i] + ".FFS";\r
+ bw.write(getProject().replaceProperties("EFI_FILE_NAME = " + str));\r
+ bw.newLine();\r
+ \r
+ File aprioriFile = new File(getProject().getProperty("FV_DIR") + File.separatorChar + validFv[i] + ".apr");\r
+ aprioriType.put(validFv[i], PEI_APRIORI_GUID);\r
+ genAprioriFile(modules, aprioriFile);\r
+ } else if((modules = getDxeApriori(validFv[i])) != null) {\r
+ //\r
+ // Special GUID - validFv[i].FFS\r
+ //\r
+ String str = ffsCommonDir + File.separatorChar + "FV" + File.separatorChar + DXE_APRIORI_GUID + "-" + validFv[i] + ".FFS";\r
+ bw.write(getProject().replaceProperties("EFI_FILE_NAME = " + str));\r
+ bw.newLine();\r
+ \r
+ File aprioriFile = new File(getProject().getProperty("FV_DIR") + File.separatorChar + validFv[i] + ".apr");\r
+ aprioriType.put(validFv[i], DXE_APRIORI_GUID);\r
+ genAprioriFile(modules, aprioriFile);\r
+ }\r
+ \r
for (int j = 0; j < files.length; j++) {\r
String str = ffsCommonDir + File.separatorChar + outfiles.get(files[j]);\r
bw.write(getProject().replaceProperties("EFI_FILE_NAME = " + str));\r
}\r
\r
String platformBuildFile = buildDir + File.separatorChar + platformId.getName() + "_build.xml";\r
- PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile);\r
+ PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile, aprioriType);\r
fileGenerator.genBuildFile();\r
\r
Ant ant = new Ant();\r
GlobalData.addMsaBuildOption(moduleId, parseMsaBuildOptions(false));\r
GlobalData.addMsaFamilyBuildOption(moduleId, parseMsaBuildOptions(true));\r
\r
+ ModuleIdentification[] libraryInstances = saq.getLibraryInstance(null);\r
+ for (int i = 0; i < libraryInstances.length; i++) {\r
+ saq.push(GlobalData.getDoc(libraryInstances[i], fpdModuleId.getArch()));\r
+ GlobalData.addMsaBuildOption(libraryInstances[i], parseMsaBuildOptions(false));\r
+ GlobalData.addMsaFamilyBuildOption(libraryInstances[i], parseMsaBuildOptions(true));\r
+ saq.pop();\r
+ }\r
+ \r
saq.pop();\r
}\r
}\r
return archs;\r
}\r
\r
+ private void genAprioriFile(Set<FpdModuleIdentification> modules, File file) {\r
+ try {\r
+ FileWriter fw = new FileWriter(file);\r
+ BufferedWriter bw = new BufferedWriter(fw);\r
+ \r
+ Iterator<FpdModuleIdentification> iter = modules.iterator();\r
+ while(iter.hasNext()) {\r
+ bw.write(iter.next().getModule().getGuid());\r
+ bw.newLine();\r
+ }\r
+ \r
+ bw.flush();\r
+ bw.close();\r
+ fw.close();\r
+ } catch (IOException ex) {\r
+ BuildException buildException = new BuildException("Generation of the Apriori file [" + file.getPath() + "] failed!\n" + ex.getMessage());\r
+ buildException.setStackTrace(ex.getStackTrace());\r
+ throw buildException;\r
+ }\r
+ }\r
+ \r
+ private Set<FpdModuleIdentification> getPeiApriori(String fvName) throws EdkException {\r
+ Node node = saq.getPeiApriori(fvName);\r
+ Set<FpdModuleIdentification> result = new LinkedHashSet<FpdModuleIdentification>();\r
+ if (node == null) {\r
+ return null;\r
+ }\r
+ \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='APRIORI' Identifier='0']");\r
+ }\r
+ }\r
+ }\r
+ \r
+ return result;\r
+ }\r
+\r
+ private Set<FpdModuleIdentification> getDxeApriori(String fvName) throws EdkException {\r
+ Node node = saq.getDxeApriori(fvName);\r
+ Set<FpdModuleIdentification> result = new LinkedHashSet<FpdModuleIdentification>();\r
+ if (node == null) {\r
+ return null;\r
+ }\r
+ \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='APRIORI' Identifier='1']");\r
+ }\r
+ }\r
+ }\r
+ \r
+ return result;\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