]>
Commit | Line | Data |
---|---|---|
4234283c | 1 | ## @file\r |
f7496d71 LG |
2 | # This file is used to define class objects of INF file [Packages] section.\r |
3 | # It will consumed by InfParser.\r | |
4234283c | 4 | #\r |
f7496d71 | 5 | # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r |
4234283c | 6 | #\r |
f7496d71 LG |
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 | |
4234283c LG |
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 | |
f7496d71 | 22 | from Library import GlobalData\r |
4234283c LG |
23 | \r |
24 | from Library.Misc import Sdict\r | |
25 | from Library.ParserValidate import IsValidPath\r | |
f7496d71 | 26 | from Library.ExpressionValidate import IsValidFeatureFlagExp\r |
4234283c LG |
27 | \r |
28 | class InfPackageItem():\r | |
f7496d71 | 29 | def __init__(self,\r |
4234283c LG |
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 | |
f7496d71 | 37 | \r |
4234283c LG |
38 | def SetPackageName(self, PackageName):\r |
39 | self.PackageName = PackageName\r | |
40 | def GetPackageName(self):\r | |
41 | return self.PackageName\r | |
f7496d71 | 42 | \r |
4234283c LG |
43 | def SetFeatureFlagExp(self, FeatureFlagExp):\r |
44 | self.FeatureFlagExp = FeatureFlagExp\r | |
45 | def GetFeatureFlagExp(self):\r | |
46 | return self.FeatureFlagExp\r | |
f7496d71 | 47 | \r |
4234283c LG |
48 | def SetHelpString(self, HelpString):\r |
49 | self.HelpString = HelpString\r | |
50 | def GetHelpString(self):\r | |
51 | return self.HelpString\r | |
f7496d71 | 52 | \r |
4234283c LG |
53 | def SetSupArchList(self, SupArchList):\r |
54 | self.SupArchList = SupArchList\r | |
55 | def GetSupArchList(self):\r | |
56 | return self.SupArchList\r | |
57 | \r | |
f7496d71 | 58 | \r |
4234283c LG |
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 | |
f7496d71 | 70 | \r |
4234283c LG |
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 | |
f7496d71 | 77 | #\r |
4231a819 | 78 | if (ArchItem == '' or ArchItem is None):\r |
4234283c | 79 | ArchItem = 'COMMON'\r |
f7496d71 LG |
80 | SupArchList.append(ArchItem)\r |
81 | \r | |
4234283c LG |
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 | 88 | HelpString = HelpStringObj.HeaderComments + HelpStringObj.TailComments\r |
f7496d71 | 89 | PackageItemObj.SetHelpString(HelpString)\r |
4234283c LG |
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 | |
f7496d71 | 97 | IsValidFileFlag = True\r |
4234283c LG |
98 | elif IsValidPath(PackageItem[0], GlobalData.gWORKSPACE):\r |
99 | IsValidFileFlag = True\r | |
100 | else:\r | |
f7496d71 | 101 | Logger.Error("InfParser",\r |
4234283c LG |
102 | ToolError.FORMAT_INVALID,\r |
103 | ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(PackageItem[0]),\r | |
f7496d71 LG |
104 | File=CurrentLineOfPackItem[2],\r |
105 | Line=CurrentLineOfPackItem[1],\r | |
4234283c LG |
106 | ExtraData=CurrentLineOfPackItem[0])\r |
107 | return False\r | |
f7496d71 | 108 | if IsValidFileFlag:\r |
4234283c LG |
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 | |
f7496d71 LG |
115 | Logger.Error("InfParser",\r |
116 | ToolError.FORMAT_INVALID,\r | |
4234283c | 117 | ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r |
f7496d71 LG |
118 | File=CurrentLineOfPackItem[2],\r |
119 | Line=CurrentLineOfPackItem[1],\r | |
4234283c LG |
120 | ExtraData=CurrentLineOfPackItem[0])\r |
121 | #\r | |
f7496d71 | 122 | # Validate FFE\r |
4234283c LG |
123 | #\r |
124 | FeatureFlagRtv = IsValidFeatureFlagExp(PackageItem[1].strip())\r | |
125 | if not FeatureFlagRtv[0]:\r | |
f7496d71 | 126 | Logger.Error("InfParser",\r |
4234283c LG |
127 | ToolError.FORMAT_INVALID,\r |
128 | ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r | |
f7496d71 LG |
129 | File=CurrentLineOfPackItem[2],\r |
130 | Line=CurrentLineOfPackItem[1],\r | |
4234283c | 131 | ExtraData=CurrentLineOfPackItem[0])\r |
f7496d71 | 132 | \r |
4234283c | 133 | PackageItemObj.SetFeatureFlagExp(PackageItem[1].strip())\r |
f7496d71 | 134 | \r |
4234283c LG |
135 | if len(PackageItem) > 2:\r |
136 | #\r | |
f7496d71 | 137 | # Invalid format of Package statement\r |
4234283c | 138 | #\r |
f7496d71 LG |
139 | Logger.Error("InfParser",\r |
140 | ToolError.FORMAT_INVALID,\r | |
4234283c | 141 | ST.ERR_INF_PARSER_PACKAGE_SECTION_CONTENT_ERROR,\r |
f7496d71 LG |
142 | File=CurrentLineOfPackItem[2],\r |
143 | Line=CurrentLineOfPackItem[1],\r | |
4234283c LG |
144 | ExtraData=CurrentLineOfPackItem[0])\r |
145 | PackageItemObj.SetSupArchList(SupArchList)\r | |
f7496d71 | 146 | \r |
4234283c LG |
147 | #\r |
148 | # Determine package file name duplicate. Follow below rule:\r | |
149 | #\r | |
f7496d71 LG |
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 | |
4234283c LG |
153 | # architectural [Packages] section must not be listed in the common\r |
154 | # architectural [Packages] section.\r | |
f7496d71 | 155 | #\r |
4234283c | 156 | # NOTE: This check will not report error now.\r |
f7496d71 | 157 | #\r |
4234283c LG |
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 | |
f7496d71 | 173 | \r |
27c4ceb4 | 174 | if (PackageItemObj) in self.Packages:\r |
4234283c LG |
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 | |
f7496d71 | 182 | \r |
4234283c | 183 | return True\r |
f7496d71 | 184 | \r |
4234283c | 185 | def GetPackages(self, Arch = None):\r |
4231a819 | 186 | if Arch is None:\r |
27c4ceb4 | 187 | return self.Packages\r |