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
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
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