Files

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

182 lines
7.1 KiB
Python
Raw Permalink Normal View History

## @file
2018-07-05 17:40:04 +08:00
# This file is used to define class objects of INF file [Packages] section.
# It will consumed by InfParser.
#
2018-07-05 17:40:04 +08:00
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
'''
InfPackageObject
'''
from Logger import StringTable as ST
from Logger import ToolError
import Logger.Log as Logger
2018-07-05 17:40:04 +08:00
from Library import GlobalData
from Library.Misc import Sdict
from Library.ParserValidate import IsValidPath
2018-07-05 17:40:04 +08:00
from Library.ExpressionValidate import IsValidFeatureFlagExp
class InfPackageItem():
2018-07-05 17:40:04 +08:00
def __init__(self,
PackageName = '',
FeatureFlagExp = '',
HelpString = ''):
self.PackageName = PackageName
self.FeatureFlagExp = FeatureFlagExp
self.HelpString = HelpString
self.SupArchList = []
2018-07-05 17:40:04 +08:00
def SetPackageName(self, PackageName):
self.PackageName = PackageName
def GetPackageName(self):
return self.PackageName
2018-07-05 17:40:04 +08:00
def SetFeatureFlagExp(self, FeatureFlagExp):
self.FeatureFlagExp = FeatureFlagExp
def GetFeatureFlagExp(self):
return self.FeatureFlagExp
2018-07-05 17:40:04 +08:00
def SetHelpString(self, HelpString):
self.HelpString = HelpString
def GetHelpString(self):
return self.HelpString
2018-07-05 17:40:04 +08:00
def SetSupArchList(self, SupArchList):
self.SupArchList = SupArchList
def GetSupArchList(self):
return self.SupArchList
2018-07-05 17:40:04 +08:00
## INF package section
#
#
#
class InfPackageObject():
def __init__(self):
self.Packages = Sdict()
#
# Macro defined in this section should be only used in this section.
#
self.Macros = {}
2018-07-05 17:40:04 +08:00
def SetPackages(self, PackageData, Arch = None):
IsValidFileFlag = False
SupArchList = []
for ArchItem in Arch:
#
# Validate Arch
2018-07-05 17:40:04 +08:00
#
if (ArchItem == '' or ArchItem is None):
ArchItem = 'COMMON'
2018-07-05 17:40:04 +08:00
SupArchList.append(ArchItem)
for PackageItem in PackageData:
PackageItemObj = InfPackageItem()
HelpStringObj = PackageItem[1]
CurrentLineOfPackItem = PackageItem[2]
PackageItem = PackageItem[0]
if HelpStringObj is not None:
HelpString = HelpStringObj.HeaderComments + HelpStringObj.TailComments
2018-07-05 17:40:04 +08:00
PackageItemObj.SetHelpString(HelpString)
if len(PackageItem) >= 1:
#
# Validate file exist/format.
#
if IsValidPath(PackageItem[0], ''):
IsValidFileFlag = True
elif IsValidPath(PackageItem[0], GlobalData.gINF_MODULE_DIR):
2018-07-05 17:40:04 +08:00
IsValidFileFlag = True
elif IsValidPath(PackageItem[0], GlobalData.gWORKSPACE):
IsValidFileFlag = True
else:
2018-07-05 17:40:04 +08:00
Logger.Error("InfParser",
ToolError.FORMAT_INVALID,
ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(PackageItem[0]),
2018-07-05 17:40:04 +08:00
File=CurrentLineOfPackItem[2],
Line=CurrentLineOfPackItem[1],
ExtraData=CurrentLineOfPackItem[0])
return False
2018-07-05 17:40:04 +08:00
if IsValidFileFlag:
PackageItemObj.SetPackageName(PackageItem[0])
if len(PackageItem) == 2:
#
# Validate Feature Flag Express
#
if PackageItem[1].strip() == '':
2018-07-05 17:40:04 +08:00
Logger.Error("InfParser",
ToolError.FORMAT_INVALID,
ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,
2018-07-05 17:40:04 +08:00
File=CurrentLineOfPackItem[2],
Line=CurrentLineOfPackItem[1],
ExtraData=CurrentLineOfPackItem[0])
#
2018-07-05 17:40:04 +08:00
# Validate FFE
#
FeatureFlagRtv = IsValidFeatureFlagExp(PackageItem[1].strip())
if not FeatureFlagRtv[0]:
2018-07-05 17:40:04 +08:00
Logger.Error("InfParser",
ToolError.FORMAT_INVALID,
ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),
2018-07-05 17:40:04 +08:00
File=CurrentLineOfPackItem[2],
Line=CurrentLineOfPackItem[1],
ExtraData=CurrentLineOfPackItem[0])
2018-07-05 17:40:04 +08:00
PackageItemObj.SetFeatureFlagExp(PackageItem[1].strip())
2018-07-05 17:40:04 +08:00
if len(PackageItem) > 2:
#
2018-07-05 17:40:04 +08:00
# Invalid format of Package statement
#
2018-07-05 17:40:04 +08:00
Logger.Error("InfParser",
ToolError.FORMAT_INVALID,
ST.ERR_INF_PARSER_PACKAGE_SECTION_CONTENT_ERROR,
2018-07-05 17:40:04 +08:00
File=CurrentLineOfPackItem[2],
Line=CurrentLineOfPackItem[1],
ExtraData=CurrentLineOfPackItem[0])
PackageItemObj.SetSupArchList(SupArchList)
2018-07-05 17:40:04 +08:00
#
# Determine package file name duplicate. Follow below rule:
#
2018-07-05 17:40:04 +08:00
# A package filename must not be duplicated within a [Packages]
# section. Package filenames may appear in multiple architectural
# [Packages] sections. A package filename listed in an
# architectural [Packages] section must not be listed in the common
# architectural [Packages] section.
2018-07-05 17:40:04 +08:00
#
# NOTE: This check will not report error now.
2018-07-05 17:40:04 +08:00
#
for Item in self.Packages:
if Item.GetPackageName() == PackageItemObj.GetPackageName():
ItemSupArchList = Item.GetSupArchList()
for ItemArch in ItemSupArchList:
for PackageItemObjArch in SupArchList:
if ItemArch == PackageItemObjArch:
#
# ST.ERR_INF_PARSER_ITEM_DUPLICATE
#
pass
if ItemArch.upper() == 'COMMON' or PackageItemObjArch.upper() == 'COMMON':
#
# ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON
#
pass
2018-07-05 17:40:04 +08:00
2018-06-25 18:31:29 +08:00
if (PackageItemObj) in self.Packages:
PackageList = self.Packages[PackageItemObj]
PackageList.append(PackageItemObj)
self.Packages[PackageItemObj] = PackageList
else:
PackageList = []
PackageList.append(PackageItemObj)
self.Packages[PackageItemObj] = PackageList
2018-07-05 17:40:04 +08:00
return True
2018-07-05 17:40:04 +08:00
def GetPackages(self, Arch = None):
if Arch is None:
2018-06-25 18:31:29 +08:00
return self.Packages