]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGen.py
UefiCpuPkg/CpuCommonFeaturesLib: Add check for input parameter.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGen.py
index 205a75dc805104bdf46ff0cf54a276a98f8225a2..6bbfc8774fedf0c27fd98d434d5d44f7c3b19731 100644 (file)
@@ -143,6 +143,8 @@ ${END}
 \r
 ${depexsection_item}\r
 \r
+${userextension_tianocore_item}\r
+\r
 ${tail_comments}\r
 \r
 [BuildOptions.${module_arch}]\r
@@ -416,7 +418,7 @@ class WorkspaceAutoGen(AutoGen):
                             if HasTokenSpace:\r
                                 if (PcdItem.TokenCName, PcdItem.TokenSpaceGuidCName) == (TokenCName, TokenSpaceGuidCName):\r
                                     PcdDatumType = PcdItem.DatumType\r
-                                    NewValue = self._BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
+                                    NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
                                     FoundFlag = True\r
                             else:\r
                                 if PcdItem.TokenCName == TokenCName:\r
@@ -425,7 +427,7 @@ class WorkspaceAutoGen(AutoGen):
                                             TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
                                             PcdDatumType = PcdItem.DatumType\r
                                             TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
-                                            NewValue = self._BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
+                                            NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
                                             FoundFlag = True\r
                                         else:\r
                                             EdkLogger.error(\r
@@ -661,15 +663,35 @@ class WorkspaceAutoGen(AutoGen):
         self._BuildCommand = None\r
 \r
         #\r
-        # Create BuildOptions Macro & PCD metafile.\r
+        # Create BuildOptions Macro & PCD metafile, also add the Active Platform and FDF file.\r
         #\r
         content = 'gCommandLineDefines: '\r
         content += str(GlobalData.gCommandLineDefines)\r
         content += os.linesep\r
         content += 'BuildOptionPcd: '\r
         content += str(GlobalData.BuildOptionPcd)\r
+        content += os.linesep\r
+        content += 'Active Platform: '\r
+        content += str(self.Platform)\r
+        content += os.linesep\r
+        if self.FdfFile:\r
+            content += 'Flash Image Definition: '\r
+            content += str(self.FdfFile)\r
         SaveFileOnChange(os.path.join(self.BuildDir, 'BuildOptions'), content, False)\r
 \r
+        #\r
+        # Create PcdToken Number file for Dynamic/DynamicEx Pcd.\r
+        #\r
+        PcdTokenNumber = 'PcdTokenNumber: '\r
+        if Pa.PcdTokenNumber:\r
+            if Pa.DynamicPcdList:\r
+                for Pcd in Pa.DynamicPcdList:\r
+                    PcdTokenNumber += os.linesep\r
+                    PcdTokenNumber += str((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))\r
+                    PcdTokenNumber += ' : '\r
+                    PcdTokenNumber += str(Pa.PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName])\r
+        SaveFileOnChange(os.path.join(self.BuildDir, 'PcdTokenNumber'), PcdTokenNumber, False)\r
+\r
         #\r
         # Get set of workspace metafiles\r
         #\r
@@ -697,31 +719,6 @@ class WorkspaceAutoGen(AutoGen):
                 print >> file, f\r
         return True\r
 \r
-    def _BuildOptionPcdValueFormat(self, TokenSpaceGuidCName, TokenCName, PcdDatumType, Value):\r
-        if PcdDatumType == 'VOID*':\r
-            if Value.startswith('L'):\r
-                if not Value[1]:\r
-                    EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')\r
-                Value = Value[0] + '"' + Value[1:] + '"'\r
-            elif Value.startswith('B'):\r
-                if not Value[1]:\r
-                    EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')\r
-                Value = Value[1:]\r
-            else:\r
-                if not Value[0]:\r
-                    EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')\r
-                Value = '"' + Value + '"'\r
-\r
-        IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)\r
-        if not IsValid:\r
-            EdkLogger.error('build', FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
-        if PcdDatumType == 'BOOLEAN':\r
-            Value = Value.upper()\r
-            if Value == 'TRUE' or Value == '1':\r
-                Value = '1'\r
-            elif Value == 'FALSE' or Value == '0':\r
-                Value = '0'\r
-        return  Value\r
 \r
     def _GetMetaFiles(self, Target, Toolchain, Arch):\r
         AllWorkSpaceMetaFiles = set()\r
@@ -749,6 +746,10 @@ class WorkspaceAutoGen(AutoGen):
         #\r
         AllWorkSpaceMetaFiles.add(os.path.join(self.BuildDir, 'BuildOptions'))\r
 \r
+        # add PcdToken Number file for Dynamic/DynamicEx Pcd\r
+        #\r
+        AllWorkSpaceMetaFiles.add(os.path.join(self.BuildDir, 'PcdTokenNumber'))\r
+\r
         for Arch in self.ArchList:\r
             Platform = self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]\r
             PGen = PlatformAutoGen(self, self.MetaFile, Target, Toolchain, Arch)\r
@@ -2334,8 +2335,18 @@ class PlatformAutoGen(AutoGen):
         if Module in self.Platform.Modules:\r
             PlatformModule = self.Platform.Modules[str(Module)]\r
             for Key  in PlatformModule.Pcds:\r
+                Flag = False\r
                 if Key in Pcds:\r
