]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
BaseTools: support private package definition
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / WorkspaceDatabase.py
index 2e6c68e33aaef2a1961c1a02b4589f9d61c88ba8..5168e838a8bc08657833607e8dbc76ca612ac9b4 100644 (file)
@@ -545,12 +545,6 @@ class DscBuildData(PlatformBuildClassObject):
         for Record in RecordList:\r
             DuplicatedFile = False\r
 \r
-            # process only records COMMON and self.Arch\r
-            SectionArch = Record[3].upper()\r
-            if SectionArch != 'COMMON':\r
-                if SectionArch != self.Arch:\r
-                    continue\r
-\r
             ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             ModuleId = Record[5]\r
             LineNo = Record[6]\r
@@ -1334,6 +1328,10 @@ class DecBuildData(PackageBuildClassObject):
         self._LibraryClasses    = None\r
         self._Pcds              = None\r
         self.__Macros           = None\r
+        self._PrivateProtocols  = None\r
+        self._PrivatePpis       = None\r
+        self._PrivateGuids      = None\r
+        self._PrivateIncludes   = None\r
 \r
     ## Get current effective macros\r
     def _GetMacros(self):\r
@@ -1408,21 +1406,30 @@ class DecBuildData(PackageBuildClassObject):
             # protocol defition for given ARCH\r
             #\r
             ProtocolDict = tdict(True)\r
+            PrivateProtocolDict = tdict(True)\r
             NameList = []\r
+            PrivateNameList = []\r
             # find out all protocol definitions for specific and 'common' arch\r
             RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch]\r
-            for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+            for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+                if PrivateFlag == 'PRIVATE':\r
+                    if Name not in PrivateNameList:\r
+                        PrivateNameList.append(Name)\r
+                        PrivateProtocolDict[Arch, Name] = Guid\r
                 if Name not in NameList:\r
                     NameList.append(Name)\r
                 ProtocolDict[Arch, Name] = Guid\r
             # use sdict to keep the order\r
             self._Protocols = sdict()\r
+            self._PrivateProtocols = sdict()\r
             for Name in NameList:\r
                 #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
                 #\r
                 self._Protocols[Name] = ProtocolDict[self._Arch, Name]\r
+            for Name in PrivateNameList:\r
+                self._PrivateProtocols[Name] = PrivateProtocolDict[self._Arch, Name]\r
         return self._Protocols\r
 \r
     ## Retrieve PPI definitions (name/value pairs)\r
@@ -1433,21 +1440,30 @@ class DecBuildData(PackageBuildClassObject):
             # PPI defition for given ARCH\r
             #\r
             PpiDict = tdict(True)\r
+            PrivatePpiDict = tdict(True)\r
             NameList = []\r
+            PrivateNameList = []\r
             # find out all PPI definitions for specific arch and 'common' arch\r
             RecordList = self._RawData[MODEL_EFI_PPI, self._Arch]\r
-            for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+            for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+                if PrivateFlag == 'PRIVATE':\r
+                    if Name not in PrivateNameList:\r
+                        PrivateNameList.append(Name)\r
+                        PrivatePpiDict[Arch, Name] = Guid\r
                 if Name not in NameList:\r
                     NameList.append(Name)\r
                 PpiDict[Arch, Name] = Guid\r
             # use sdict to keep the order\r
             self._Ppis = sdict()\r
+            self._PrivatePpis = sdict()\r
             for Name in NameList:\r
                 #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
                 #\r
                 self._Ppis[Name] = PpiDict[self._Arch, Name]\r
+            for Name in PrivateNameList:\r
+                self._PrivatePpis[Name] = PrivatePpiDict[self._Arch, Name]\r
         return self._Ppis\r
 \r
     ## Retrieve GUID definitions (name/value pairs)\r
@@ -1458,27 +1474,37 @@ class DecBuildData(PackageBuildClassObject):
             # GUID defition for given ARCH\r
             #\r
             GuidDict = tdict(True)\r
+            PrivateGuidDict = tdict(True)\r
             NameList = []\r
+            PrivateNameList = []\r
             # find out all protocol definitions for specific and 'common' arch\r
             RecordList = self._RawData[MODEL_EFI_GUID, self._Arch]\r
-            for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+            for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+                if PrivateFlag == 'PRIVATE':\r
+                    if Name not in PrivateNameList:\r
+                        PrivateNameList.append(Name)\r
+                        PrivateGuidDict[Arch, Name] = Guid\r
                 if Name not in NameList:\r
                     NameList.append(Name)\r
                 GuidDict[Arch, Name] = Guid\r
             # use sdict to keep the order\r
             self._Guids = sdict()\r
