2 # This file is used to define class objects of INF file [Packages] section.
3 # It will consumed by InfParser.
5 # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
7 # This program and the accompanying materials are licensed and made available
8 # under the terms and conditions of the BSD License which accompanies this
9 # distribution. The full text of the license may be found at
10 # http://opensource.org/licenses/bsd-license.php
12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 from Logger
import StringTable
as ST
20 from Logger
import ToolError
21 import Logger
.Log
as Logger
22 from Library
import GlobalData
24 from Library
.Misc
import Sdict
25 from Library
.ParserValidate
import IsValidPath
26 from Library
.ExpressionValidate
import IsValidFeatureFlagExp
28 class InfPackageItem():
33 self
.PackageName
= PackageName
34 self
.FeatureFlagExp
= FeatureFlagExp
35 self
.HelpString
= HelpString
38 def SetPackageName(self
, PackageName
):
39 self
.PackageName
= PackageName
40 def GetPackageName(self
):
41 return self
.PackageName
43 def SetFeatureFlagExp(self
, FeatureFlagExp
):
44 self
.FeatureFlagExp
= FeatureFlagExp
45 def GetFeatureFlagExp(self
):
46 return self
.FeatureFlagExp
48 def SetHelpString(self
, HelpString
):
49 self
.HelpString
= HelpString
50 def GetHelpString(self
):
51 return self
.HelpString
53 def SetSupArchList(self
, SupArchList
):
54 self
.SupArchList
= SupArchList
55 def GetSupArchList(self
):
56 return self
.SupArchList
59 ## INF package section
63 class InfPackageObject():
65 self
.Packages
= Sdict()
67 # Macro defined in this section should be only used in this section.
71 def SetPackages(self
, PackageData
, Arch
= None):
72 IsValidFileFlag
= False
78 if (ArchItem
== '' or ArchItem
is None):
80 SupArchList
.append(ArchItem
)
82 for PackageItem
in PackageData
:
83 PackageItemObj
= InfPackageItem()
84 HelpStringObj
= PackageItem
[1]
85 CurrentLineOfPackItem
= PackageItem
[2]
86 PackageItem
= PackageItem
[0]
87 if HelpStringObj
is not None:
88 HelpString
= HelpStringObj
.HeaderComments
+ HelpStringObj
.TailComments
89 PackageItemObj
.SetHelpString(HelpString
)
90 if len(PackageItem
) >= 1:
92 # Validate file exist/format.
94 if IsValidPath(PackageItem
[0], ''):
95 IsValidFileFlag
= True
96 elif IsValidPath(PackageItem
[0], GlobalData
.gINF_MODULE_DIR
):
97 IsValidFileFlag
= True
98 elif IsValidPath(PackageItem
[0], GlobalData
.gWORKSPACE
):
99 IsValidFileFlag
= True
101 Logger
.Error("InfParser",
102 ToolError
.FORMAT_INVALID
,
103 ST
.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID
%(PackageItem
[0]),
104 File
=CurrentLineOfPackItem
[2],
105 Line
=CurrentLineOfPackItem
[1],
106 ExtraData
=CurrentLineOfPackItem
[0])
109 PackageItemObj
.SetPackageName(PackageItem
[0])
110 if len(PackageItem
) == 2:
112 # Validate Feature Flag Express
114 if PackageItem
[1].strip() == '':
115 Logger
.Error("InfParser",
116 ToolError
.FORMAT_INVALID
,
117 ST
.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING
,
118 File
=CurrentLineOfPackItem
[2],
119 Line
=CurrentLineOfPackItem
[1],
120 ExtraData
=CurrentLineOfPackItem
[0])
124 FeatureFlagRtv
= IsValidFeatureFlagExp(PackageItem
[1].strip())
125 if not FeatureFlagRtv
[0]:
126 Logger
.Error("InfParser",
127 ToolError
.FORMAT_INVALID
,
128 ST
.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID
%(FeatureFlagRtv
[1]),
129 File
=CurrentLineOfPackItem
[2],
130 Line
=CurrentLineOfPackItem
[1],
131 ExtraData
=CurrentLineOfPackItem
[0])
133 PackageItemObj
.SetFeatureFlagExp(PackageItem
[1].strip())
135 if len(PackageItem
) > 2:
137 # Invalid format of Package statement
139 Logger
.Error("InfParser",
140 ToolError
.FORMAT_INVALID
,
141 ST
.ERR_INF_PARSER_PACKAGE_SECTION_CONTENT_ERROR
,
142 File
=CurrentLineOfPackItem
[2],
143 Line
=CurrentLineOfPackItem
[1],
144 ExtraData
=CurrentLineOfPackItem
[0])
145 PackageItemObj
.SetSupArchList(SupArchList
)
148 # Determine package file name duplicate. Follow below rule:
150 # A package filename must not be duplicated within a [Packages]
151 # section. Package filenames may appear in multiple architectural
152 # [Packages] sections. A package filename listed in an
153 # architectural [Packages] section must not be listed in the common
154 # architectural [Packages] section.
156 # NOTE: This check will not report error now.
158 for Item
in self
.Packages
:
159 if Item
.GetPackageName() == PackageItemObj
.GetPackageName():
160 ItemSupArchList
= Item
.GetSupArchList()
161 for ItemArch
in ItemSupArchList
:
162 for PackageItemObjArch
in SupArchList
:
163 if ItemArch
== PackageItemObjArch
:
165 # ST.ERR_INF_PARSER_ITEM_DUPLICATE
168 if ItemArch
.upper() == 'COMMON' or PackageItemObjArch
.upper() == 'COMMON':
170 # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON
174 if self
.Packages
.has_key((PackageItemObj
)):
175 PackageList
= self
.Packages
[PackageItemObj
]
176 PackageList
.append(PackageItemObj
)
177 self
.Packages
[PackageItemObj
] = PackageList
180 PackageList
.append(PackageItemObj
)
181 self
.Packages
[PackageItemObj
] = PackageList
185 def GetPackages(self
, Arch
= None):