summaryrefslogtreecommitdiff
path: root/Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java')
-rw-r--r--Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java335
1 files changed, 108 insertions, 227 deletions
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 63698b1..04e585b 100644
--- a/Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
+++ b/Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
@@ -18,6 +18,7 @@ package org.tianocore.build.pcd.action;
import java.io.File;
import java.util.List;
+import java.util.UUID;
import org.tianocore.build.global.GlobalData;
import org.tianocore.build.pcd.entity.MemoryDatabaseManager;
@@ -39,11 +40,35 @@ public class PCDAutoGenAction extends BuildAction {
///
private String moduleName;
///
+ /// The Guid of module which is analyzed currently.
+ ///
+ private UUID moduleGuid;
+ ///
+ /// The name of package whose module is analysized currently.
+ ///
+ private String packageName;
+ ///
+ /// The Guid of package whose module is analyszed curretnly.
+ ///
+ private UUID packageGuid;
+ ///
+ /// 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;
+ ///
/// The generated string for header file.
///
private String hAutoGenString;
@@ -61,6 +86,26 @@ public class PCDAutoGenAction extends BuildAction {
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;
+ }
+
/**
Set parameter isEmulatedPCDDriver
@@ -70,6 +115,10 @@ public class PCDAutoGenAction extends BuildAction {
this.isEmulatedPCDDriver = isEmulatedPCDDriver;
}
+ public void setIsBuildUsedLibrary(boolean isBuildUsedLibrary) {
+ this.isBuildUsedLibrary = isBuildUsedLibrary;
+ }
+
/**
Get the output of generated string for header file.
@@ -96,10 +145,26 @@ public class PCDAutoGenAction extends BuildAction {
@param moduleName Parameter of this action class.
@param isEmulatedPCDDriver Parameter of this action class.
**/
- public PCDAutoGenAction(String moduleName, boolean isEmulatedPCDDriver) {
- dbManager = null;
+ public PCDAutoGenAction(String moduleName,
+ UUID moduleGuid,
+ String packageName,
+ UUID packageGuid,
+ String arch,
+ String version,
+ boolean isEmulatedPCDDriver,
+ boolean isBuildUsedLibrary) {
+ dbManager = null;
+ hAutoGenString = "";
+ cAutoGenString = "";
+
setIsEmulatedPCDDriver(isEmulatedPCDDriver);
setModuleName(moduleName);
+ setModuleGuid(moduleGuid);
+ setPackageName(packageName);
+ setPackageGuid(packageGuid);
+ setArch(arch);
+ setVersion(version);
+ setIsBuildUsedLibrary(isBuildUsedLibrary);
}
/**
@@ -130,7 +195,6 @@ public class PCDAutoGenAction extends BuildAction {
void performAction() throws BuildActionException {
ActionMessage.debug(this,
"Starting PCDAutoGenAction to generate autogen.h and autogen.c!...");
-
//
// Check the PCD memory database manager is valid.
//
@@ -141,20 +205,15 @@ public class PCDAutoGenAction extends BuildAction {
dbManager = GlobalData.getPCDMemoryDBManager();
if(dbManager.getDBSize() == 0) {
- return;
+ return;
}
ActionMessage.debug(this,
"PCD memory database contains " + dbManager.getDBSize() + " PCD tokens");
- hAutoGenString = "";
- cAutoGenString = "";
- if(isEmulatedPCDDriver) {
- generateAutogenForPCDEmulatedDriver();
- } else {
- generateAutogenForModule();
- }
+
+ generateAutogenForModule();
}
/**
@@ -168,7 +227,30 @@ public class PCDAutoGenAction extends BuildAction {
int index;
List<UsageInstance> usageInstanceArray;
- usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName);
+ if (!isBuildUsedLibrary) {
+ usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName,
+ moduleGuid,
+ packageName,
+ packageGuid,
+ arch,
+ version);
+ dbManager.UsageInstanceContext = usageInstanceArray;
+ dbManager.CurrentModuleName = moduleName;
+ } else {
+ usageInstanceArray = dbManager.UsageInstanceContext;
+ //
+ // For building MDE 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(usageInstanceArray.size() != 0) {
//
@@ -182,7 +264,7 @@ public class PCDAutoGenAction extends BuildAction {
"Module " + moduleName + "'s PCD [" + Integer.toHexString(index) +
"]: " + usageInstanceArray.get(index).parentToken.cName);
try {
- usageInstanceArray.get(index).generateAutoGen();
+ usageInstanceArray.get(index).generateAutoGen(isBuildUsedLibrary);
hAutoGenString += usageInstanceArray.get(index).getHAutogenStr() + "\r\n";
cAutoGenString += usageInstanceArray.get(index).getCAutogenStr() + "\r\n";
} catch(EntityException exp) {
@@ -190,6 +272,10 @@ public class PCDAutoGenAction extends BuildAction {
}
}
+ //
+ // Work around code, In furture following code should be modified that get
+ // these information from Uplevel Autogen tools.
+ //
if (moduleName.equalsIgnoreCase("PcdPeim")) {
hAutoGenString += dbManager.PcdPeimHString;
cAutoGenString += dbManager.PcdPeimCString;
@@ -207,64 +293,6 @@ public class PCDAutoGenAction extends BuildAction {
}
/**
- Generate all PCD autogen string and the emulated PCD IMAGE array for emulated driver.
-
- Currently, we should generated all PCD information(maybe all dynamic) as array
- in Pei emulated driver for simulating PCD runtime database.
-
- **/
- private void generateAutogenForPCDEmulatedDriver() {
- int index;
- Token[] tokenArray;
- UsageInstance usageInstance;
-
- //
- // Add "#include 'PcdLib.h'" for Header file
- //
- hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";
-
- tokenArray = dbManager.getRecordArray();
- for(index = 0; index < tokenArray.length; index ++) {
- //
- // Get one consumer instance and generate autogen for this token.
- //
- if(tokenArray[index].consumers != null ) {
- if(tokenArray[index].consumers.size() != 0) {
- usageInstance = tokenArray[index].consumers.get(0);
- try {
- usageInstance.generateAutoGen();
- } catch(EntityException exp) {
- throw new BuildActionException(exp.getMessage());
- }
-
- hAutoGenString += usageInstance.getHAutogenStr();
- cAutoGenString += usageInstance.getCAutogenStr();
-
- hAutoGenString += "\r\n";
- cAutoGenString += "\r\n";
- } else {
- //
- // If the PCD does *not* usded by any module, also generate
- // it into autogen.h/autogen.c in Pcd driver according the
- // information in FPD file.
- //
- generateUnReferencePcdAutogenString(tokenArray[index]);
- }
- }
- }
-
- generatePCDEmulatedArray(tokenArray);
-
- ActionMessage.debug(this,
- "PCD emulated driver's header: \r\n" + hAutoGenString + "\r\n"
- );
- ActionMessage.debug(this,
- "PCD emulated driver's C code: \r\n" + cAutoGenString + "\r\n"
- );
-
- }
-
- /**
Generate unreference token definition string for PCD emulated string.
Maybe some PCD token definition in FPD but not used by any module or library, we
@@ -370,165 +398,14 @@ public class PCDAutoGenAction extends BuildAction {
}
/**
- Generate PCDEmulated array in PCDEmulated driver for emulated runtime database.
-
- @param tokenArray All PCD token in memory database.
-
- @throws BuildActionException Unknown PCD_TYPE
- **/
- private void generatePCDEmulatedArray(Token[] tokenArray)
- throws BuildActionException {
- int index;
- Token token;
- String[] guidStrArray;
- String value;
-
- //
- // The value of String type of PCD entry maybe use byte array but not string direcly
- // such as {0x1, 0x2, 0x3}, and define PCD1_STRING_Value as L"string define here"
- // For this case, we should generate a string array to C output and use the address
- // of generated string array.
- //
- for(index = 0; index < tokenArray.length; index ++) {
- token = tokenArray[index];
-
- value = token.datum.toString();
- if(token.datumType == Token.DATUM_TYPE.POINTER) {
- if(!((value.charAt(0) == 'L' && value.charAt(1) == '"') ||(value.charAt(0) == '"'))) {
- cAutoGenString += String.format("UINT8 _mPcdArray%08x[] = %s;\r\n",
- index,
- value
- );
- }
- }
- }
-
- //
- // Output emulated PCD entry array
- //
- cAutoGenString += "\r\nEMULATED_PCD_ENTRY gEmulatedPcdEntry[] = {\r\n";
-
- for(index = 0; index < tokenArray.length; index ++) {
- token = tokenArray[index];
-
- if(index != 0) {
- cAutoGenString += ",\r\n";
- }
-
- //
- // Print Start "{" for a Token item in array
- //
- cAutoGenString += " {\r\n";
-
- //
- // Print Token Name
- //
- cAutoGenString += String.format(" _PCD_TOKEN_%s,\r\n", token.cName);
-
- //
- // Print Hii information
- //
- if(token.hiiEnabled) {
- cAutoGenString += String.format(" TRUE,\r\n");
- } else {
- cAutoGenString += String.format(" FALSE,\r\n");
- }
-
- //
- // Print sku information
- //
- if(token.skuEnabled) {
- cAutoGenString += String.format(" TRUE,\r\n");
- } else {
- cAutoGenString += String.format(" FALSE,\r\n");
- }
-
- //
- // Print maxSkuCount
- //
- cAutoGenString += String.format(" %d,\r\n", token.maxSkuCount);
-
- cAutoGenString += String.format(" %d,\r\n", token.skuId);
-
- if(token.variableGuid == null) {
- cAutoGenString += " { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },\r\n";
- } else {
- guidStrArray =(token.variableGuid.toString()).split("-");
-
- cAutoGenString += String.format(" { 0x%s, 0x%s, 0x%s, { 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s } },\r\n",
- guidStrArray[0],
- guidStrArray[1],
- guidStrArray[2],
- (guidStrArray[3].substring(0, 2)),
- (guidStrArray[3].substring(2, 4)),
- (guidStrArray[4].substring(0, 2)),
- (guidStrArray[4].substring(2, 4)),
- (guidStrArray[4].substring(4, 6)),
- (guidStrArray[4].substring(6, 8)),
- (guidStrArray[4].substring(8, 10)),
- (guidStrArray[4].substring(10, 12))
- );
-
- }
-
- value = token.datum.toString();
- if(token.datumType == Token.DATUM_TYPE.POINTER) {
- if((value.charAt(0) == 'L' && value.charAt(1) == '"') || value.charAt(0) == '"') {
- cAutoGenString += String.format(" sizeof(_PCD_VALUE_%s),\r\n", token.cName);
- cAutoGenString += String.format(" 0, %s, %s,\r\n", token.variableName, value);
- } else {
- cAutoGenString += String.format(" sizeof(_mPcdArray%08x),\r\n", index);
- cAutoGenString += String.format(" 0, &_mPcdArray%08x, %s,\r\n", index, token.variableName);
- }
- } else {
- switch(token.datumType) {
- case UINT8:
- cAutoGenString += " 1,\r\n";
- break;
- case UINT16:
- cAutoGenString += " 2,\r\n";
- break;
- case UINT32:
- cAutoGenString += " 4,\r\n";
- break;
- case UINT64:
- cAutoGenString += " 8,\r\n";
- break;
- case BOOLEAN:
- cAutoGenString += " 1,\r\n";
- break;
- default:
- throw new BuildActionException("Unknown datum size");
- }
- cAutoGenString += String.format(" %s, %s, NULL,\r\n", value, token.variableName);
- }
-
- //
- // Print end "}" for a token item in array
- //
- cAutoGenString += " }";
- }
-
- cAutoGenString += "\r\n};\r\n";
- cAutoGenString += "\r\n";
- cAutoGenString += "UINTN\r\n";
- cAutoGenString += "GetPcdDataBaseSize(\r\n";
- cAutoGenString += " VOID\r\n";
- cAutoGenString += " )\r\n";
- cAutoGenString += "{\r\n";
- cAutoGenString += " return sizeof(gEmulatedPcdEntry);\r\n";
- cAutoGenString += "}\r\n";
- }
-
- /**
Test case function
@param argv paramter from command line
**/
public static void main(String argv[]) {
- String WorkSpace = "X:/edk2";
- String logFilePath = WorkSpace + "/EdkNt32Pkg/Nt32.fpd";
+ String WorkSpace = "M:/ForPcd/edk2";
+ String logFilePath = WorkSpace + "/MdePkg/MdePkg.fpd";
//
// At first, CollectPCDAction should be invoked to collect
@@ -538,8 +415,6 @@ public class PCDAutoGenAction extends BuildAction {
GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",
WorkSpace);
- GlobalData.getPCDMemoryDBManager().setLogFileName(logFilePath + ".PCDMemroyDatabaseLog.txt");
-
try {
collectionAction.perform(WorkSpace,
logFilePath,
@@ -551,7 +426,13 @@ public class PCDAutoGenAction extends BuildAction {
//
// Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c
//
- PCDAutoGenAction autogenAction = new PCDAutoGenAction("PcdDxe",
+ PCDAutoGenAction autogenAction = new PCDAutoGenAction("BaseLib",
+ null,
+ null,
+ null,
+ null,
+ null,
+ false,
false
);
autogenAction.execute();