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