X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=Tools%2FSource%2FGenBuild%2Forg%2Ftianocore%2Fbuild%2Fpcd%2Faction%2FPCDAutoGenAction.java;h=40d2b32a9bd613b6bafffe7f550cdb838735c7ce;hp=278e58ceaee0b76a734abe00b9237b7e03d126c5;hb=d14ebb43742f411f2a013996b8e76bcab2420552;hpb=6ff7a41cb8b4e16800f70fd72e7290a418d4329e diff --git a/Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java b/Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java index 278e58ceae..40d2b32a9b 100644 --- a/Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java +++ b/Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java @@ -17,15 +17,26 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. package org.tianocore.build.pcd.action; import java.io.File; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.xmlbeans.XmlObject; import org.tianocore.build.global.GlobalData; -import org.tianocore.build.pcd.entity.MemoryDatabaseManager; -import org.tianocore.build.pcd.entity.Token; -import org.tianocore.build.pcd.entity.UsageInstance; -import org.tianocore.build.pcd.exception.BuildActionException; -import org.tianocore.build.pcd.exception.EntityException; +import org.tianocore.build.global.SurfaceAreaQuery; +import org.tianocore.build.id.ModuleIdentification; +import org.tianocore.pcd.entity.MemoryDatabaseManager; +import org.tianocore.pcd.entity.Token; +import org.tianocore.pcd.entity.UsageInstance; +import org.tianocore.pcd.exception.BuildActionException; +import org.tianocore.pcd.exception.EntityException; +import org.tianocore.pcd.entity.UsageIdentification; +import org.tianocore.pcd.action.BuildAction; +import org.tianocore.pcd.action.ActionMessage; /** This class is to manage how to generate the PCD information into Autogen.c and Autogen.h. @@ -36,35 +47,14 @@ public class PCDAutoGenAction extends BuildAction { /// private MemoryDatabaseManager dbManager; /// - /// The name of module which is analysised currently. - /// - private String moduleName; - /// - /// The Guid of module which is analyzed currently. - /// - private UUID moduleGuid; - /// - /// The name of package whose module is analysized currently. + /// The identification for a UsageInstance. /// - private String packageName; - /// - /// The Guid of package whose module is analyszed curretnly. - /// - private UUID packageGuid; + private UsageIdentification usageId; /// /// The arch of current module /// private String arch; /// - /// The version of current module - /// - private String version; - /// - /// Wheter current module is PCD emulated driver. It is only for - /// emulated PCD driver and will be kept until PCD IMAGE tool ready. - /// - private boolean isEmulatedPCDDriver; - /// /// Whether current autogen is for building library used by current module. /// private boolean isBuildUsedLibrary; @@ -75,50 +65,38 @@ public class PCDAutoGenAction extends BuildAction { /// /// The generated string for C code file. /// - private String cAutoGenString; - + private String cAutoGenString; + /// + /// The name array of in a module. + /// + private String[] pcdNameArrayInMsa; /** - Set parameter ModuleName + Set parameter moduleId @param moduleName the module name parameter. **/ - public void setModuleName(String moduleName) { - this.moduleName = moduleName; - } - - public void setModuleGuid(UUID moduleGuid) { - this.moduleGuid = moduleGuid; - } - - public void setPackageName(String packageName) { - this.packageName = packageName; - } - - public void setPackageGuid(UUID packageGuid) { - this.packageGuid = packageGuid; - } - - public void setArch(String arch) { - this.arch = arch; - } - - public void setVersion(String version) { - this.version = version; + public void setUsageId(UsageIdentification usageId) { + this.usageId = usageId; } /** - Set parameter isEmulatedPCDDriver - - @param isEmulatedPCDDriver whether this module is PeiEmulatedPCD driver + set isBuildUsedLibrary parameter. + + @param isBuildUsedLibrary **/ - public void setIsEmulatedPCDDriver(boolean isEmulatedPCDDriver) { - this.isEmulatedPCDDriver = isEmulatedPCDDriver; - } - public void setIsBuildUsedLibrary(boolean isBuildUsedLibrary) { this.isBuildUsedLibrary = isBuildUsedLibrary; } + /** + set pcdNameArrayInMsa parameter. + + @param pcdNameArrayInMsa + */ + public void setPcdNameArrayInMsa(String[] pcdNameArrayInMsa) { + this.pcdNameArrayInMsa = pcdNameArrayInMsa; + } + /** Get the output of generated string for header file. @@ -137,34 +115,35 @@ public class PCDAutoGenAction extends BuildAction { return cAutoGenString; } + /** - Construct function - - This function mainly initialize some member variable. - - @param moduleName Parameter of this action class. - @param isEmulatedPCDDriver Parameter of this action class. + Construct function + + This function mainly initialize some member variable. + + @param moduleId the identification for module + @param arch the architecture for module + @param isBuildUsedLibary Is the current module library. + @param pcdNameArrayInMsa the pcd name array got from MSA file. **/ - public PCDAutoGenAction(String moduleName, - UUID moduleGuid, - String packageName, - UUID packageGuid, - String arch, - String version, - boolean isEmulatedPCDDriver, - boolean isBuildUsedLibrary) { + public PCDAutoGenAction(ModuleIdentification moduleId, + String arch, + boolean isBuildUsedLibrary, + String[] pcdNameArrayInMsa) { + UsageIdentification usageId = new UsageIdentification(moduleId.getName(), + moduleId.getGuid(), + moduleId.getPackage().getName(), + moduleId.getPackage().getGuid(), + arch, + moduleId.getVersion(), + moduleId.getModuleType()); dbManager = null; hAutoGenString = ""; cAutoGenString = ""; - setIsEmulatedPCDDriver(isEmulatedPCDDriver); - setModuleName(moduleName); - setModuleGuid(moduleGuid); - setPackageName(packageName); - setPackageGuid(packageGuid); - setArch(arch); - setVersion(version); + setUsageId(usageId); setIsBuildUsedLibrary(isBuildUsedLibrary); + setPcdNameArrayInMsa(pcdNameArrayInMsa); } /** @@ -172,14 +151,8 @@ public class PCDAutoGenAction extends BuildAction { @throws BuildActionException Bad parameter. **/ - void checkParameter() throws BuildActionException { - if(!isEmulatedPCDDriver &&(moduleName == null)) { - throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!"); - } - - if(!isEmulatedPCDDriver && moduleName.length() == 0) { - throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!"); - } + public void checkParameter() throws BuildActionException { + } /** @@ -192,7 +165,7 @@ public class PCDAutoGenAction extends BuildAction { @throws BuildActionException Failed to execute this aciton class. **/ - void performAction() throws BuildActionException { + public void performAction() throws BuildActionException { ActionMessage.debug(this, "Starting PCDAutoGenAction to generate autogen.h and autogen.c!..."); // @@ -211,8 +184,6 @@ public class PCDAutoGenAction extends BuildAction { ActionMessage.debug(this, "PCD memory database contains " + dbManager.getDBSize() + " PCD tokens"); - - generateAutogenForModule(); } @@ -224,52 +195,120 @@ public class PCDAutoGenAction extends BuildAction { **/ private void generateAutogenForModule() { - int index; - List usageInstanceArray; - + int index, index2; + List usageInstanceArray, usageContext; + String[] guidStringArray = null; + String guidStringCName = null; + String guidString = null; + String moduleName = usageId.moduleName; + UsageInstance usageInstance = null; + boolean found = false; + + usageInstanceArray = null; if (!isBuildUsedLibrary) { - usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName, - moduleGuid, - packageName, - packageGuid, - arch, - version); + usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(usageId); dbManager.UsageInstanceContext = usageInstanceArray; dbManager.CurrentModuleName = moduleName; - } else { - usageInstanceArray = dbManager.UsageInstanceContext; + } else if ((pcdNameArrayInMsa != null) && (pcdNameArrayInMsa.length > 0)) { + usageContext = dbManager.UsageInstanceContext; // - // For building MDE package, although all module are library, but PCD entries of + // For building library package, although all module are library, but PCD entries of // these library should be used to autogen. // - if (usageInstanceArray == null) { - usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName, - moduleGuid, - packageName, - packageGuid, - arch, - version); + if (usageContext == null) { + usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(usageId); + } else { + usageInstanceArray = new ArrayList(); + + // + // Try to find all PCD defined in library's PCD in all in module's + // in FPD file. + // + for (index = 0; index < pcdNameArrayInMsa.length; index++) { + found = false; + for (index2 = 0; index2 < usageContext.size(); index2 ++) { + if (pcdNameArrayInMsa[index].equalsIgnoreCase(usageContext.get(index2).parentToken.cName)) { + usageInstanceArray.add(usageContext.get(index2)); + found = true; + break; + } + } + + if (!found) { + // + // All library's PCD should instanted in module's who + // use this library instance. If not, give errors. + // + throw new BuildActionException (String.format("[PCD Autogen Error] Module %s use library instance %s, the PCD %s " + + "is required by this library instance, but can not find " + + "it in the %s's in FPD file!", + dbManager.CurrentModuleName, + moduleName, + pcdNameArrayInMsa[index], + dbManager.CurrentModuleName + )); + } + } } } - if(usageInstanceArray.size() != 0) { - // - // Add "#include 'PcdLib.h'" for Header file - // - hAutoGenString = "#include \r\n"; + if (usageInstanceArray == null) { + return; } + // + // Generate all PCD entry for a module. + // for(index = 0; index < usageInstanceArray.size(); index ++) { - ActionMessage.debug(this, - "Module " + moduleName + "'s PCD [" + Integer.toHexString(index) + - "]: " + usageInstanceArray.get(index).parentToken.cName); - try { - usageInstanceArray.get(index).generateAutoGen(isBuildUsedLibrary); - hAutoGenString += usageInstanceArray.get(index).getHAutogenStr() + "\r\n"; - cAutoGenString += usageInstanceArray.get(index).getCAutogenStr() + "\r\n"; - } catch(EntityException exp) { - throw new BuildActionException(exp.getMessage()); + usageInstance = usageInstanceArray.get(index); + // + // Before generate any PCD information into autogen.h/autogen.c for a module, + // generate TokenSpaceGuid array variable firstly. For every dynamicEx type + // PCD in this module the token, they are all reference to TokenSpaceGuid + // array. + // + if (usageInstanceArray.get(index).modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) { + guidStringArray = usageInstance.parentToken.tokenSpaceName.split("-"); + guidStringCName = "_gPcd_TokenSpaceGuid_" + + usageInstance.parentToken.tokenSpaceName.replaceAll("-", "_"); + guidString = String.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}", + guidStringArray[0], + guidStringArray[1], + guidStringArray[2], + (guidStringArray[3].substring(0, 2)), + (guidStringArray[3].substring(2, 4)), + (guidStringArray[4].substring(0, 2)), + (guidStringArray[4].substring(2, 4)), + (guidStringArray[4].substring(4, 6)), + (guidStringArray[4].substring(6, 8)), + (guidStringArray[4].substring(8, 10)), + (guidStringArray[4].substring(10, 12))); + + Pattern pattern = Pattern.compile("(" + guidStringCName + ")+?"); + Matcher matcher = pattern.matcher(cAutoGenString + " "); + // + // Find whether this guid array variable has been generated into autogen.c + // For different DyanmicEx pcd token who use same token space guid, the token space + // guid array should be only generated once. + // + if (!matcher.find()) { + hAutoGenString += String.format("extern EFI_GUID %s;\r\n", + guidStringCName); + if (!isBuildUsedLibrary) { + cAutoGenString += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID %s = %s;\r\n", + guidStringCName, + guidString); + } + } } + + usageInstance.generateAutoGen(isBuildUsedLibrary); + // + // For every PCD entry for this module(usage instance), autogen string would + // be appand. + // + hAutoGenString += usageInstance.getHAutogenStr() + "\r\n"; + cAutoGenString += usageInstance.getCAutogenStr(); } // @@ -283,13 +322,6 @@ public class PCDAutoGenAction extends BuildAction { hAutoGenString += dbManager.PcdDxeHString; cAutoGenString += dbManager.PcdDxeCString; } - - ActionMessage.debug(this, - "Module " + moduleName + "'s PCD header file:\r\n" + hAutoGenString + "\r\n" - ); - ActionMessage.debug(this, - "Module " + moduleName + "'s PCD C file:\r\n" + cAutoGenString + "\r\n" - ); } /** @@ -299,8 +331,9 @@ public class PCDAutoGenAction extends BuildAction { **/ public static void main(String argv[]) { - String WorkSpace = "M:/ForPcd/edk2"; - String logFilePath = WorkSpace + "/MdePkg/MdePkg.fpd"; + String WorkSpace = "X:/edk2"; + String logFilePath = WorkSpace + "/EdkNt32Pkg/Nt32.fpd"; + String[] nameArray = null; // // At first, CollectPCDAction should be invoked to collect @@ -308,7 +341,7 @@ public class PCDAutoGenAction extends BuildAction { // CollectPCDAction collectionAction = new CollectPCDAction(); GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db", - WorkSpace); + WorkSpace,null); try { collectionAction.perform(WorkSpace, @@ -317,28 +350,5 @@ public class PCDAutoGenAction extends BuildAction { } catch(Exception e) { e.printStackTrace(); } - - // - // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c - // - PCDAutoGenAction autogenAction = new PCDAutoGenAction("BaseLib", - null, - null, - null, - null, - null, - false, - false - ); - autogenAction.execute(); - - System.out.println(autogenAction.OutputH()); - System.out.println("WQWQWQWQWQ"); - System.out.println(autogenAction.OutputC()); - - - System.out.println (autogenAction.hAutoGenString); - System.out.println (autogenAction.cAutoGenString); - } }