]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/InfPackagesObject.py
BaseTools: Replace BSD License with BSD+Patent License
[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
2e351cbe 7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
8\r
9'''\r
10InfPackageObject\r
11'''\r
12\r
13from Logger import StringTable as ST\r
14from Logger import ToolError\r
15import Logger.Log as Logger\r
f7496d71 16from Library import GlobalData\r
4234283c
LG
17\r
18from Library.Misc import Sdict\r
19from Library.ParserValidate import IsValidPath\r
f7496d71 20from Library.ExpressionValidate import IsValidFeatureFlagExp\r
4234283c
LG
21\r
22class 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
57class 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