]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/InfBuildData.py
BaseTools: Add the FeatureFlagExpression usage to the Source Section
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / InfBuildData.py
index 45b8ef4716dd51241469cb256d77d3cee26d27e7..cd23065b0c8e84a169e32e0d76fe8496843c4f94 100644 (file)
@@ -14,6 +14,7 @@ from types import *
 from .MetaFileParser import *\r
 from collections import OrderedDict\r
 from Workspace.BuildClassObject import ModuleBuildClassObject, LibraryClassObject, PcdClassObject\r
+from Common.Expression import ValueExpressionEx, PcdPattern\r
 \r
 ## Get Protocol value from given packages\r
 #\r
@@ -528,11 +529,17 @@ class InfBuildData(ModuleBuildClassObject):
         for Record in RecordList:\r
             LineNo = Record[-1]\r
             ToolChainFamily = Record[1]\r
-            TagName = Record[2]\r
-            ToolCode = Record[3]\r
-\r
+            # OptionsList := [TagName, ToolCode, FeatureFlag]\r
+            OptionsList = ['', '', '']\r
+            TokenList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
+            for Index in range(len(TokenList)):\r
+                OptionsList[Index] = TokenList[Index]\r
+            if OptionsList[2]:\r
+                FeaturePcdExpression = self.CheckFeatureFlagPcd(OptionsList[2])\r
+                if not FeaturePcdExpression:\r
+                    continue\r
             File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, '',\r
-                             '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
+                             '', False, self._Arch, ToolChainFamily, '', OptionsList[0], OptionsList[1])\r
             # check the file validation\r
             ErrorCode, ErrorInfo = File.Validate()\r
             if ErrorCode != 0:\r
@@ -1046,6 +1053,43 @@ class InfBuildData(ModuleBuildClassObject):
         if (self.Binaries and not self.Sources) or GlobalData.gIgnoreSource:\r
             return True\r
         return False\r
+    def CheckFeatureFlagPcd(self,Instance):\r
+        Pcds = {}\r
+        if GlobalData.gPlatformFinalPcds.get(self.Arch):\r
+            Pcds = GlobalData.gPlatformFinalPcds[self.Arch].copy()\r
+        if PcdPattern.search(Instance):\r
+            PcdTuple = tuple(Instance.split('.')[::-1])\r
+            if PcdTuple in self.Pcds:\r
+                if not (self.Pcds[PcdTuple].Type == 'FeatureFlag' or self.Pcds[PcdTuple].Type == 'FixedAtBuild') and Instance not in Pcds:\r
+                    EdkLogger.error('build', FORMAT_INVALID,\r
+                                    "\nit must be defined in a [PcdsFeatureFlag] or [PcdsFixedAtBuild] section of Dsc or Dec file or [FeaturePcd] or [FixedPcd] of Inf file",\r
+                                    File=str(self), ExtraData=Instance)\r
+                Pcds[Instance] = self.Pcds[PcdTuple].DefaultValue\r
+            if Instance in Pcds:\r
+                if Pcds[Instance] == '0':\r
+                    return False\r
+                elif Pcds[Instance] == '1':\r
+                    return True\r
+            try:\r
+                Value = ValueExpression(Instance, Pcds)()\r
+                if Value == True:\r
+                    return True\r
+                return False\r
+            except:\r
+                EdkLogger.warn('build', FORMAT_INVALID,"The FeatureFlagExpression cannot be evaluated", File=str(self), ExtraData=Instance)\r
+                return False\r
+        else:\r
+            for Name, Guid in self.Pcds:\r
+                if self.Pcds[(Name, Guid)].Type == 'FeatureFlag' or self.Pcds[(Name, Guid)].Type == 'FixedAtBuild':\r
+                    Pcds['%s.%s' % (Guid, Name)] = self.Pcds[(Name, Guid)].DefaultValue\r
+            try:\r
+                Value = ValueExpression(Instance, Pcds)()\r
+                if Value == True:\r
+                    return True\r
+                return False\r
+            except:\r
+                EdkLogger.warn('build', FORMAT_INVALID, "The FeatureFlagExpression cannot be evaluated", File=str(self), ExtraData=Instance)\r
+                return False\r
 def ExtendCopyDictionaryLists(CopyToDict, CopyFromDict):\r
     for Key in CopyFromDict:\r
         CopyToDict[Key].extend(CopyFromDict[Key])\r