]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/InfPackagesObject.py
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfPackagesObject.py
CommitLineData
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
16InfPackageObject\r
17'''\r
18\r
19from Logger import StringTable as ST\r
20from Logger import ToolError\r
21import Logger.Log as Logger\r
f7496d71 22from Library import GlobalData\r
4234283c
LG
23\r
24from Library.Misc import Sdict\r
25from Library.ParserValidate import IsValidPath\r
f7496d71 26from Library.ExpressionValidate import IsValidFeatureFlagExp\r
4234283c
LG
27\r
28class 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
63class 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