Made some changes for database based build implementation
authorjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 1 Apr 2008 15:58:47 +0000 (15:58 +0000)
committerjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 1 Apr 2008 15:58:47 +0000 (15:58 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1100 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/AutoGen/AutoGen.py
Source/Python/Common/Misc.py
Source/Python/Common/String.py
Source/Python/CommonDataClass/DataClass.py
Source/Python/Workspace/MetaDataTable.py
Source/Python/Workspace/MetaFileTable.py
Source/Python/Workspace/WorkspaceBuild.py
Source/Python/build/build.py

index ef3678d..ec9a36b 100755 (executable)
@@ -824,8 +824,9 @@ class ModuleAutoGen(object):
         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
@@ -972,7 +973,8 @@ class ModuleAutoGen(object):
             # 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
@@ -999,12 +1001,9 @@ class ModuleAutoGen(object):
     #\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
@@ -1029,7 +1028,7 @@ class ModuleAutoGen(object):
     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
index 1c527f3..0d9493f 100755 (executable)
@@ -521,10 +521,138 @@ class rdict(dict):
     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
index db00811..4285eae 100644 (file)
@@ -228,7 +228,7 @@ def NormPath(Path, Defines = {}):
         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
index 8e56ff4..8d9b3b8 100644 (file)
@@ -86,6 +86,8 @@ MODEL_META_DATA_COMPONENT = 5009
 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
index 507e6ae..fae94e7 100644 (file)
 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
index 2ef280d..1c1e790 100644 (file)
@@ -16,7 +16,7 @@
 #\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
index ab8c2f1..cf3e673 100644 (file)
@@ -28,6 +28,8 @@ from Common.BuildToolError import *
 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
index b826ebb..7d3598f 100644 (file)
@@ -28,11 +28,12 @@ from Common import Misc as Utils
 \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
@@ -653,17 +654,17 @@ class Build():
         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
@@ -687,7 +688,7 @@ class Build():
             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
@@ -889,14 +890,14 @@ class Build():
 \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
@@ -1242,6 +1243,9 @@ def Main():
     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