]>
Commit | Line | Data |
---|---|---|
4234283c LG |
1 | ## @file\r |
2 | # This file is used to define class objects of INF file [Packages] section. \r | |
3 | # It will consumed by InfParser. \r | |
4 | #\r | |
5 | # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r | |
6 | #\r | |
7 | # This program and the accompanying materials are licensed and made available \r | |
8 | # under the terms and conditions of the BSD License which accompanies this \r | |
9 | # distribution. The full text of the license may be found at \r | |
10 | # http://opensource.org/licenses/bsd-license.php\r | |
11 | #\r | |
12 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
13 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
14 | \r | |
15 | '''\r | |
16 | InfPackageObject\r | |
17 | '''\r | |
18 | \r | |
19 | from Logger import StringTable as ST\r | |
20 | from Logger import ToolError\r | |
21 | import Logger.Log as Logger\r | |
22 | from Library import GlobalData \r | |
23 | \r | |
24 | from Library.Misc import Sdict\r | |
25 | from Library.ParserValidate import IsValidPath\r | |
26 | from Library.ExpressionValidate import IsValidFeatureFlagExp \r | |
27 | \r | |
28 | class InfPackageItem():\r | |
29 | def __init__(self, \r | |
30 | PackageName = '',\r | |
31 | FeatureFlagExp = '',\r | |
32 | HelpString = ''):\r | |
33 | self.PackageName = PackageName\r | |
34 | self.FeatureFlagExp = FeatureFlagExp\r | |
35 | self.HelpString = HelpString\r | |
36 | self.SupArchList = []\r | |
37 | \r | |
38 | def SetPackageName(self, PackageName):\r | |
39 | self.PackageName = PackageName\r | |
40 | def GetPackageName(self):\r | |
41 | return self.PackageName\r | |
42 | \r | |
43 | def SetFeatureFlagExp(self, FeatureFlagExp):\r | |
44 | self.FeatureFlagExp = FeatureFlagExp\r | |
45 | def GetFeatureFlagExp(self):\r | |
46 | return self.FeatureFlagExp\r | |
47 | \r | |
48 | def SetHelpString(self, HelpString):\r | |
49 | self.HelpString = HelpString\r | |
50 | def GetHelpString(self):\r | |
51 | return self.HelpString\r | |
52 | \r | |
53 | def SetSupArchList(self, SupArchList):\r | |
54 | self.SupArchList = SupArchList\r | |
55 | def GetSupArchList(self):\r | |
56 | return self.SupArchList\r | |
57 | \r | |
58 | \r | |
59 | ## INF package section\r | |
60 | #\r | |
61 | #\r | |
62 | #\r | |
63 | class InfPackageObject():\r | |
64 | def __init__(self):\r | |
65 | self.Packages = Sdict()\r | |
66 | #\r | |
67 | # Macro defined in this section should be only used in this section.\r | |
68 | #\r | |
69 | self.Macros = {}\r | |
70 | \r | |
71 | def SetPackages(self, PackageData, Arch = None):\r | |
72 | IsValidFileFlag = False\r | |
73 | SupArchList = []\r | |
74 | for ArchItem in Arch:\r | |
75 | #\r | |
76 | # Validate Arch\r | |
77 | # \r | |
4231a819 | 78 | if (ArchItem == '' or ArchItem is None):\r |
4234283c LG |
79 | ArchItem = 'COMMON'\r |
80 | SupArchList.append(ArchItem) \r | |
81 | \r | |
82 | for PackageItem in PackageData:\r | |
83 | PackageItemObj = InfPackageItem()\r | |
84 | HelpStringObj = PackageItem[1]\r | |
85 | CurrentLineOfPackItem = PackageItem[2]\r | |
86 | PackageItem = PackageItem[0]\r | |
4231a819 | 87 | if HelpStringObj is not None:\r |
4234283c LG |
88 | HelpString = HelpStringObj.HeaderComments + HelpStringObj.TailComments\r |
89 | PackageItemObj.SetHelpString(HelpString) \r | |
90 | if len(PackageItem) >= 1:\r | |
91 | #\r | |
92 | # Validate file exist/format.\r | |
93 | #\r | |
94 | if IsValidPath(PackageItem[0], ''):\r | |
95 | IsValidFileFlag = True\r | |
96 | elif IsValidPath(PackageItem[0], GlobalData.gINF_MODULE_DIR):\r | |
97 | IsValidFileFlag = True \r | |
98 | elif IsValidPath(PackageItem[0], GlobalData.gWORKSPACE):\r | |
99 | IsValidFileFlag = True\r | |
100 | else:\r | |
101 | Logger.Error("InfParser", \r | |
102 | ToolError.FORMAT_INVALID,\r | |
103 | ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(PackageItem[0]),\r | |
104 | File=CurrentLineOfPackItem[2], \r | |
105 | Line=CurrentLineOfPackItem[1], \r | |
106 | ExtraData=CurrentLineOfPackItem[0])\r | |
107 | return False\r | |
108 | if IsValidFileFlag: \r | |
109 | PackageItemObj.SetPackageName(PackageItem[0])\r | |
110 | if len(PackageItem) == 2:\r | |
111 | #\r | |
112 | # Validate Feature Flag Express\r | |
113 | #\r | |
114 | if PackageItem[1].strip() == '':\r | |
115 | Logger.Error("InfParser", \r | |
116 | ToolError.FORMAT_INVALID, \r | |
117 | ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r | |
118 | File=CurrentLineOfPackItem[2], \r | |
119 | Line=CurrentLineOfPackItem[1], \r | |
120 | ExtraData=CurrentLineOfPackItem[0])\r | |
121 | #\r | |
122 | # Validate FFE \r | |
123 | #\r | |
124 | FeatureFlagRtv = IsValidFeatureFlagExp(PackageItem[1].strip())\r | |
125 | if not FeatureFlagRtv[0]:\r | |
126 | Logger.Error("InfParser", \r | |
127 | ToolError.FORMAT_INVALID,\r | |
128 | ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r | |
129 | File=CurrentLineOfPackItem[2], \r | |
130 | Line=CurrentLineOfPackItem[1], \r | |
131 | ExtraData=CurrentLineOfPackItem[0])\r | |
132 | \r | |
133 | PackageItemObj.SetFeatureFlagExp(PackageItem[1].strip())\r | |
134 | \r | |
135 | if len(PackageItem) > 2:\r | |
136 | #\r | |
137 | # Invalid format of Package statement \r | |
138 | #\r | |
139 | Logger.Error("InfParser", \r | |
140 | ToolError.FORMAT_INVALID, \r | |
141 | ST.ERR_INF_PARSER_PACKAGE_SECTION_CONTENT_ERROR,\r | |
142 | File=CurrentLineOfPackItem[2], \r | |
143 | Line=CurrentLineOfPackItem[1], \r | |
144 | ExtraData=CurrentLineOfPackItem[0])\r | |
145 | PackageItemObj.SetSupArchList(SupArchList)\r | |
146 | \r | |
147 | #\r | |
148 | # Determine package file name duplicate. Follow below rule:\r | |
149 | #\r | |
150 | # A package filename must not be duplicated within a [Packages] \r | |
151 | # section. Package filenames may appear in multiple architectural \r | |
152 | # [Packages] sections. A package filename listed in an \r | |
153 | # architectural [Packages] section must not be listed in the common\r | |
154 | # architectural [Packages] section.\r | |
155 | # \r | |
156 | # NOTE: This check will not report error now.\r | |
157 | # \r | |
158 | for Item in self.Packages:\r | |
159 | if Item.GetPackageName() == PackageItemObj.GetPackageName():\r | |
160 | ItemSupArchList = Item.GetSupArchList()\r | |
161 | for ItemArch in ItemSupArchList:\r | |
162 | for PackageItemObjArch in SupArchList:\r | |
163 | if ItemArch == PackageItemObjArch:\r | |
164 | #\r | |
165 | # ST.ERR_INF_PARSER_ITEM_DUPLICATE\r | |
166 | #\r | |
167 | pass\r | |
168 | if ItemArch.upper() == 'COMMON' or PackageItemObjArch.upper() == 'COMMON':\r | |
169 | #\r | |
170 | # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON\r | |
171 | #\r | |
172 | pass\r | |
173 | \r | |
174 | if self.Packages.has_key((PackageItemObj)): \r | |
175 | PackageList = self.Packages[PackageItemObj]\r | |
176 | PackageList.append(PackageItemObj)\r | |
177 | self.Packages[PackageItemObj] = PackageList\r | |
178 | else:\r | |
179 | PackageList = []\r | |
180 | PackageList.append(PackageItemObj)\r | |
181 | self.Packages[PackageItemObj] = PackageList\r | |
182 | \r | |
183 | return True\r | |
184 | \r | |
185 | def GetPackages(self, Arch = None):\r | |
4231a819 | 186 | if Arch is None:\r |
4234283c | 187 | return self.Packages |