]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Fix the bug for Pcd used in command line's override
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 01a565aa08bd12f3b32f98dbfaef1d56dccbd92e..b78c401cee75cfe024425800170e2d2492aa792b 100644 (file)
@@ -86,6 +86,12 @@ LIBS = $(LIB_PATH)\Common.lib
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
 '''\r
 \r
+AppTarget = '''\r
+all: $(APPFILE)\r
+$(APPFILE): $(OBJECTS)\r
+%s\r
+'''\r
+\r
 PcdGccMakefile = '''\r
 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
 LIBS = -lCommon\r
@@ -276,6 +282,7 @@ class DscBuildData(PlatformBuildClassObject):
         self._VpdToolGuid       = None\r
         self._MacroDict         = None\r
         self.DefaultStores      = None\r
+        self.UsedStructurePcd   = None\r
 \r
     ## handle Override Path of Module\r
     def _HandleOverridePath(self):\r
@@ -1060,7 +1067,12 @@ class DscBuildData(PlatformBuildClassObject):
                         EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
                 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
 \r
+        if GlobalData.BuildOptionPcd:\r
+            for pcd in GlobalData.BuildOptionPcd:\r
+                (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
                 for BuildData in self._Bdb._CACHE_.values():\r
+                    if BuildData.Arch != self.Arch:\r
+                        continue\r
                     if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
                         continue\r
                     for key in BuildData.Pcds:\r
@@ -1307,29 +1319,16 @@ class DscBuildData(PlatformBuildClassObject):
                 if isinstance(self._DecPcds.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), None), StructurePcd):\r
                     self._DecPcds.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName)).PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
                 else:\r
-                    if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
-                        Pcd.PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
-                        Pcd.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
-                    else:\r
-                        Pcd.PcdValueFromComm = StringToArray(NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0])\r
-                        Pcd.DefaultValue = StringToArray(NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0])\r
+                    Pcd.PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
+                    Pcd.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
                     for sku in Pcd.SkuInfoList:\r
                         SkuInfo = Pcd.SkuInfoList[sku]\r
                         if SkuInfo.DefaultValue:\r
-                            if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
-                                SkuInfo.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
-                            else:\r
-                                SkuInfo.DefaultValue = StringToArray(NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0])\r
+                            SkuInfo.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
                         else:\r
-                            if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
-                                SkuInfo.HiiDefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
-                            else:\r
-                                SkuInfo.HiiDefaultValue = StringToArray(NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0])\r
+                            SkuInfo.HiiDefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
                             for defaultstore in SkuInfo.DefaultStoreDict:\r
-                                if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
-                                    SkuInfo.DefaultStoreDict[defaultstore] = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
-                                else:\r
-                                    SkuInfo.DefaultStoreDict[defaultstore] = StringToArray(NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0])\r
+                                SkuInfo.DefaultStoreDict[defaultstore] = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
                     if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]:\r
                         if Pcd.DatumType == TAB_VOID:\r
                             if not Pcd.MaxDatumSize:\r
@@ -1341,26 +1340,17 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 PcdInDec = self.DecPcds.get((Name, Guid))\r
                 if PcdInDec:\r
-                    if PcdInDec.DatumType in TAB_PCD_NUMERIC_TYPES:\r
-                        PcdInDec.PcdValueFromComm = NoFiledValues[(Guid, Name)][0]\r
-                    else:\r
-                        PcdInDec.PcdValueFromComm = StringToArray(NoFiledValues[(Guid, Name)][0])\r
+                    PcdInDec.PcdValueFromComm = NoFiledValues[(Guid, Name)][0]\r
                     if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
                         self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
-                        if PcdInDec.DatumType in TAB_PCD_NUMERIC_TYPES:\r
-                            self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
-                        else:\r
-                            self.Pcds[Name, Guid].DefaultValue = StringToArray(NoFiledValues[( Guid, Name)][0])\r
+                        self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
                     if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
-                        if PcdInDec.DatumType in TAB_PCD_NUMERIC_TYPES:\r
-                            self.Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}\r
-                        else:\r
-                            self.Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '',  StringToArray(NoFiledValues[( Guid, Name)][0]))}\r
+                        self.Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}\r
         return AllPcds\r
 \r
     def OverrideByFdfOverAll(self,AllPcds):\r
