1## @file
2# This file contained the parser for [Packages] 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'''
15InfPackageSectionParser
16'''
17##
18# Import Modules
19#
20
21import Logger.Log as Logger
22from Logger import StringTable as ST
23from Logger.ToolError import FORMAT_INVALID
24from Parser.InfParserMisc import InfExpandMacro
25from Library import DataType as DT
26from Library.Parsing import MacroParser
27from Library.Misc import GetSplitValueList
28from Object.Parser.InfCommonObject import InfLineCommentObject
29from Parser.InfParserMisc import InfParserSectionRoot
30
31class InfPackageSectionParser(InfParserSectionRoot):
32    ## InfPackageParser
33    #
34    #
35    def InfPackageParser(self, SectionString, InfSectionObject, FileName):
36        #
37        # Macro defined in this section
38        #
39        SectionMacros = {}
40        ValueList     = []
41        PackageList   = []
42        StillCommentFalg  = False
43        HeaderComments    = []
44        LineComment       = None
45        #
46        # Parse section content
47        #
48        for Line in SectionString:
49            PkgLineContent = Line[0]
50            PkgLineNo      = Line[1]
51
52            if PkgLineContent.strip() == '':
53                continue
54
55            #
56            # Find Header Comments
57            #
58            if PkgLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT):
59                #
60                # Last line is comments, and this line go on.
61                #
62                if StillCommentFalg:
63                    HeaderComments.append(Line)
64                    continue
65                #
66                # First time encounter comment
67                #
68                else:
69                    #
70                    # Clear original data
71                    #
72                    HeaderComments = []
73                    HeaderComments.append(Line)
74                    StillCommentFalg = True
75                    continue
76            else:
77                StillCommentFalg = False
78
79            if len(HeaderComments) >= 1:
80                LineComment = InfLineCommentObject()
81                LineCommentContent = ''
82                for Item in HeaderComments:
83                    LineCommentContent += Item[0] + DT.END_OF_LINE
84                LineComment.SetHeaderComments(LineCommentContent)
85
86            #
87            # Find Tail comment.
88            #
89            if PkgLineContent.find(DT.TAB_COMMENT_SPLIT) > -1:
90                TailComments = PkgLineContent[PkgLineContent.find(DT.TAB_COMMENT_SPLIT):]
91                PkgLineContent = PkgLineContent[:PkgLineContent.find(DT.TAB_COMMENT_SPLIT)]
92                if LineComment == None:
93                    LineComment = InfLineCommentObject()
94                LineComment.SetTailComments(TailComments)
95            #
96            # Find Macro
97            #
98            Name, Value = MacroParser((PkgLineContent, PkgLineNo),
99                                      FileName,
100                                      DT.MODEL_META_DATA_PACKAGE,
101                                      self.FileLocalMacros)
102            if Name != None:
103                SectionMacros[Name] = Value
104                LineComment = None
105                HeaderComments = []
106                continue
107
108            TokenList = GetSplitValueList(PkgLineContent, DT.TAB_VALUE_SPLIT, 1)
109            ValueList[0:len(TokenList)] = TokenList
110
111            #
112            # Replace with Local section Macro and [Defines] section Macro.
113            #
114            ValueList = [InfExpandMacro(Value, (FileName, PkgLineContent, PkgLineNo),
115                                        self.FileLocalMacros, SectionMacros, True)
116                                        for Value in ValueList]
117
118            PackageList.append((ValueList, LineComment,
119                                (PkgLineContent, PkgLineNo, FileName)))
120            ValueList = []
121            LineComment = None
122            TailComments = ''
123            HeaderComments = []
124            continue
125
126        #
127        # Current section archs
128        #
129        ArchList = []
130        for Item in self.LastSectionHeaderContent:
131            if Item[1] not in ArchList:
132                ArchList.append(Item[1])
133
134        if not InfSectionObject.SetPackages(PackageList, Arch = ArchList):
135            Logger.Error('InfParser',
136                         FORMAT_INVALID,
137                         ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR\
138                         %("[Packages]"),
139                         File=FileName,
140                         Line=Item[3])