## @file | |
# This file is used to define class objects of INF file [Sources] section. | |
# It will consumed by InfParser. | |
# | |
# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> | |
# | |
# This program and the accompanying materials are licensed and made available | |
# under the terms and conditions of the BSD License which accompanies this | |
# distribution. The full text of the license may be found at | |
# http://opensource.org/licenses/bsd-license.php | |
# | |
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
''' | |
InfSourcesObject | |
''' | |
import os | |
from Logger import StringTable as ST | |
from Logger import ToolError | |
import Logger.Log as Logger | |
from Library import GlobalData | |
from Library.Misc import Sdict | |
from Library.ExpressionValidate import IsValidFeatureFlagExp | |
from Object.Parser.InfCommonObject import InfSectionCommonDef | |
from Library.Misc import ValidFile | |
from Library.ParserValidate import IsValidFamily | |
from Library.ParserValidate import IsValidPath | |
## __GenSourceInstance | |
# | |
# | |
def GenSourceInstance(Item, CurrentLineOfItem, ItemObj): | |
IsValidFileFlag = False | |
if len(Item) < 6 and len(Item) >= 1: | |
# | |
# File | Family | TagName | ToolCode | FeatureFlagExpr | |
# | |
if len(Item) == 5: | |
# | |
# Validate Feature Flag Express | |
# | |
if Item[4].strip() == '': | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING, | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
# | |
# Validate FFE | |
# | |
FeatureFlagRtv = IsValidFeatureFlagExp(Item[4].strip()) | |
if not FeatureFlagRtv[0]: | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]), | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
ItemObj.SetFeatureFlagExp(Item[4]) | |
if len(Item) >= 4: | |
if Item[3].strip() == '': | |
ItemObj.SetToolCode(Item[3]) | |
else: | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_INF_PARSER_TOOLCODE_NOT_PERMITTED%(Item[2]), | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
if len(Item) >= 3: | |
if Item[2].strip() == '': | |
ItemObj.SetTagName(Item[2]) | |
else: | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_INF_PARSER_TAGNAME_NOT_PERMITTED%(Item[2]), | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
if len(Item) >= 2: | |
if IsValidFamily(Item[1].strip()): | |
# | |
# To align with UDP specification. "*" is not permitted in UDP specification | |
# | |
if Item[1].strip() == "*": | |
Item[1] = "" | |
ItemObj.SetFamily(Item[1]) | |
else: | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_INF_PARSER_SOURCE_SECTION_FAMILY_INVALID%(Item[1]), | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
if len(Item) >= 1: | |
# | |
# Validate file name exist. | |
# | |
FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gINF_MODULE_DIR, Item[0]))) | |
if not (ValidFile(FullFileName) or ValidFile(Item[0])): | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_FILELIST_EXIST%(Item[0]), | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
# | |
# Validate file exist/format. | |
# | |
if IsValidPath(Item[0], GlobalData.gINF_MODULE_DIR): | |
IsValidFileFlag = True | |
else: | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Item[0]), | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
return False | |
if IsValidFileFlag: | |
ItemObj.SetSourceFileName(Item[0]) | |
else: | |
Logger.Error("InfParser", | |
ToolError.FORMAT_INVALID, | |
ST.ERR_INF_PARSER_SOURCES_SECTION_CONTENT_ERROR, | |
File=CurrentLineOfItem[2], | |
Line=CurrentLineOfItem[1], | |
ExtraData=CurrentLineOfItem[0]) | |
return ItemObj | |
## InfSourcesItemObject() | |
# | |
# | |
class InfSourcesItemObject(): | |
def __init__(self, \ | |
SourceFileName = '', \ | |
Family = '', \ | |
TagName = '', \ | |
ToolCode = '', \ | |
FeatureFlagExp = ''): | |
self.SourceFileName = SourceFileName | |
self.Family = Family | |
self.TagName = TagName | |
self.ToolCode = ToolCode | |
self.FeatureFlagExp = FeatureFlagExp | |
self.HeaderString = '' | |
self.TailString = '' | |
self.SupArchList = [] | |
def SetSourceFileName(self, SourceFilename): | |
self.SourceFileName = SourceFilename | |
def GetSourceFileName(self): | |
return self.SourceFileName | |
def SetFamily(self, Family): | |
self.Family = Family | |
def GetFamily(self): | |
return self.Family | |
def SetTagName(self, TagName): | |
self.TagName = TagName | |
def GetTagName(self): | |
return self.TagName | |
def SetToolCode(self, ToolCode): | |
self.ToolCode = ToolCode | |
def GetToolCode(self): | |
return self.ToolCode | |
def SetFeatureFlagExp(self, FeatureFlagExp): | |
self.FeatureFlagExp = FeatureFlagExp | |
def GetFeatureFlagExp(self): | |
return self.FeatureFlagExp | |
def SetHeaderString(self, HeaderString): | |
self.HeaderString = HeaderString | |
def GetHeaderString(self): | |
return self.HeaderString | |
def SetTailString(self, TailString): | |
self.TailString = TailString | |
def GetTailString(self): | |
return self.TailString | |
def SetSupArchList(self, SupArchList): | |
self.SupArchList = SupArchList | |
def GetSupArchList(self): | |
return self.SupArchList | |
## | |
# | |
# | |
# | |
class InfSourcesObject(InfSectionCommonDef): | |
def __init__(self): | |
self.Sources = Sdict() | |
InfSectionCommonDef.__init__(self) | |
def SetSources(self, SourceList, Arch = None): | |
__SupArchList = [] | |
for ArchItem in Arch: | |
# | |
# Validate Arch | |
# | |
if (ArchItem == '' or ArchItem == None): | |
ArchItem = 'COMMON' | |
__SupArchList.append(ArchItem) | |
for Item in SourceList: | |
ItemObj = InfSourcesItemObject() | |
CurrentLineOfItem = Item[2] | |
Item = Item[0] | |
ItemObj = GenSourceInstance(Item, CurrentLineOfItem, ItemObj) | |
ItemObj.SetSupArchList(__SupArchList) | |
if self.Sources.has_key((ItemObj)): | |
SourceContent = self.Sources[ItemObj] | |
SourceContent.append(ItemObj) | |
self.Sources[ItemObj] = SourceContent | |
else: | |
SourceContent = [] | |
SourceContent.append(ItemObj) | |
self.Sources[ItemObj] = SourceContent | |
return True | |
def GetSources(self): | |
return self.Sources | |