-                    self._OverridePcd(Pcds[Key], PlatformModule.Pcds[Key], Module)\r
+                    ToPcd = Pcds[Key]\r
+                    Flag = True\r
+                elif Key in GlobalData.MixedPcd:\r
+                    for PcdItem in GlobalData.MixedPcd[Key]:\r
+                        if PcdItem in Pcds:\r
+                            ToPcd = Pcds[PcdItem]\r
+                            Flag = True\r
+                            break\r
+                if Flag:\r
+                    self._OverridePcd(ToPcd, PlatformModule.Pcds[Key], Module)\r
         return Pcds.values()\r
 \r
     ## Resolve library names to library modules\r
@@ -2684,6 +2695,7 @@ class ModuleAutoGen(AutoGen):
 \r
         self.BuildDatabase = self.Workspace.BuildDatabase\r
         self.BuildRuleOrder = None\r
+        self.BuildTime      = 0\r
 \r
         self._Module          = None\r
         self._Name            = None\r
@@ -2759,10 +2771,7 @@ class ModuleAutoGen(AutoGen):
         if self._FixedAtBuildPcds:\r
             return self._FixedAtBuildPcds\r
         for Pcd in self.ModulePcdList:\r
-            if self.IsLibrary:\r
-                if not (Pcd.Pending == False and Pcd.Type == "FixedAtBuild"):\r
-                    continue\r
-            elif Pcd.Type != "FixedAtBuild":\r
+            if Pcd.Type != "FixedAtBuild":\r
                 continue\r
             if Pcd not in self._FixedAtBuildPcds:\r
                 self._FixedAtBuildPcds.append(Pcd)\r
@@ -3092,6 +3101,30 @@ class ModuleAutoGen(AutoGen):
                 self._DepexExpressionList[ModuleType] = DepexExpressionList\r
         return self._DepexExpressionList\r
 \r
+    # Get the tiano core user extension, it is contain dependent library.\r
+    # @retval: a list contain tiano core userextension.\r
+    #\r
+    def _GetTianoCoreUserExtensionList(self):\r
+        TianoCoreUserExtentionList = []\r
+        for M in [self.Module] + self.DependentLibraryList:\r
+            Filename = M.MetaFile.Path\r
+            InfObj = InfSectionParser.InfSectionParser(Filename)\r
+            TianoCoreUserExtenList = InfObj.GetUserExtensionTianoCore()\r
+            for TianoCoreUserExtent in TianoCoreUserExtenList:\r
+                for Section in TianoCoreUserExtent.keys():\r
+                    ItemList = Section.split(TAB_SPLIT)\r
+                    Arch = self.Arch\r
+                    if len(ItemList) == 4:\r
+                        Arch = ItemList[3]\r
+                    if Arch.upper() == TAB_ARCH_COMMON or Arch.upper() == self.Arch.upper():\r
+                        TianoCoreList = []\r
+                        TianoCoreList.extend([TAB_SECTION_START + Section + TAB_SECTION_END])\r
+                        TianoCoreList.extend(TianoCoreUserExtent[Section][:])\r
+                        TianoCoreList.append('\n')\r
+                        TianoCoreUserExtentionList.append(TianoCoreList)\r
+\r
+        return TianoCoreUserExtentionList\r
+\r
     ## Return the list of specification version required for the module\r
     #\r
     #   @retval     list    The list of specification defined in module file\r
@@ -3859,6 +3892,11 @@ class ModuleAutoGen(AutoGen):
           'libraryclasses_item'               : []\r
         }\r
 \r
+        if 'MODULE_UNI_FILE' in MDefs:\r
+            UNIFile = os.path.join(self.MetaFile.Dir, MDefs['MODULE_UNI_FILE'])\r
+            if os.path.isfile(UNIFile):\r
+                shutil.copy2(UNIFile, self.OutputDir)\r
+\r
         if self.AutoGenVersion > int(gInfSpecVersion, 0):\r
             AsBuiltInfDict['module_inf_version'] = '0x%08x' % self.AutoGenVersion\r
         else:\r
@@ -4058,6 +4096,16 @@ class ModuleAutoGen(AutoGen):
         for Library in self.LibraryAutoGenList:\r
             AsBuiltInfDict['libraryclasses_item'] += [Library.MetaFile.File.replace('\\', '/')]\r
         \r
+        # Generated UserExtensions TianoCore section.\r
+        # All tianocore user extensions are copied.\r
+        UserExtStr = ''\r
+        for TianoCore in self._GetTianoCoreUserExtensionList():\r
+            UserExtStr += '\n'.join(TianoCore)\r
+            ExtensionFile = os.path.join(self.MetaFile.Dir, TianoCore[1])\r
+            if os.path.isfile(ExtensionFile):\r
+                shutil.copy2(ExtensionFile, self.OutputDir)\r
+        AsBuiltInfDict['userextension_tianocore_item'] = UserExtStr\r
+\r
         # Generated depex expression section in comments.\r
         AsBuiltInfDict['depexsection_item'] = ''\r
         DepexExpresion = self._GetDepexExpresionString()\r
@@ -4214,6 +4262,8 @@ class ModuleAutoGen(AutoGen):
         with open(self.GetTimeStampPath(),'r') as f:\r
             for source in f:\r
                 source = source.rstrip('\n')\r
+                if not os.path.exists(source):\r
+                    return False\r
                 if source not in ModuleAutoGen.TimeDict :\r
                     ModuleAutoGen.TimeDict[source] = os.stat(source)[8]\r
                 if ModuleAutoGen.TimeDict[source] > DstTimeStamp:\r