@@ -1479,6 +1469,7 @@ class DscBuildData(PlatformBuildClassObject):
                         else:\r
                             str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
+        self.FilterStrcturePcd(S_pcd_set)\r
         if S_pcd_set:\r
             GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
         for stru_pcd in S_pcd_set.values():\r
@@ -1574,6 +1565,23 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
         return Pcds\r
+    #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.\r
+    def FilterStrcturePcd(self, S_pcd_set):\r
+        if not self.UsedStructurePcd:\r
+            FdfInfList = []\r
+            if GlobalData.gFdfParser:\r
+                FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
+            FdfModuleList = [PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) for Inf in FdfInfList]\r
+            AllModulePcds = set()\r
+            ModuleSet = set(self._Modules.keys() + self.LibraryInstances + FdfModuleList)\r
+            for ModuleFile in ModuleSet:\r
+                ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
+                AllModulePcds = AllModulePcds | set(ModuleData.Pcds.keys())\r
+\r
+            self.UsedStructurePcd = AllModulePcds\r
+        UnusedStruPcds = set(S_pcd_set.keys()) - self.UsedStructurePcd\r
+        for (Token, TokenSpaceGuid) in UnusedStruPcds:\r
+            del S_pcd_set[(Token, TokenSpaceGuid)]\r
 \r
     ## Retrieve non-dynamic PCD settings\r
     #\r
@@ -1925,15 +1933,12 @@ class DscBuildData(PlatformBuildClassObject):
                     IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
-                            FieldValue = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
+                            FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
                         except BadExpression:\r
                             EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                             (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
                     try:\r
-                        if IsArray:\r
-                            Value, ValueSize = ParseFieldValue (FieldValue)\r
-                        else:\r
-                            Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
+                        Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
                     except Exception:\r
                         EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
                     if isinstance(Value, str):\r
@@ -2263,10 +2268,10 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         MakeApp = PcdMakefileHeader\r
         if sys.platform == "win32":\r
-            MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
+            MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
         else:\r
             MakeApp = MakeApp + PcdGccMakefile\r
-            MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
+            MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
                       'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
 \r
         IncSearchList = []\r
@@ -2313,7 +2318,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
             if Target == "*" or Target == self._Target:\r
                 if Tag == "*" or Tag == self._Toolchain:\r
-                    if Arch == "*" or Arch == self.Arch:\r
+                    if Arch == "*":\r
                         if Tool not in BuildOptions:\r
                             BuildOptions[Tool] = OrderedDict()\r
                         if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
@@ -2342,6 +2347,9 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         if sys.platform == "win32":\r
             MakeApp = MakeApp + PcdMakefileEnd\r
+            MakeApp = MakeApp + AppTarget % ("""\tcopy $(APPLICATION) $(APPFILE) /y """)\r
+        else:\r
+            MakeApp = MakeApp + AppTarget % ("""\tcp $(APPLICATION) $(APPFILE) """)\r
         MakeApp = MakeApp + '\n'\r
         IncludeFileFullPaths = []\r
         for includefile in IncludeFiles:\r
@@ -2365,12 +2373,11 @@ class DscBuildData(PlatformBuildClassObject):
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
 \r
-        PcdValueInitExe = PcdValueInitName\r
+        Dest_PcdValueInitExe = PcdValueInitName\r
         if not sys.platform == "win32":\r
-            PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
+            Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
         else:\r
-            PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
-\r
+            Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
         Messages = ''\r
         if sys.platform == "win32":\r
             MakeCommand = 'nmake -f %s' % (MakeFileName)\r
@@ -2380,6 +2387,7 @@ class DscBuildData(PlatformBuildClassObject):
             MakeCommand = 'make -f %s' % (MakeFileName)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
             Messages = StdErr\r
+\r
         Messages = Messages.split('\n')\r
         MessageGroup = []\r
         if returncode != 0:\r
@@ -2424,8 +2432,8 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
 \r
-        if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
-            Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
+        if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
+            Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
             if returncode != 0:\r
                 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r