PackageList = []\r
for M in [self.Module] + self.BuildInfo.DependentLibraryList:\r
for Package in M.Packages:\r
- if Package not in PackageList:\r
- PackageList.append(self.PlatformAutoGen.GetPackageObject(Package, self.Arch))\r
+ if Package in PackageList:\r
+ continue\r
+ PackageList.append(Package)\r
return PackageList\r
\r
## Parse dependency expression\r
# no command, no build\r
if RuleObject != None and RuleObject.CommandList == []:\r
RuleObject = None\r
- FileList.append([SourceFile, FileType, RuleObject])\r
+ if [SourceFile, FileType, RuleObject] not in FileList:\r
+ FileList.append([SourceFile, FileType, RuleObject])\r
\r
return FileList\r
\r
#\r
def GetDependentPackageList(self):\r
PackageList = []\r
- for PackageFile in self.Module.Packages:\r
- if PackageFile in PackageList:\r
+ for Package in self.Module.Packages:\r
+ if Package in PackageList:\r
continue\r
- Package = self.PlatformAutoGen.GetPackageObject(PackageFile, self.Arch)\r
- if Package == None:\r
- EdkLogger.error("AutoGen", FILE_NOT_FOUND, ExtraData=PackageFile)\r
PackageList.append(Package)\r
return PackageList\r
\r
def GetSortedLibraryList(self):\r
LibraryList = []\r
for Key in self.Module.LibraryClasses:\r
- Library = self.PlatformAutoGen.GetModuleObject(self.Module.LibraryClasses[Key], self.Arch)\r
+ Library = self.Module.LibraryClasses[Key]\r
if Library not in LibraryList:\r
LibraryList.append(Library)\r
return LibraryList\r
def popitem(self):\r
EdkLogger.error("RestrictedDict", ATTRIBUTE_ACCESS_DENIED, ExtraData="popitem")\r
\r
+## Dictionary using prioritized list as key\r
+#\r
+class tdict:\r
+ _ListType = type([])\r
+ _TupleType = type(())\r
+ _Wildcard = 'COMMON'\r
+ _ValidWildcardList = ['COMMON', 'DEFAULT', 'ALL', '', '*', 'PLATFORM']\r
+\r
+ def __init__(self, _Single_=False, _Level_=2):\r
+ self._Level_ = _Level_\r
+ self.data = {}\r
+ self._Single_ = _Single_\r
+ \r
+ # =[] operator\r
+ def __getitem__(self, key):\r
+ KeyType = type(key)\r
+ RestKeys = None\r
+ if KeyType == self._ListType or KeyType == self._TupleType:\r
+ FirstKey = key[0]\r
+ if len(key) > 1:\r
+ RestKeys = key[1:]\r
+ elif self._Level_ > 1:\r
+ RestKeys = [self._Wildcard for i in range(0, self._Level_-1)]\r
+ else:\r
+ FirstKey = key\r
+ if self._Level_ > 1:\r
+ RestKeys = [self._Wildcard for i in range(0, self._Level_-1)]\r
+\r
+ if FirstKey == None or str(FirstKey).upper() in self._ValidWildcardList:\r
+ FirstKey = self._Wildcard\r
+\r
+ if self._Single_:\r
+ return self._GetSingleValue(FirstKey, RestKeys)\r
+ else:\r
+ return self._GetAllValues(FirstKey, RestKeys)\r
+\r
+ def _GetSingleValue(self, FirstKey, RestKeys):\r
+ Value = None\r
+ #print "%s-%s" % (FirstKey, self._Level_) ,\r
+ if self._Level_ > 1:\r
+ if FirstKey == self._Wildcard:\r
+ for Key in self.data:\r
+ Value = self.data[Key][RestKeys]\r
+ if Value != None: break\r
+ else:\r
+ if FirstKey in self.data:\r
+ Value = self.data[FirstKey][RestKeys]\r
+ if Value == None and self._Wildcard in self.data:\r
+ #print "Value=None"\r
+ Value = self.data[self._Wildcard][RestKeys]\r
+ else:\r
+ # "$"\r
+ if FirstKey == self._Wildcard:\r
+ for Key in self.data:\r
+ Value = self.data[Key]\r
+ if Value != None: break\r
+ else:\r
+ if FirstKey in self.data:\r
+ Value = self.data[FirstKey]\r
+ elif self._Wildcard in self.data:\r
+ Value = self.data[self._Wildcard]\r
+ return Value\r
+\r
+ def _GetAllValues(self, FirstKey, RestKeys):\r
+ Value = []\r
+ if self._Level_ > 1:\r
+ if FirstKey == self._Wildcard:\r
+ for Key in self.data:\r
+ Value += self.data[Key][RestKeys]\r
+ else:\r
+ if FirstKey in self.data:\r
+ Value += self.data[FirstKey][RestKeys]\r
+ if self._Wildcard in self.data:\r
+ Value += self.data[self._Wildcard][RestKeys]\r
+ else:\r
+ if FirstKey == self._Wildcard:\r
+ for Key in self.data:\r
+ Value.append(self.data[Key])\r
+ else:\r
+ if FirstKey in self.data:\r
+ Value.append(self.data[FirstKey])\r
+ if self._Wildcard in self.data:\r
+ Value.append(self.data[self._Wildcard])\r
+ return Value\r
+\r
+ ## []= operator\r
+ def __setitem__(self, key, value):\r
+ KeyType = type(key)\r
+ RestKeys = None\r
+ if KeyType == self._ListType or KeyType == self._TupleType:\r
+ FirstKey = key[0]\r
+ if len(key) > 1:\r
+ RestKeys = key[1:]\r
+ else:\r
+ RestKeys = [self._Wildcard for i in range(0, self._Level_-1)]\r
+ else:\r
+ FirstKey = key\r
+ if self._Level_ > 1:\r
+ RestKeys = [self._Wildcard for i in range(0, self._Level_-1)]\r
+\r
+ if FirstKey in self._ValidWildcardList:\r
+ FirstKey = self._Wildcard\r
+ \r
+ if FirstKey not in self.data and self._Level_ > 0:\r
+ self.data[FirstKey] = tdict(self._Single_, self._Level_ - 1)\r
+\r
+ if self._Level_ > 1:\r
+ self.data[FirstKey][RestKeys] = value\r
+ else:\r
+ self.data[FirstKey] = value\r
+\r
+ def SetGreedyMode(self):\r
+ self._Single_ = False\r
+ if self._Level_ > 1:\r
+ for Key in self.data:\r
+ self.data[Key].SetGreedyMode()\r
+\r
+ def SetSingleMode(self):\r
+ self._Single_ = True\r
+ if self._Level_ > 1:\r
+ for Key in self.data:\r
+ self.data[Key].SetSingleMode()\r
##\r
#\r
# This acts like the main() function for the script, unless it is 'import'ed into another\r
# script.\r
#\r
if __name__ == '__main__':\r
- pass\r
+ d = tdict(True, 3)\r
+ d['COMMON', 'PEIM', "A",] = 1\r
+ d['COMMON', 'DXE_CORE', 'B'] = 2\r
+ d['IA32', 'DXE_CORE', 'C'] = 3\r
+\r
+ print d['IA32', 'DXE_CORE', 'C']\r
+\r
if len(Defines) > 0:\r
Path = ReplaceMacro(Path, Defines)\r
# Remove leading path separator\r
- if len(Path) > 0 and Path[0] in [DataType.TAB_SLASH, DataType.TAB_BACK_SLASH] == 0:\r
+ if len(Path) > 0 and Path[0] in [DataType.TAB_SLASH, DataType.TAB_BACK_SLASH]:\r
Path = Path[1:]\r
#\r
# To local path format\r
MODEL_META_DATA_USER_EXTENSION = 5010\r
MODEL_META_DATA_PACKAGE = 5011\r
MODEL_META_DATA_NMAKE = 5012\r
+MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF = 50013\r
+MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF = 5014\r
\r
MODEL_LIST = [('MODEL_UNKNOWN', MODEL_UNKNOWN),\r
('MODEL_FILE_C', MODEL_FILE_C),\r
import os\r
\r
import Common.EdkLogger as EdkLogger\r
-from Common.String import ConvertToSqlString\r
from CommonDataClass import DataClass\r
from CommonDataClass.DataClass import FileClass\r
\r
+def ConvertToSqlString(StringList):\r
+ return map(lambda s: "'" + s.replace("'", "''") + "'", StringList)\r
+\r
## TableFile\r
#\r
# This class defined a common table\r
#\r
import Common.EdkLogger as EdkLogger\r
from MetaDataTable import Table\r
-from Common.String import ConvertToSqlString\r
+from MetaDataTable import ConvertToSqlString\r
\r
class ModuleTable(Table):\r
_ID_STEP_ = 0.00000001\r
from Common.Misc import sdict\r
from Common import GlobalData\r
\r
+DATABASE_PATH = "Conf/.cache/build.db"\r
+\r
## ItemBuild\r
#\r
# This Class defines Module/Platform/Package databases for build system\r
\r
from Common.TargetTxtClassObject import *\r
from Common.ToolDefClassObject import *\r
-from Common.EdkIIWorkspaceBuild import *\r
+#from Common.EdkIIWorkspaceBuild import *\r
from Common.DataType import *\r
from AutoGen.AutoGen import *\r
from GenFds.FdfParser import *\r
from Common.BuildToolError import *\r
+from Workspace.WorkspaceBuild import *\r
\r
import Common.EdkLogger\r
import Common.GlobalData as GlobalData\r
self.Progress = Utils.Progressor()\r
\r
# parse target.txt, tools_def.txt, and platform file\r
- self.Progress.Start("Loading build configuration")\r
+ #self.Progress.Start("Loading build configuration")\r
self.RestoreBuildData()\r
self.LoadConfiguration()\r
- self.Progress.Stop("done!")\r
+ #self.Progress.Stop("done!")\r
\r
- self.Progress.Start("Parsing platform/modules/packages")\r
+ #self.Progress.Start("Parsing platform/modules/packages")\r
self.InitBuild()\r
- self.Progress.Stop("done!")\r
+ #self.Progress.Stop("done!")\r
\r
# print current build environment and configuration\r
- EdkLogger.quiet('')\r
+ #EdkLogger.quiet('')\r
EdkLogger.quiet("%-24s = %s" % ("WORKSPACE", os.environ["WORKSPACE"]))\r
EdkLogger.quiet("%-24s = %s" % ("EDK_SOURCE", os.environ["EDK_SOURCE"]))\r
EdkLogger.quiet("%-24s = %s" % ("EFI_SOURCE", os.environ["EFI_SOURCE"]))\r
EdkLogger.verbose('%-24s = %s' % ("Max Thread Number", self.ThreadNumber))\r
\r
# establish build database, INF/DEC files will be parsed in this stage\r
- self.Progress.Start("\nEstablishing build database")\r
+ self.Progress.Start("\nParsing files")\r
try:\r
if self.Fdf != None and self.Fdf != "":\r
FdfFile = os.path.join(self.WorkspaceDir, self.Fdf)\r
\r
# skip file generation for cleanxxx targets and run target\r
if Target not in ['clean', 'cleanlib', 'cleanall', 'run']: \r
- self.Progress.Start("Generating code for " + str(AutoGenResult))\r
+ self.Progress.Start("Generating code")\r
# for target which must generate AutoGen code and makefile\r
AutoGenResult.CreateCodeFile(CreateDepModuleCodeFile)\r
self.Progress.Stop("done!")\r
if Target == "genc":\r
return True\r
\r
- self.Progress.Start("Generating makefile for " + str(AutoGenResult))\r
+ self.Progress.Start("Generating makefile")\r
AutoGenResult.CreateMakeFile(CreateDepModuleMakeFile)\r
self.Progress.Stop("done!")\r
if Target == "genmake":\r
finally:\r
Utils.Progressor.Abort()\r
\r
+ if MyBuild != None:\r
+ MyBuild.Ewb.Db.Close()\r
+\r
FinishTime = time.clock()\r
BuildDuration = time.strftime("%M:%S", time.gmtime(int(round(FinishTime - StartTime))))\r
EdkLogger.quiet("\n%s [%s]" % (time.strftime("%H:%M:%S, %b.%d %Y", time.localtime()), BuildDuration))\r