14234283c3acb8c35014acc1546621fbc2621b095lgao## @file 24234283c3acb8c35014acc1546621fbc2621b095lgao# This file is used to define class objects of INF file [Packages] section. 34234283c3acb8c35014acc1546621fbc2621b095lgao# It will consumed by InfParser. 44234283c3acb8c35014acc1546621fbc2621b095lgao# 54234283c3acb8c35014acc1546621fbc2621b095lgao# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> 64234283c3acb8c35014acc1546621fbc2621b095lgao# 74234283c3acb8c35014acc1546621fbc2621b095lgao# This program and the accompanying materials are licensed and made available 84234283c3acb8c35014acc1546621fbc2621b095lgao# under the terms and conditions of the BSD License which accompanies this 94234283c3acb8c35014acc1546621fbc2621b095lgao# distribution. The full text of the license may be found at 104234283c3acb8c35014acc1546621fbc2621b095lgao# http://opensource.org/licenses/bsd-license.php 114234283c3acb8c35014acc1546621fbc2621b095lgao# 124234283c3acb8c35014acc1546621fbc2621b095lgao# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 134234283c3acb8c35014acc1546621fbc2621b095lgao# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 144234283c3acb8c35014acc1546621fbc2621b095lgao 154234283c3acb8c35014acc1546621fbc2621b095lgao''' 164234283c3acb8c35014acc1546621fbc2621b095lgaoInfPackageObject 174234283c3acb8c35014acc1546621fbc2621b095lgao''' 184234283c3acb8c35014acc1546621fbc2621b095lgao 194234283c3acb8c35014acc1546621fbc2621b095lgaofrom Logger import StringTable as ST 204234283c3acb8c35014acc1546621fbc2621b095lgaofrom Logger import ToolError 214234283c3acb8c35014acc1546621fbc2621b095lgaoimport Logger.Log as Logger 224234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library import GlobalData 234234283c3acb8c35014acc1546621fbc2621b095lgao 244234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library.Misc import Sdict 254234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library.ParserValidate import IsValidPath 264234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library.ExpressionValidate import IsValidFeatureFlagExp 274234283c3acb8c35014acc1546621fbc2621b095lgao 284234283c3acb8c35014acc1546621fbc2621b095lgaoclass InfPackageItem(): 294234283c3acb8c35014acc1546621fbc2621b095lgao def __init__(self, 304234283c3acb8c35014acc1546621fbc2621b095lgao PackageName = '', 314234283c3acb8c35014acc1546621fbc2621b095lgao FeatureFlagExp = '', 324234283c3acb8c35014acc1546621fbc2621b095lgao HelpString = ''): 334234283c3acb8c35014acc1546621fbc2621b095lgao self.PackageName = PackageName 344234283c3acb8c35014acc1546621fbc2621b095lgao self.FeatureFlagExp = FeatureFlagExp 354234283c3acb8c35014acc1546621fbc2621b095lgao self.HelpString = HelpString 364234283c3acb8c35014acc1546621fbc2621b095lgao self.SupArchList = [] 374234283c3acb8c35014acc1546621fbc2621b095lgao 384234283c3acb8c35014acc1546621fbc2621b095lgao def SetPackageName(self, PackageName): 394234283c3acb8c35014acc1546621fbc2621b095lgao self.PackageName = PackageName 404234283c3acb8c35014acc1546621fbc2621b095lgao def GetPackageName(self): 414234283c3acb8c35014acc1546621fbc2621b095lgao return self.PackageName 424234283c3acb8c35014acc1546621fbc2621b095lgao 434234283c3acb8c35014acc1546621fbc2621b095lgao def SetFeatureFlagExp(self, FeatureFlagExp): 444234283c3acb8c35014acc1546621fbc2621b095lgao self.FeatureFlagExp = FeatureFlagExp 454234283c3acb8c35014acc1546621fbc2621b095lgao def GetFeatureFlagExp(self): 464234283c3acb8c35014acc1546621fbc2621b095lgao return self.FeatureFlagExp 474234283c3acb8c35014acc1546621fbc2621b095lgao 484234283c3acb8c35014acc1546621fbc2621b095lgao def SetHelpString(self, HelpString): 494234283c3acb8c35014acc1546621fbc2621b095lgao self.HelpString = HelpString 504234283c3acb8c35014acc1546621fbc2621b095lgao def GetHelpString(self): 514234283c3acb8c35014acc1546621fbc2621b095lgao return self.HelpString 524234283c3acb8c35014acc1546621fbc2621b095lgao 534234283c3acb8c35014acc1546621fbc2621b095lgao def SetSupArchList(self, SupArchList): 544234283c3acb8c35014acc1546621fbc2621b095lgao self.SupArchList = SupArchList 554234283c3acb8c35014acc1546621fbc2621b095lgao def GetSupArchList(self): 564234283c3acb8c35014acc1546621fbc2621b095lgao return self.SupArchList 574234283c3acb8c35014acc1546621fbc2621b095lgao 584234283c3acb8c35014acc1546621fbc2621b095lgao 594234283c3acb8c35014acc1546621fbc2621b095lgao## INF package section 604234283c3acb8c35014acc1546621fbc2621b095lgao# 614234283c3acb8c35014acc1546621fbc2621b095lgao# 624234283c3acb8c35014acc1546621fbc2621b095lgao# 634234283c3acb8c35014acc1546621fbc2621b095lgaoclass InfPackageObject(): 644234283c3acb8c35014acc1546621fbc2621b095lgao def __init__(self): 654234283c3acb8c35014acc1546621fbc2621b095lgao self.Packages = Sdict() 664234283c3acb8c35014acc1546621fbc2621b095lgao # 674234283c3acb8c35014acc1546621fbc2621b095lgao # Macro defined in this section should be only used in this section. 684234283c3acb8c35014acc1546621fbc2621b095lgao # 694234283c3acb8c35014acc1546621fbc2621b095lgao self.Macros = {} 704234283c3acb8c35014acc1546621fbc2621b095lgao 714234283c3acb8c35014acc1546621fbc2621b095lgao def SetPackages(self, PackageData, Arch = None): 724234283c3acb8c35014acc1546621fbc2621b095lgao IsValidFileFlag = False 734234283c3acb8c35014acc1546621fbc2621b095lgao SupArchList = [] 744234283c3acb8c35014acc1546621fbc2621b095lgao for ArchItem in Arch: 754234283c3acb8c35014acc1546621fbc2621b095lgao # 764234283c3acb8c35014acc1546621fbc2621b095lgao # Validate Arch 774234283c3acb8c35014acc1546621fbc2621b095lgao # 784234283c3acb8c35014acc1546621fbc2621b095lgao if (ArchItem == '' or ArchItem == None): 794234283c3acb8c35014acc1546621fbc2621b095lgao ArchItem = 'COMMON' 804234283c3acb8c35014acc1546621fbc2621b095lgao SupArchList.append(ArchItem) 814234283c3acb8c35014acc1546621fbc2621b095lgao 824234283c3acb8c35014acc1546621fbc2621b095lgao for PackageItem in PackageData: 834234283c3acb8c35014acc1546621fbc2621b095lgao PackageItemObj = InfPackageItem() 844234283c3acb8c35014acc1546621fbc2621b095lgao HelpStringObj = PackageItem[1] 854234283c3acb8c35014acc1546621fbc2621b095lgao CurrentLineOfPackItem = PackageItem[2] 864234283c3acb8c35014acc1546621fbc2621b095lgao PackageItem = PackageItem[0] 874234283c3acb8c35014acc1546621fbc2621b095lgao if HelpStringObj != None: 884234283c3acb8c35014acc1546621fbc2621b095lgao HelpString = HelpStringObj.HeaderComments + HelpStringObj.TailComments 894234283c3acb8c35014acc1546621fbc2621b095lgao PackageItemObj.SetHelpString(HelpString) 904234283c3acb8c35014acc1546621fbc2621b095lgao if len(PackageItem) >= 1: 914234283c3acb8c35014acc1546621fbc2621b095lgao # 924234283c3acb8c35014acc1546621fbc2621b095lgao # Validate file exist/format. 934234283c3acb8c35014acc1546621fbc2621b095lgao # 944234283c3acb8c35014acc1546621fbc2621b095lgao if IsValidPath(PackageItem[0], ''): 954234283c3acb8c35014acc1546621fbc2621b095lgao IsValidFileFlag = True 964234283c3acb8c35014acc1546621fbc2621b095lgao elif IsValidPath(PackageItem[0], GlobalData.gINF_MODULE_DIR): 974234283c3acb8c35014acc1546621fbc2621b095lgao IsValidFileFlag = True 984234283c3acb8c35014acc1546621fbc2621b095lgao elif IsValidPath(PackageItem[0], GlobalData.gWORKSPACE): 994234283c3acb8c35014acc1546621fbc2621b095lgao IsValidFileFlag = True 1004234283c3acb8c35014acc1546621fbc2621b095lgao else: 1014234283c3acb8c35014acc1546621fbc2621b095lgao Logger.Error("InfParser", 1024234283c3acb8c35014acc1546621fbc2621b095lgao ToolError.FORMAT_INVALID, 1034234283c3acb8c35014acc1546621fbc2621b095lgao ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(PackageItem[0]), 1044234283c3acb8c35014acc1546621fbc2621b095lgao File=CurrentLineOfPackItem[2], 1054234283c3acb8c35014acc1546621fbc2621b095lgao Line=CurrentLineOfPackItem[1], 1064234283c3acb8c35014acc1546621fbc2621b095lgao ExtraData=CurrentLineOfPackItem[0]) 1074234283c3acb8c35014acc1546621fbc2621b095lgao return False 1084234283c3acb8c35014acc1546621fbc2621b095lgao if IsValidFileFlag: 1094234283c3acb8c35014acc1546621fbc2621b095lgao PackageItemObj.SetPackageName(PackageItem[0]) 1104234283c3acb8c35014acc1546621fbc2621b095lgao if len(PackageItem) == 2: 1114234283c3acb8c35014acc1546621fbc2621b095lgao # 1124234283c3acb8c35014acc1546621fbc2621b095lgao # Validate Feature Flag Express 1134234283c3acb8c35014acc1546621fbc2621b095lgao # 1144234283c3acb8c35014acc1546621fbc2621b095lgao if PackageItem[1].strip() == '': 1154234283c3acb8c35014acc1546621fbc2621b095lgao Logger.Error("InfParser", 1164234283c3acb8c35014acc1546621fbc2621b095lgao ToolError.FORMAT_INVALID, 1174234283c3acb8c35014acc1546621fbc2621b095lgao ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING, 1184234283c3acb8c35014acc1546621fbc2621b095lgao File=CurrentLineOfPackItem[2], 1194234283c3acb8c35014acc1546621fbc2621b095lgao Line=CurrentLineOfPackItem[1], 1204234283c3acb8c35014acc1546621fbc2621b095lgao ExtraData=CurrentLineOfPackItem[0]) 1214234283c3acb8c35014acc1546621fbc2621b095lgao # 1224234283c3acb8c35014acc1546621fbc2621b095lgao # Validate FFE 1234234283c3acb8c35014acc1546621fbc2621b095lgao # 1244234283c3acb8c35014acc1546621fbc2621b095lgao FeatureFlagRtv = IsValidFeatureFlagExp(PackageItem[1].strip()) 1254234283c3acb8c35014acc1546621fbc2621b095lgao if not FeatureFlagRtv[0]: 1264234283c3acb8c35014acc1546621fbc2621b095lgao Logger.Error("InfParser", 1274234283c3acb8c35014acc1546621fbc2621b095lgao ToolError.FORMAT_INVALID, 1284234283c3acb8c35014acc1546621fbc2621b095lgao ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]), 1294234283c3acb8c35014acc1546621fbc2621b095lgao File=CurrentLineOfPackItem[2], 1304234283c3acb8c35014acc1546621fbc2621b095lgao Line=CurrentLineOfPackItem[1], 1314234283c3acb8c35014acc1546621fbc2621b095lgao ExtraData=CurrentLineOfPackItem[0]) 1324234283c3acb8c35014acc1546621fbc2621b095lgao 1334234283c3acb8c35014acc1546621fbc2621b095lgao PackageItemObj.SetFeatureFlagExp(PackageItem[1].strip()) 1344234283c3acb8c35014acc1546621fbc2621b095lgao 1354234283c3acb8c35014acc1546621fbc2621b095lgao if len(PackageItem) > 2: 1364234283c3acb8c35014acc1546621fbc2621b095lgao # 1374234283c3acb8c35014acc1546621fbc2621b095lgao # Invalid format of Package statement 1384234283c3acb8c35014acc1546621fbc2621b095lgao # 1394234283c3acb8c35014acc1546621fbc2621b095lgao Logger.Error("InfParser", 1404234283c3acb8c35014acc1546621fbc2621b095lgao ToolError.FORMAT_INVALID, 1414234283c3acb8c35014acc1546621fbc2621b095lgao ST.ERR_INF_PARSER_PACKAGE_SECTION_CONTENT_ERROR, 1424234283c3acb8c35014acc1546621fbc2621b095lgao File=CurrentLineOfPackItem[2], 1434234283c3acb8c35014acc1546621fbc2621b095lgao Line=CurrentLineOfPackItem[1], 1444234283c3acb8c35014acc1546621fbc2621b095lgao ExtraData=CurrentLineOfPackItem[0]) 1454234283c3acb8c35014acc1546621fbc2621b095lgao PackageItemObj.SetSupArchList(SupArchList) 1464234283c3acb8c35014acc1546621fbc2621b095lgao 1474234283c3acb8c35014acc1546621fbc2621b095lgao # 1484234283c3acb8c35014acc1546621fbc2621b095lgao # Determine package file name duplicate. Follow below rule: 1494234283c3acb8c35014acc1546621fbc2621b095lgao # 1504234283c3acb8c35014acc1546621fbc2621b095lgao # A package filename must not be duplicated within a [Packages] 1514234283c3acb8c35014acc1546621fbc2621b095lgao # section. Package filenames may appear in multiple architectural 1524234283c3acb8c35014acc1546621fbc2621b095lgao # [Packages] sections. A package filename listed in an 1534234283c3acb8c35014acc1546621fbc2621b095lgao # architectural [Packages] section must not be listed in the common 1544234283c3acb8c35014acc1546621fbc2621b095lgao # architectural [Packages] section. 1554234283c3acb8c35014acc1546621fbc2621b095lgao # 1564234283c3acb8c35014acc1546621fbc2621b095lgao # NOTE: This check will not report error now. 1574234283c3acb8c35014acc1546621fbc2621b095lgao # 1584234283c3acb8c35014acc1546621fbc2621b095lgao for Item in self.Packages: 1594234283c3acb8c35014acc1546621fbc2621b095lgao if Item.GetPackageName() == PackageItemObj.GetPackageName(): 1604234283c3acb8c35014acc1546621fbc2621b095lgao ItemSupArchList = Item.GetSupArchList() 1614234283c3acb8c35014acc1546621fbc2621b095lgao for ItemArch in ItemSupArchList: 1624234283c3acb8c35014acc1546621fbc2621b095lgao for PackageItemObjArch in SupArchList: 1634234283c3acb8c35014acc1546621fbc2621b095lgao if ItemArch == PackageItemObjArch: 1644234283c3acb8c35014acc1546621fbc2621b095lgao # 1654234283c3acb8c35014acc1546621fbc2621b095lgao # ST.ERR_INF_PARSER_ITEM_DUPLICATE 1664234283c3acb8c35014acc1546621fbc2621b095lgao # 1674234283c3acb8c35014acc1546621fbc2621b095lgao pass 1684234283c3acb8c35014acc1546621fbc2621b095lgao if ItemArch.upper() == 'COMMON' or PackageItemObjArch.upper() == 'COMMON': 1694234283c3acb8c35014acc1546621fbc2621b095lgao # 1704234283c3acb8c35014acc1546621fbc2621b095lgao # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON 1714234283c3acb8c35014acc1546621fbc2621b095lgao # 1724234283c3acb8c35014acc1546621fbc2621b095lgao pass 1734234283c3acb8c35014acc1546621fbc2621b095lgao 1744234283c3acb8c35014acc1546621fbc2621b095lgao if self.Packages.has_key((PackageItemObj)): 1754234283c3acb8c35014acc1546621fbc2621b095lgao PackageList = self.Packages[PackageItemObj] 1764234283c3acb8c35014acc1546621fbc2621b095lgao PackageList.append(PackageItemObj) 1774234283c3acb8c35014acc1546621fbc2621b095lgao self.Packages[PackageItemObj] = PackageList 1784234283c3acb8c35014acc1546621fbc2621b095lgao else: 1794234283c3acb8c35014acc1546621fbc2621b095lgao PackageList = [] 1804234283c3acb8c35014acc1546621fbc2621b095lgao PackageList.append(PackageItemObj) 1814234283c3acb8c35014acc1546621fbc2621b095lgao self.Packages[PackageItemObj] = PackageList 1824234283c3acb8c35014acc1546621fbc2621b095lgao 1834234283c3acb8c35014acc1546621fbc2621b095lgao return True 1844234283c3acb8c35014acc1546621fbc2621b095lgao 1854234283c3acb8c35014acc1546621fbc2621b095lgao def GetPackages(self, Arch = None): 1864234283c3acb8c35014acc1546621fbc2621b095lgao if Arch == None: 1874234283c3acb8c35014acc1546621fbc2621b095lgao return self.Packages