1. Add a feature to support: The Pcds which are used in INF/DEC but not found in...
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 19 Oct 2007 07:32:51 +0000 (07:32 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 19 Oct 2007 07:32:51 +0000 (07:32 +0000)
2. Change to use VERSION_STRING to always take precedence over VERSION_NUMBER. Output warning message if INF file only defines VERSION_NUMBER or defines both VERSION_NUMBER and VERSION_STRING

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@833 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Common/EdkIIWorkspaceBuild.py
Source/Python/Common/InfClassObject.py

index 05394e3..0c4e337 100755 (executable)
@@ -164,7 +164,7 @@ class LibraryClassObject(object):
 #                              { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
 # @var BuildOptions:           To store value for BuildOptions, it is a set structure as\r
 #                              { [BuildOptionKey] : BuildOptionValue}\r
-# @var Depex:                  To store value for Depex, it is a list structure as\r
+# @var Depex:                  To store value for Depex\r
 #\r
 class ModuleBuildClassObject(object):\r
     def __init__(self):\r
@@ -416,8 +416,11 @@ class ItemBuild(object):
 #                         { [DecFileName] : DecClassObject}\r
 # @var DscDatabase:       To store value for DscDatabase, it is a set structure as\r
 #                         { [DscFileName] : DscClassObject}\r
-# @var Build              To store value for DscDatabase, it is a set structure as\r
+# @var Build:             To store value for DscDatabase, it is a set structure as\r
 #                         ItemBuild\r
+# @var DscFileName:       To store value for Active Platform\r
+# @var UnFoundPcdInDsc:   To store values for the pcds defined in INF/DEC but not found in DSC, it is a set structure as\r
+#                         { (PcdGuid, PcdCName, Arch) : DecFileName }\r
 #\r
 class WorkspaceBuild(object):\r
     def __init__(self, ActivePlatform, WorkspaceDir):\r
@@ -434,6 +437,8 @@ class WorkspaceBuild(object):
         self.InfDatabase             = {}\r
         self.DecDatabase             = {}\r
         self.DscDatabase             = {}\r
+        \r
+        self.UnFoundPcdInDsc         = {}\r
 \r
         #\r
         # Init build for all arches\r
@@ -445,10 +450,10 @@ class WorkspaceBuild(object):
         #\r
         # Get active platform\r
         #\r
-        DscFileName = NormPath(ActivePlatform)\r
-        File = self.WorkspaceFile(DscFileName)\r
+        self.DscFileName = NormPath(ActivePlatform)\r
+        File = self.WorkspaceFile(self.DscFileName)\r
         if os.path.exists(File) and os.path.isfile(File):\r
-            self.DscDatabase[DscFileName] = Dsc(File, True, True, self.WorkspaceDir)\r
+            self.DscDatabase[self.DscFileName] = Dsc(File, True, True, self.WorkspaceDir)\r
         else:\r
             EdkLogger.error("AutoGen", FILE_NOT_FOUND, ExtraData = File)\r
 \r
@@ -1040,7 +1045,31 @@ class WorkspaceBuild(object):
         # Update Libraries Of Platform\r
         #\r
         self.UpdateLibrariesOfPlatform(InfList)\r
-\r
+        \r
+        #\r
+        # Output used Pcds not found in DSC file\r
+        #\r
+        self.ShowUnFoundPcds()\r
+\r
+    ## ShowUnFoundPcds()\r
+    #\r
+    # If there is any pcd used but not defined in DSC\r
+    # Print warning message on screen and output a list of pcds\r
+    #\r
+    def ShowUnFoundPcds(self):\r
+        if self.UnFoundPcdInDsc != {}:\r
+            WrnMessage = '**** WARNING ****\n'\r
+            WrnMessage += 'The following Pcds were not defined in the DSC file: %s\n' % self.DscFileName\r
+            WrnMessage += 'The default values were obtained from the DEC file that declares the PCD and the PCD default value\n'\r
+            for (Guid, Name, Arch) in self.UnFoundPcdInDsc:\r
+                Dec = self.UnFoundPcdInDsc[(Guid, Name, Arch)]\r
+                Pcds = self.Build[Arch].PackageDatabase[Dec].Pcds\r
+                if (Name, Guid) in Pcds:\r
+                    PcdItemTypeUsed = Pcds[(Name, Guid)].Type\r
+                    DefaultValue = Pcds[(Name, Guid)].DefaultValue\r
+                    WrnMessage += '%s.%s: Defined in file %s, PcdItemType is Pcds%s, DefaultValue is %s\n' % (Guid, Name, Dec, PcdItemTypeUsed, DefaultValue)\r
+            EdkLogger.info(WrnMessage)\r
+        \r
     ## Create a full path with workspace dir\r
     #\r
     # Convert Filename with workspace dir to create a full path\r
@@ -1230,36 +1259,49 @@ class WorkspaceBuild(object):
         IsOverrided = False\r
         IsFoundInDsc = False\r
         IsFoundInDec = False\r
+        FoundInDecFile = ''\r
+        \r
         #\r
-        # First get information from platform database\r
+        # First get information from package database\r
         #\r
-        for Dsc in self.Build[Arch].PlatformDatabase.keys():\r
-            Pcds = self.Build[Arch].PlatformDatabase[Dsc].Pcds\r
+        for Dec in self.Build[Arch].PackageDatabase.keys():\r
+            Pcds = self.Build[Arch].PackageDatabase[Dec].Pcds\r
             if (Name, Guid) in Pcds:\r
                 Type = Pcds[(Name, Guid)].Type\r
                 DatumType = Pcds[(Name, Guid)].DatumType\r
                 Value = Pcds[(Name, Guid)].DefaultValue\r
                 Token = Pcds[(Name, Guid)].TokenValue\r
-                MaxDatumSize = Pcds[(Name, Guid)].MaxDatumSize\r
-                SkuInfoList =  Pcds[(Name, Guid)].SkuInfoList\r
+                \r
                 IsOverrided = True\r
-                IsFoundInDsc = True\r
+                IsFoundInDec = True\r
+                FoundInDecFile = Dec\r
                 break\r
 \r
+        if not IsFoundInDec:\r
+            ErrorMsg = "Pcd '%s.%s' defined in module '%s' is not found in any package" % (Guid, Name, ModuleName)\r
+            EdkLogger.error("AutoGen", PARSER_ERROR, ErrorMsg)\r
+\r
         #\r
-        # Second get information from package database\r
+        # Second get information from platform database\r
         #\r
-        for Dec in self.Build[Arch].PackageDatabase.keys():\r
-            Pcds = self.Build[Arch].PackageDatabase[Dec].Pcds\r
+        for Dsc in self.Build[Arch].PlatformDatabase.keys():\r
+            Pcds = self.Build[Arch].PlatformDatabase[Dsc].Pcds\r
             if (Name, Guid) in Pcds:\r
-                DatumType = Pcds[(Name, Guid)].DatumType\r
-                Token = Pcds[(Name, Guid)].TokenValue\r
+                if Pcds[(Name, Guid)].Type != '' and Pcds[(Name, Guid)].Type != None:\r
+                    Type = Pcds[(Name, Guid)].Type\r
+                if Pcds[(Name, Guid)].DatumType != '' and Pcds[(Name, Guid)].DatumType != None:\r
+                    DatumType = Pcds[(Name, Guid)].DatumType\r
+                if Pcds[(Name, Guid)].TokenValue != '' and Pcds[(Name, Guid)].TokenValue != None:\r
+                    Token = Pcds[(Name, Guid)].TokenValue\r
+                if Pcds[(Name, Guid)].DefaultValue != '' and Pcds[(Name, Guid)].DefaultValue != None:\r
+                    Value = Pcds[(Name, Guid)].DefaultValue\r
+                if Pcds[(Name, Guid)].MaxDatumSize != '' and Pcds[(Name, Guid)].MaxDatumSize != None:\r
+                    MaxDatumSize = Pcds[(Name, Guid)].MaxDatumSize\r
+                SkuInfoList =  Pcds[(Name, Guid)].SkuInfoList\r
+                \r
                 IsOverrided = True\r
-                IsFoundInDec = True\r
+                IsFoundInDsc = True\r
                 break\r
-        if not IsFoundInDec:\r
-            ErrorMsg = "Pcd '%s.%s' defined in module '%s' is not found in any package" % (Guid, Name, ModuleName)\r
-            EdkLogger.error("AutoGen", PARSER_ERROR, ErrorMsg)\r
 \r
         #\r
         # Third get information from <Pcd> of <Compontents> from module database\r
@@ -1274,6 +1316,7 @@ class WorkspaceBuild(object):
                                     Value = Pcd.DefaultValue\r
                                 if Pcd.MaxDatumSize != '':\r
                                     MaxDatumSize = Pcd.MaxDatumSize\r
+                                    \r
                                 IsFoundInDsc = True\r
                                 IsOverrided = True\r
                                 break\r
@@ -1290,8 +1333,9 @@ class WorkspaceBuild(object):
         # Not found in any platform and fdf\r
         #\r
         if not IsFoundInDsc:\r
-            ErrorMsg = "Pcd '%s.%s' defined in module '%s' is not found in any platform" % (Guid, Name, ModuleName)\r
-            EdkLogger.error("AutoGen", PARSER_ERROR, ErrorMsg)\r
+            self.UnFoundPcdInDsc[(Guid, Name, Arch)] = FoundInDecFile\r
+            #ErrorMsg = "Pcd '%s.%s' defined in module '%s' is not found in any platform" % (Guid, Name, ModuleName)\r
+            #EdkLogger.error("AutoGen", PARSER_ERROR, ErrorMsg)\r
 \r
         return PcdClassObject(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided)\r
 \r
index 514b570..f63c297 100755 (executable)
@@ -217,7 +217,20 @@ class Inf(InfObject):
         #\r
         self.Module.Header.Name = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BASE_NAME][0]\r
         self.Module.Header.Guid = self.Defines.DefinesDictionary[TAB_INF_DEFINES_FILE_GUID][0]\r
