## @file\r
# This file is used to define each component of DSC file\r
#\r
-# Copyright (c) 2007 ~ 2008, Intel Corporation\r
-# All rights reserved. This program and the accompanying materials\r
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
# http://opensource.org/licenses/bsd-license.php\r
##\r
# Import Modules\r
#\r
-import os\r
+import Common.LongFilePathOs as os\r
import EdkLogger as EdkLogger\r
import Database\r
from String import *\r
from Misc import sdict\r
import GlobalData\r
from Table.TableDsc import TableDsc\r
+from Common.LongFilePathSupport import OpenLongFilePath as open\r
\r
#\r
# Global variable\r
class Dsc(DscObject):\r
_NullClassIndex = 0\r
\r
- def __init__(self, Filename = None, IsToDatabase = False, IsToPlatform = False, WorkspaceDir = None, Database = None):\r
+ def __init__(self, Filename=None, IsToDatabase=False, IsToPlatform=False, WorkspaceDir=None, Database=None):\r
self.Identification = Identification()\r
self.Platform = PlatformClass()\r
self.UserExtensions = ''\r
self.WorkspaceDir = WorkspaceDir\r
self.IsToDatabase = IsToDatabase\r
-\r
- self.Cur = Database.Cur\r
- self.TblFile = Database.TblFile\r
- self.TblDsc = Database.TblDsc\r
-\r
+ if Database:\r
+ self.Cur = Database.Cur\r
+ self.TblFile = Database.TblFile\r
+ self.TblDsc = Database.TblDsc\r
\r
self.KeyList = [\r
TAB_SKUIDS, TAB_LIBRARIES, TAB_LIBRARY_CLASSES, TAB_BUILD_OPTIONS, TAB_PCDS_FIXED_AT_BUILD_NULL, \\r
Fdf = PlatformFlashDefinitionFileClass()\r
Fdf.FilePath = NormPath(QueryDefinesItem(self.TblDsc, TAB_DSC_DEFINES_FLASH_DEFINITION, Arch, self.FileID)[0])\r
self.Platform.FlashDefinitionFile = Fdf\r
+ Prebuild = BuildScriptClass()\r
+ Prebuild.FilePath = NormPath(QueryDefinesItem(self.TblDsc, TAB_DSC_PREBUILD, Arch, self.FileID)[0])\r
+ self.Platform.Prebuild = Prebuild\r
+ Postbuild = BuildScriptClass()\r
+ Postbuild.FilePath = NormPath(QueryDefinesItem(self.TblDsc, TAB_DSC_POSTBUILD, Arch, self.FileID)[0])\r
+ self.Platform.Postbuild = Postbuild\r
\r
## GenBuildOptions\r
#\r
for IncludeFile in IncludeFiles:\r
if IncludeFile[1] == Arch or IncludeFile[1] == TAB_ARCH_COMMON.upper():\r
Filename = CheckFileExist(self.WorkspaceDir, IncludeFile[0], ContainerFile, TAB_LIBRARIES, '', IncludeFile[2])\r
- for NewItem in open(Filename, 'r').readlines():\r
- if CleanString(NewItem) == '':\r
- continue\r
- MergeArches(Libraries, NewItem, Arch)\r
+ if os.path.exists(Filename):\r
+ for NewItem in open(Filename, 'r').readlines():\r
+ if CleanString(NewItem) == '':\r
+ continue\r
+ MergeArches(Libraries, NewItem, Arch)\r
\r
for Record in RecordSet:\r
if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON.upper():\r
# @param Type: The type of Pcd\r
# @param ContainerFile: The file which describes the pcd, used for error report\r
#\r
- def GenPcds(self, Type = '', ContainerFile = ''):\r
+ def GenPcds(self, Type='', ContainerFile=''):\r
Pcds = {}\r
if Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE:\r
Model = MODEL_PCD_PATCHABLE_IN_MODULE\r
# @param Type: The type of Pcd\r
# @param ContainerFile: The file which describes the pcd, used for error report\r
#\r
- def GenFeatureFlagPcds(self, Type = '', ContainerFile = ''):\r
+ def GenFeatureFlagPcds(self, Type='', ContainerFile=''):\r
Pcds = {}\r
if Type == DataType.TAB_PCDS_FEATURE_FLAG:\r
Model = MODEL_PCD_FEATURE_FLAG\r
# @param Type: The type of Pcd\r
# @param ContainerFile: The file which describes the pcd, used for error report\r
#\r
- def GenDynamicDefaultPcds(self, Type = '', ContainerFile = ''):\r
+ def GenDynamicDefaultPcds(self, Type='', ContainerFile=''):\r
Pcds = {}\r
SkuInfoList = {}\r
if Type == DataType.TAB_PCDS_DYNAMIC_DEFAULT:\r
if CleanString(NewItem) == '':\r
continue\r
(K1, K2, K3, K4, K5, K6) = GetDynamicDefaultPcd(NewItem, Type, Filename, -1)\r
- MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, IncludeFile[4]), Arch)\r
+ MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, IncludeFile[4]), Arch)\r
self.PcdToken[Record[3]] = (K2, K1)\r
\r
for Record in RecordSet:\r
if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON.upper():\r
(K1, K2, K3, K4, K5, K6) = GetDynamicDefaultPcd(Record[0], Type, ContainerFile, Record[2])\r
- MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, Record[4]), Arch)\r
+ MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, Record[4]), Arch)\r
self.PcdToken[Record[3]] = (K2, K1)\r
\r
for Key in Pcds:\r
(Status, SkuInfoList) = self.GenSkuInfoList(Key[6], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', '', Key[2])\r
if Status == False:\r
ErrorMsg = "The SKUID '%s' used in section '%s' is not defined in section [SkuIds]" % (SkuInfoList, Type)\r
- EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError = EdkLogger.IsRaiseError)\r
+ EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError=EdkLogger.IsRaiseError)\r
Pcd = PcdClass(Key[0], '', Key[1], Key[3], Key[4], Key[2], Key[5], [], SkuInfoList, [])\r
Pcd.SupArchList = Pcds[Key]\r
self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
# @param Type: The type of Pcd\r
# @param ContainerFile: The file which describes the pcd, used for error report\r
#\r
- def GenDynamicHiiPcds(self, Type = '', ContainerFile = ''):\r
+ def GenDynamicHiiPcds(self, Type='', ContainerFile=''):\r
Pcds = {}\r
SkuInfoList = {}\r
if Type == DataType.TAB_PCDS_DYNAMIC_HII:\r
if CleanString(NewItem) == '':\r
continue\r
(K1, K2, K3, K4, K5, K6, K7, K8) = GetDynamicHiiPcd(NewItem, Type, Filename, -1)\r
- MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, K7, K8, IncludeFile[4]), Arch)\r
+ MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, K7, K8, IncludeFile[4]), Arch)\r
self.PcdToken[Record[3]] = (K2, K1)\r
\r
for Record in RecordSet:\r
if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON.upper():\r
(K1, K2, K3, K4, K5, K6, K7, K8) = GetDynamicHiiPcd(Record[0], Type, ContainerFile, Record[2])\r
- MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, K7, K8, Record[4]), Arch)\r
+ MergeArches(Pcds, (K1, K2, K3, K4, K5, K6, K7, K8, Record[4]), Arch)\r
self.PcdToken[Record[3]] = (K2, K1)\r
\r
for Key in Pcds:\r
(Status, SkuInfoList) = self.GenSkuInfoList(Key[8], self.Platform.SkuInfos.SkuInfoList, Key[2], Key[3], Key[4], Key[5], '', '')\r
if Status == False:\r
ErrorMsg = "The SKUID '%s' used in section '%s' is not defined in section [SkuIds]" % (SkuInfoList, Type)\r
- EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError = EdkLogger.IsRaiseError)\r
+ EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError=EdkLogger.IsRaiseError)\r
Pcd = PcdClass(Key[0], '', Key[1], '', Key[6], Key[5], Key[7], [], SkuInfoList, [])\r
Pcd.SupArchList = Pcds[Key]\r
self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
# @param Type: The type of Pcd\r
# @param ContainerFile: The file which describes the pcd, used for error report\r
#\r
- def GenDynamicVpdPcds(self, Type = '', ContainerFile = ''):\r
+ def GenDynamicVpdPcds(self, Type='', ContainerFile=''):\r
Pcds = {}\r
SkuInfoList = {}\r
if Type == DataType.TAB_PCDS_DYNAMIC_VPD:\r
if CleanString(NewItem) == '':\r
continue\r
(K1, K2, K3, K4, K5) = GetDynamicVpdPcd(NewItem, Type, Filename, -1)\r
- MergeArches(Pcds, (K1, K2, K3, K4, K5, IncludeFile[4]), Arch)\r
+ MergeArches(Pcds, (K1, K2, K3, K4, K5, IncludeFile[4]), Arch)\r
self.PcdToken[Record[3]] = (K2, K1)\r
\r
for Record in RecordSet:\r
if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON.upper():\r
(K1, K2, K3, K4, K5) = GetDynamicVpdPcd(Record[0], Type, ContainerFile, Record[2])\r
- MergeArches(Pcds, (K1, K2, K3, K4, K5, Record[4]), Arch)\r
+ MergeArches(Pcds, (K1, K2, K3, K4, K5, Record[4]), Arch)\r
self.PcdToken[Record[3]] = (K2, K1)\r
\r
for Key in Pcds:\r
(Status, SkuInfoList) = self.GenSkuInfoList(Key[5], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', Key[2], '')\r
if Status == False:\r
ErrorMsg = "The SKUID '%s' used in section '%s' is not defined in section [SkuIds]" % (SkuInfoList, Type)\r
- EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError = EdkLogger.IsRaiseError)\r
+ EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError=EdkLogger.IsRaiseError)\r
Pcd = PcdClass(Key[0], '', Key[1], '', Key[3], '', Key[4], [], SkuInfoList, [])\r
Pcd.SupArchList = Pcds[Key]\r
self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
\r
SubLibSet = QueryDscItem(self.TblDsc, MODEL_EFI_LIBRARY_CLASS, Record[3], self.FileID)\r
for SubLib in SubLibSet:\r
- Lib.append(TAB_VALUE_SPLIT.join([SubLib[0],SubLib[4]]))\r
+ Lib.append(TAB_VALUE_SPLIT.join([SubLib[0], SubLib[4]]))\r
\r
SubBoSet = QueryDscItem(self.TblDsc, MODEL_META_DATA_BUILD_OPTION, Record[3], self.FileID)\r
for SubBo in SubBoSet:\r
#\r
# @retval PlatformModuleClass() A instance for PlatformModuleClass\r
#\r
- def GenComponent(self, Item, ContainerFile, LineNo = -1):\r
+ def GenComponent(self, Item, ContainerFile, LineNo= -1):\r
(InfFilename, ExecFilename) = GetExec(Item[0])\r
LibraryClasses = Item[1]\r
BuildOptions = Item[2]\r
# @retval (False, SkuName) Not found in section SkuId Dsc file\r
# @retval (True, SkuInfoList) Found in section SkuId of Dsc file\r
#\r
- def GenSkuInfoList(self, SkuNameList, SkuInfo, VariableName = '', VariableGuid = '', VariableOffset = '', HiiDefaultValue = '', VpdOffset = '', DefaultValue = ''):\r
+ def GenSkuInfoList(self, SkuNameList, SkuInfo, VariableName='', VariableGuid='', VariableOffset='', HiiDefaultValue='', VpdOffset='', DefaultValue=''):\r
SkuNameList = GetSplitValueList(SkuNameList)\r
if SkuNameList == None or SkuNameList == [] or SkuNameList == ['']:\r
SkuNameList = ['DEFAULT']\r
(Value1, Value2, Value3, Model, StartColumn, EndColumn, Enabled) = ('', '', '', -1, -1, -1, 0)\r
if IfDefList == []:\r
ErrorMsg = 'Not suited conditional statement in file %s' % Filename\r
- EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, Filename, RaiseError = EdkLogger.IsRaiseError)\r
+ EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, Filename, RaiseError=EdkLogger.IsRaiseError)\r
else:\r
#\r
# Get New Dsc item ID\r
#\r
elif PreviousIf[2] in (MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, Model):\r
List = PreviousIf[0].split(' ')\r
- Value1 = List[0]\r
- Value2 = List[1]\r
- Value3 = List[2]\r
- Value3 = SplitString(Value3)\r
+ Value1, Value2, Value3 = '', '==', '0'\r
+ if len(List) == 3:\r
+ Value1 = List[0]\r
+ Value2 = List[1]\r
+ Value3 = List[2]\r
+ Value3 = SplitString(Value3)\r
+ if len(List) == 1:\r
+ Value1 = List[0]\r
Model = PreviousIf[2]\r
self.TblDsc.Insert(Model, Value1, Value2, Value3, ArchList, BelongsToItem, self.FileID, PreviousIf[1], StartColumn, EndLine, EndColumn, Enabled)\r
#\r
#\r
# Remove comment block\r
#\r
- if Line.find(TAB_COMMENT_R8_START) > -1:\r
- ReservedLine = GetSplitValueList(Line, TAB_COMMENT_R8_START, 1)[0]\r
+ if Line.find(TAB_COMMENT_EDK_START) > -1:\r
+ ReservedLine = GetSplitList(Line, TAB_COMMENT_EDK_START, 1)[0]\r
IsFindBlockComment = True\r
- if Line.find(TAB_COMMENT_R8_END) > -1:\r
- Line = ReservedLine + GetSplitValueList(Line, TAB_COMMENT_R8_END, 1)[1]\r
+ if Line.find(TAB_COMMENT_EDK_END) > -1:\r
+ Line = ReservedLine + GetSplitList(Line, TAB_COMMENT_EDK_END, 1)[1]\r
ReservedLine = ''\r
IsFindBlockComment = False\r
if IsFindBlockComment:\r
CurrentSection = ItemList[0]\r
else:\r
if CurrentSection != ItemList[0]:\r
- EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
+ EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)\r
if CurrentSection.upper() not in self.KeyList:\r
RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
CurrentSection = TAB_UNKNOWN\r
RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
else:\r
if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
- EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
+ EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)\r
ArchList.append(ItemList[1].upper())\r
ThirdList.append(ItemList[2])\r
\r
#\r
if CurrentSection == TAB_UNKNOWN:\r
ErrorMsg = "%s is not in any defined section" % Line\r
- EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
+ EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)\r
\r
#\r
# Add a section item\r
MODEL_META_DATA_DEFINE)\r
RecordSet = self.TblDsc.Exec(SqlCommand)\r
for Record in RecordSet:\r
- SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" %(self.TblDsc.Table, Record[0], Record[1])\r
+ SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" % (self.TblDsc.Table, Record[0], Record[1])\r
self.TblDsc.Exec(SqlCommand)\r
\r
#\r
MODEL_META_DATA_DEFINE)\r
RecordSet = self.TblDsc.Exec(SqlCommand)\r
for Record in RecordSet:\r
- SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" %(self.TblDsc.Table, Record[0], Record[1])\r
- EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
+ SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" % (self.TblDsc.Table, Record[0], Record[1])\r
+ EdkLogger.debug(4, "SqlCommand: %s" % SqlCommand)\r
self.Cur.execute(SqlCommand)\r
\r
#\r
for Record in RecordSet:\r
if Record[0] == MODEL_META_DATA_CONDITIONAL_STATEMENT_IF:\r
if not self.Compare(Record[6], Record[2], Record[3]):\r
- SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" %(self.TblDsc.Table, Record[4], Record[5])\r
+ SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" % (self.TblDsc.Table, Record[4], Record[5])\r
self.TblDsc.Exec(SqlCommand)\r
else:\r
DisabledList.append(Record[1])\r
continue\r
if Record[0] == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE and Record[1] in DisabledList:\r
- SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" %(self.TblDsc.Table, Record[4], Record[5])\r
+ SqlCommand = """Update %s set Enabled = -1 where StartLine >= %s and EndLine <= %s""" % (self.TblDsc.Table, Record[4], Record[5])\r
self.TblDsc.Exec(SqlCommand)\r
\r
## Compare\r
# @param Value2:\r
#\r
def Compare(self, Value1, CompareType, Value2):\r
- Command = """Value1 %s Value2""" %CompareType\r
+ Command = """Value1 %s Value2""" % CompareType\r
return eval(Command)\r
\r
## First time to insert records to database\r
LineValue, StartLine, EndLine = SectionItem[0], SectionItem[1], SectionItem[1]\r
\r
\r
- EdkLogger.debug(4, "Parsing %s ..." %LineValue)\r
+ EdkLogger.debug(4, "Parsing %s ..." % LineValue)\r
#\r
# Parse '!ifdef'\r
#\r
Components = []\r
GetComponent(SectionItemList, Components)\r
for Component in Components:\r
- EdkLogger.debug(4, "Parsing component %s ..." %Component)\r
+ EdkLogger.debug(4, "Parsing component %s ..." % Component)\r
DscItmeID = self.TblDsc.Insert(MODEL_META_DATA_COMPONENT, Component[0], '', '', Arch, -1, FileID, StartLine, -1, StartLine, -1, 0)\r
for Item in Component[1]:\r
- List = GetSplitValueList(Item, MaxSplit = 2)\r
+ List = GetSplitValueList(Item, MaxSplit=2)\r
LibName, LibIns = '', ''\r
if len(List) == 2:\r
LibName = List[0]\r