Reviewed-by: Liming Gao <liming....@intel.com>

> -----Original Message-----
> From: Zhu, Yonghong
> Sent: Thursday, October 13, 2016 5:30 PM
> To: edk2-devel@lists.01.org
> Cc: Gao, Liming <liming....@intel.com>
> Subject: [Patch] BaseTools: support PCD value to use expression in the DEC
> file
> 
> This patch add the support for Pcd value to use expression in the DEC file.
> 
> Cc: Liming Gao <liming....@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Yonghong Zhu <yonghong....@intel.com>
> ---
>  BaseTools/Source/Python/Common/Misc.py             | 57 ++++++++++++------
> ----
>  .../Source/Python/Workspace/MetaFileParser.py      | 21 ++++++--
>  2 files changed, 49 insertions(+), 29 deletions(-)
> 
> diff --git a/BaseTools/Source/Python/Common/Misc.py
> b/BaseTools/Source/Python/Common/Misc.py
> index c99716d..3be1f0f 100644
> --- a/BaseTools/Source/Python/Common/Misc.py
> +++ b/BaseTools/Source/Python/Common/Misc.py
> @@ -1410,36 +1410,11 @@ def ParseConsoleLog(Filename):
>              Opw.write('%s\n' % Line)
> 
>      Opr.close()
>      Opw.close()
> 
> -## AnalyzeDscPcd
> -#
> -#  Analyze DSC PCD value, since there is no data type info in DSC
> -#  This fuction is used to match functions (AnalyzePcdData,
> AnalyzeHiiPcdData, AnalyzeVpdPcdData) used for retrieving PCD value from
> database
> -#  1. Feature flag: TokenSpace.PcdCName|PcdValue
> -#  2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize]
> -#  3. Dynamic default:
> -#     TokenSpace.PcdCName|PcdValue[|VOID*[|MaxSize]]
> -#     TokenSpace.PcdCName|PcdValue
> -#  4. Dynamic VPD:
> -#     TokenSpace.PcdCName|VpdOffset[|VpdValue]
> -#     TokenSpace.PcdCName|VpdOffset[|MaxSize[|VpdValue]]
> -#  5. Dynamic HII:
> -#     TokenSpace.PcdCName|HiiString|VaiableGuid|VariableOffset[|HiiValue]
> -#  PCD value needs to be located in such kind of string, and the PCD value
> might be an expression in which
> -#    there might have "|" operator, also in string value.
> -#
> -#  @param Setting: String contain information described above with
> "TokenSpace.PcdCName|" stripped
> -#  @param PcdType: PCD type: feature, fixed, dynamic default VPD HII
> -#  @param DataType: The datum type of PCD: VOID*, UNIT, BOOL
> -#  @retval:
> -#    ValueList: A List contain fields described above
> -#    IsValid:   True if conforming EBNF, otherwise False
> -#    Index:     The index where PcdValue is in ValueList
> -#
> -def AnalyzeDscPcd(Setting, PcdType, DataType=''):
> +def AnalyzePcdExpression(Setting):
>      Setting = Setting.strip()
>      # There might be escaped quote in a string: \", \\\"
>      Data = Setting.replace('\\\\', '//').replace('\\\"', '\\\'')
>      # There might be '|' in string and in ( ... | ... ), replace it with '-'
>      NewStr = ''
> @@ -1465,10 +1440,40 @@ def AnalyzeDscPcd(Setting, PcdType,
> DataType=''):
>              FieldList.append(Setting[StartPos:].strip())
>              break
>          FieldList.append(Setting[StartPos:Pos].strip())
>          StartPos = Pos + 1
> 
> +    return FieldList
> +
> +## AnalyzeDscPcd
> +#
> +#  Analyze DSC PCD value, since there is no data type info in DSC
> +#  This fuction is used to match functions (AnalyzePcdData,
> AnalyzeHiiPcdData, AnalyzeVpdPcdData) used for retrieving PCD value from
> database
> +#  1. Feature flag: TokenSpace.PcdCName|PcdValue
> +#  2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize]
> +#  3. Dynamic default:
> +#     TokenSpace.PcdCName|PcdValue[|VOID*[|MaxSize]]
> +#     TokenSpace.PcdCName|PcdValue
> +#  4. Dynamic VPD:
> +#     TokenSpace.PcdCName|VpdOffset[|VpdValue]
> +#     TokenSpace.PcdCName|VpdOffset[|MaxSize[|VpdValue]]
> +#  5. Dynamic HII:
> +#
> TokenSpace.PcdCName|HiiString|VaiableGuid|VariableOffset[|HiiValue]
> +#  PCD value needs to be located in such kind of string, and the PCD value
> might be an expression in which
> +#    there might have "|" operator, also in string value.
> +#
> +#  @param Setting: String contain information described above with
> "TokenSpace.PcdCName|" stripped
> +#  @param PcdType: PCD type: feature, fixed, dynamic default VPD HII
> +#  @param DataType: The datum type of PCD: VOID*, UNIT, BOOL
> +#  @retval:
> +#    ValueList: A List contain fields described above
> +#    IsValid:   True if conforming EBNF, otherwise False
> +#    Index:     The index where PcdValue is in ValueList
> +#
> +def AnalyzeDscPcd(Setting, PcdType, DataType=''):
> +    FieldList = AnalyzePcdExpression(Setting)
> +
>      IsValid = True
>      if PcdType in (MODEL_PCD_FIXED_AT_BUILD,
> MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_FEATURE_FLAG):
>          Value = FieldList[0]
>          Size = ''
>          if len(FieldList) > 1:
> diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py
> b/BaseTools/Source/Python/Workspace/MetaFileParser.py
> index 82d874f..1a5fdf5 100644
> --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
> +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
> @@ -24,11 +24,11 @@ import Common.EdkLogger as EdkLogger
>  import Common.GlobalData as GlobalData
> 
>  from CommonDataClass.DataClass import *
>  from Common.DataType import *
>  from Common.String import *
> -from Common.Misc import GuidStructureStringToGuidString,
> CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd
> +from Common.Misc import GuidStructureStringToGuidString,
> CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd,
> AnalyzePcdExpression
>  from Common.Expression import *
>  from CommonDataClass.Exceptions import *
>  from Common.LongFilePathSupport import OpenLongFilePath as open
> 
>  from MetaFileTable import MetaFileStorage
> @@ -1633,10 +1633,11 @@ class DecParser(MetaFileParser):
>              return
>          MetaFileParser.__init__(self, FilePath, FileType, Arch, Table, -1)
>          self._Comments = []
>          self._Version = 0x00010005  # Only EDK2 dec file is supported
>          self._AllPCDs = [] # Only for check duplicate PCD
> +        self._AllPcdDict = {}
> 
>      ## Parser starter
>      def Start(self):
>          Content = ''
>          try:
> @@ -1846,14 +1847,14 @@ class DecParser(MetaFileParser):
>          PtrValue = ValueRe.findall(TokenList[1])
> 
>          # Has VOID* type string, may contain "|" character in the string.
>          if len(PtrValue) != 0:
>              ptrValueList = re.sub(ValueRe, '', TokenList[1])
> -            ValueList = GetSplitValueList(ptrValueList)
> +            ValueList = AnalyzePcdExpression(ptrValueList)
>              ValueList[0] = PtrValue[0]
>          else:
> -            ValueList = GetSplitValueList(TokenList[1])
> +            ValueList = AnalyzePcdExpression(TokenList[1])
> 
> 
>          # check if there's enough datum information given
>          if len(ValueList) != 3:
>              EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum
> information given",
> @@ -1876,10 +1877,23 @@ class DecParser(MetaFileParser):
>          if ValueList[2] == '':
>              EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD
> Datum information",
>                              ExtraData=self._CurrentLine + \
>                                        "
> (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<
> Token>)",
>                              File=self.MetaFile, Line=self._LineIndex + 1)
> +
> +        PcdValue = ValueList[0]
> +        if PcdValue:
> +            try:
> +                ValueList[0] = ValueExpression(PcdValue, 
> self._AllPcdDict)(True)
> +            except WrnExpression, Value:
> +                ValueList[0] = Value.result
> +
> +        if ValueList[0] == 'True':
> +            ValueList[0] = '1'
> +        if ValueList[0] == 'False':
> +            ValueList[0] = '0'
> +
>          # check format of default value against the datum type
>          IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0])
>          if not IsValid:
>              EdkLogger.error('Parser', FORMAT_INVALID, Cause,
> ExtraData=self._CurrentLine,
>                              File=self.MetaFile, Line=self._LineIndex + 1)
> @@ -1894,10 +1908,11 @@ class DecParser(MetaFileParser):
>              EdkLogger.error('Parser', FORMAT_INVALID,
>                              "The same PCD name and GUID have been already 
> defined",
>                              ExtraData=self._CurrentLine, File=self.MetaFile,
> Line=self._LineIndex + 1)
>          else:
>              self._AllPCDs.append((self._Scope[0], self._ValueList[0],
> self._ValueList[1]))
> +            self._AllPcdDict[TAB_SPLIT.join(self._ValueList[0:2])] = 
> ValueList[0]
> 
>          self._ValueList[2] = ValueList[0].strip() + '|' + 
> ValueList[1].strip() + '|' +
> ValueList[2].strip()
> 
>      _SectionParser = {
>          MODEL_META_DATA_HEADER          :   MetaFileParser._DefineParser,
> --
> 2.6.1.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to