+            self._PrivateGuids = sdict()\r
             for Name in NameList:\r
                 #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
                 #\r
                 self._Guids[Name] = GuidDict[self._Arch, Name]\r
+            for Name in PrivateNameList:\r
+                self._PrivateGuids[Name] = PrivateGuidDict[self._Arch, Name]\r
         return self._Guids\r
 \r
     ## Retrieve public include paths declared in this package\r
     def _GetInclude(self):\r
         if self._Includes == None:\r
             self._Includes = []\r
+            self._PrivateIncludes = []\r
             RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch]\r
             Macros = self._Macros\r
             Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
@@ -1493,6 +1519,9 @@ class DecBuildData(PackageBuildClassObject):
                 # avoid duplicate include path\r
                 if File not in self._Includes:\r
                     self._Includes.append(File)\r
+                if Record[4] == 'PRIVATE':\r
+                    if File not in self._PrivateIncludes:\r
+                        self._PrivateIncludes.append(File)\r
         return self._Includes\r
 \r
     ## Retrieve library class declarations (not used in build at present)\r
@@ -1506,7 +1535,7 @@ class DecBuildData(PackageBuildClassObject):
             LibraryClassSet = set()\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch]\r
             Macros = self._Macros\r
-            for LibraryClass, File, Dummy, Arch, ID, LineNo in RecordList:\r
+            for LibraryClass, File, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
                 File = PathClass(NormPath(File, Macros), self._PackageDir, Arch=self._Arch)\r
                 # check the file validation\r
                 ErrorCode, ErrorInfo = File.Validate()\r
@@ -1542,7 +1571,7 @@ class DecBuildData(PackageBuildClassObject):
         PcdSet = set()\r
         # find out all PCDs of the 'type'\r
         RecordList = self._RawData[Type, self._Arch]\r
-        for TokenSpaceGuid, PcdCName, Setting, Arch, Dummy1, Dummy2 in RecordList:\r
+        for TokenSpaceGuid, PcdCName, Setting, Arch, PrivateFlag, Dummy1, Dummy2 in RecordList:\r
             PcdDict[Arch, PcdCName, TokenSpaceGuid] = Setting\r
             PcdSet.add((PcdCName, TokenSpaceGuid))\r
 \r
@@ -2281,7 +2310,7 @@ class InfBuildData(ModuleBuildClassObject):
             RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
-                Value = ProtocolValue(CName, self.Packages)\r
+                Value = ProtocolValue(CName, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2306,7 +2335,7 @@ class InfBuildData(ModuleBuildClassObject):
             RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
-                Value = PpiValue(CName, self.Packages)\r
+                Value = PpiValue(CName, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2331,7 +2360,7 @@ class InfBuildData(ModuleBuildClassObject):
             RecordList = self._RawData[MODEL_EFI_GUID, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
-                Value = GuidValue(CName, self.Packages)\r
+                Value = GuidValue(CName, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2500,11 +2529,11 @@ class InfBuildData(ModuleBuildClassObject):
                         DepexList.append(Module.Guid)\r
                     else:\r
                         # get the GUID value now\r
-                        Value = ProtocolValue(Token, self.Packages)\r
+                        Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)\r
                         if Value == None:\r
-                            Value = PpiValue(Token, self.Packages)\r
+                            Value = PpiValue(Token, self.Packages, self.MetaFile.Path)\r
                             if Value == None:\r
-                                Value = GuidValue(Token, self.Packages)\r
+                                Value = GuidValue(Token, self.Packages, self.MetaFile.Path)\r
                         if Value == None:\r
                             PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                             EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2547,7 +2576,7 @@ class InfBuildData(ModuleBuildClassObject):
             PcdList.append((PcdCName, TokenSpaceGuid))\r
             # get the guid value\r
             if TokenSpaceGuid not in self.Guids:\r
-                Value = GuidValue(TokenSpaceGuid, self.Packages)\r
+                Value = GuidValue(TokenSpaceGuid, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2859,6 +2888,7 @@ class WorkspaceDatabase(object):
             MetaFile = self._FILE_PARSER_[FileType](\r
                                 FilePath, \r
                                 FileType, \r
+                                Arch,\r
                                 MetaFileStorage(self.WorkspaceDb.Cur, FilePath, FileType)\r
                                 )\r
             # alwasy do post-process, in case of macros change\r