-        self.Module.Header.Version = self.Defines.DefinesDictionary[TAB_INF_DEFINES_VERSION_NUMBER][0]\r
+        \r
+        #\r
+        # Get version of INF\r
+        #\r
+        VersionNumber = self.Defines.DefinesDictionary[TAB_INF_DEFINES_VERSION_NUMBER][0]\r
+        VersionString = self.Defines.DefinesDictionary[TAB_INF_DEFINES_VERSION_STRING][0]\r
+        if len(VersionNumber) > 0 and len(VersionString) == 0:\r
+            EdkLogger.warn(2000, 'VERSION_NUMBER depricated; INF file %s should be modified to use VERSION_STRING instead.' % self.Identification.FileFullPath)\r
+            self.Module.Header.Version = VersionNumber\r
+        if len(VersionString) > 0:\r
+            if len(VersionNumber) > 0:\r
+                EdkLogger.warn(2001, 'INF file %s defines both VERSION_NUMBER and VERSION_STRING, using VERSION_STRING' % self.Identification.FileFullPath)\r
+            self.Module.Header.Version = VersionString\r
+        \r
         self.Module.Header.FileName = self.Identification.FileName\r
         self.Module.Header.FullPath = self.Identification.FileFullPath\r
         File = self.Module.Header.FullPath\r