Home | History | Annotate | Download | only in Parser
      1 ## @file

      2 # This file contained the parser for define sections in INF file 

      3 #

      4 # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>

      5 #

      6 # This program and the accompanying materials are licensed and made available 

      7 # under the terms and conditions of the BSD License which accompanies this 

      8 # distribution. The full text of the license may be found at 

      9 # http://opensource.org/licenses/bsd-license.php

     10 #

     11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     13 #

     14 
     15 '''
     16 InfDefineSectionParser
     17 '''
     18 ##

     19 # Import Modules

     20 #

     21 import re
     22 
     23 from Library import DataType as DT
     24 from Library import GlobalData
     25 from Library.Parsing import MacroParser
     26 from Library.Misc import GetSplitValueList
     27 from Library.ParserValidate import IsValidArch
     28 from Object.Parser.InfCommonObject import InfLineCommentObject
     29 from Object.Parser.InfDefineObject import InfDefMember
     30 from Parser.InfParserMisc import InfExpandMacro
     31 from Object.Parser.InfMisc import ErrorInInf
     32 from Logger import StringTable as ST
     33 from Parser.InfParserMisc import InfParserSectionRoot
     34 
     35 ## __GetValidateArchList

     36 #        

     37 #

     38 def GetValidateArchList(LineContent):
     39     
     40     TempArch = ''
     41     ArchList = []
     42     ValidateAcrhPatten = re.compile(r"^\s*#\s*VALID_ARCHITECTURES\s*=\s*.*$", re.DOTALL)
     43     
     44     if ValidateAcrhPatten.match(LineContent):
     45         TempArch = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1)[1]
     46                                 
     47         TempArch = GetSplitValueList(TempArch, '(', 1)[0]
     48                                 
     49         ArchList = re.split('\s+', TempArch)
     50         NewArchList = []
     51         for Arch in ArchList:
     52             if IsValidArch(Arch):
     53                 NewArchList.append(Arch)
     54         
     55         ArchList = NewArchList
     56         
     57     return ArchList   
     58 
     59 class InfDefinSectionParser(InfParserSectionRoot):
     60     def InfDefineParser(self, SectionString, InfSectionObject, FileName, SectionComment):
     61         
     62         if SectionComment:
     63             pass
     64         #

     65         # Parser Defines section content and fill self._ContentList dict.

     66         #

     67         StillCommentFalg  = False
     68         HeaderComments = []
     69         SectionContent = ''
     70         ArchList       = []
     71         _ContentList   = []
     72         _ValueList     = []
     73         #

     74         # Add WORKSPACE to global Marco dict.

     75         #

     76         self.FileLocalMacros['WORKSPACE'] = GlobalData.gWORKSPACE
     77         
     78         for Line in SectionString:
     79             LineContent = Line[0]
     80             LineNo      = Line[1]
     81             TailComments   = ''
     82             LineComment    = None
     83             
     84             LineInfo       = ['', -1, '']
     85             LineInfo[0]    = FileName
     86             LineInfo[1]    = LineNo
     87             LineInfo[2]    = LineContent
     88             
     89             if LineContent.strip() == '':
     90                 continue
     91             #

     92             # The first time encountered VALIDATE_ARCHITECHERS will be considered as support arch list.

     93             #

     94             if not ArchList:
     95                 ArchList = GetValidateArchList(LineContent)
     96 
     97             #

     98             # Parser Comment

     99             #

    100             if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT):
    101                 #

    102                 # Last line is comments, and this line go on.

    103                 #

    104                 if StillCommentFalg:
    105                     HeaderComments.append(Line)
    106                     SectionContent += LineContent + DT.END_OF_LINE
    107                     continue
    108                 #

    109                 # First time encounter comment 

    110                 #

    111                 else:
    112                     #

    113                     # Clear original data

    114                     #

    115                     HeaderComments = []
    116                     HeaderComments.append(Line)
    117                     StillCommentFalg = True
    118                     SectionContent += LineContent + DT.END_OF_LINE
    119                     continue
    120             else:
    121                 StillCommentFalg = False
    122                           
    123             if len(HeaderComments) >= 1:
    124                 LineComment = InfLineCommentObject()
    125                 LineCommentContent = ''
    126                 for Item in HeaderComments:
    127                     LineCommentContent += Item[0] + DT.END_OF_LINE
    128                 LineComment.SetHeaderComments(LineCommentContent)
    129             
    130             #

    131             # Find Tail comment.

    132             #

    133             if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1:
    134                 TailComments = LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):]
    135                 LineContent = LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)]
    136                 if LineComment == None:
    137                     LineComment = InfLineCommentObject()
    138                 LineComment.SetTailComments(TailComments)
    139                               
    140             #

    141             # Find Macro

    142             #

    143             Name, Value = MacroParser((LineContent, LineNo), 
    144                                       FileName, 
    145                                       DT.MODEL_META_DATA_HEADER, 
    146                                       self.FileLocalMacros)
    147             if Name != None:
    148                 self.FileLocalMacros[Name] = Value
    149                 continue            
    150 
    151             #

    152             # Replace with [Defines] section Macro

    153             #

    154             LineContent = InfExpandMacro(LineContent, 
    155                                          (FileName, LineContent, LineNo), 
    156                                          self.FileLocalMacros, 
    157                                          None, True)
    158                        
    159             SectionContent += LineContent + DT.END_OF_LINE
    160             
    161             TokenList = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1)
    162             if len(TokenList) < 2:
    163                 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE,
    164                            LineInfo=LineInfo)                
    165             _ValueList[0:len(TokenList)] = TokenList
    166             if not _ValueList[0]:
    167                 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_NAME,
    168                            LineInfo=LineInfo)
    169             if not _ValueList[1]:
    170                 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE,
    171                            LineInfo=LineInfo)   
    172    
    173             Name, Value = _ValueList[0], _ValueList[1]            
    174             
    175             InfDefMemberObj = InfDefMember(Name, Value)
    176             if (LineComment != None):
    177                 InfDefMemberObj.Comments.SetHeaderComments(LineComment.GetHeaderComments())
    178                 InfDefMemberObj.Comments.SetTailComments(LineComment.GetTailComments())
    179                 
    180             InfDefMemberObj.CurrentLine.SetFileName(self.FullPath)
    181             InfDefMemberObj.CurrentLine.SetLineString(LineContent)
    182             InfDefMemberObj.CurrentLine.SetLineNo(LineNo)
    183                        
    184             _ContentList.append(InfDefMemberObj)
    185             HeaderComments = []
    186             TailComments = ''
    187         
    188         #

    189         # Current Define section archs

    190         #

    191         if not ArchList:
    192             ArchList = ['COMMON']
    193         
    194         InfSectionObject.SetAllContent(SectionContent)                
    195         
    196         InfSectionObject.SetDefines(_ContentList, Arch=ArchList)
    197