]>
Commit | Line | Data |
---|---|---|
30fdf114 LG |
1 | ## @file\r |
2 | # This file is used to define a class object to describe a distribution package\r | |
3 | #\r | |
40d841f6 LG |
4 | # Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>\r |
5 | # This program and the accompanying materials\r | |
30fdf114 LG |
6 | # are licensed and made available under the terms and conditions of the BSD License\r |
7 | # which accompanies this distribution. The full text of the license may be found at\r | |
8 | # http://opensource.org/licenses/bsd-license.php\r | |
9 | #\r | |
10 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
11 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
12 | \r | |
13 | ##\r | |
14 | # Import Modules\r | |
15 | #\r | |
16 | import os.path\r | |
17 | from CommonClass import *\r | |
18 | from Common.Misc import sdict\r | |
19 | from Common.Misc import GetFiles\r | |
20 | from Common.DecClassObjectLight import Dec\r | |
21 | from Common.InfClassObjectLight import Inf\r | |
22 | from Common.XmlParser import *\r | |
23 | \r | |
24 | ## DistributionPackageHeaderClass\r | |
25 | #\r | |
26 | class DistributionPackageHeaderClass(IdentificationClass, CommonHeaderClass):\r | |
27 | def __init__(self):\r | |
28 | IdentificationClass.__init__(self)\r | |
29 | CommonHeaderClass.__init__(self)\r | |
30 | self.ReadOnly = 'False'\r | |
31 | self.RePackage = 'True'\r | |
32 | self.Vendor = ''\r | |
33 | self.Date = ''\r | |
34 | self.Signature = 'Md5Sum'\r | |
35 | self.XmlSpecification = ''\r | |
36 | \r | |
37 | ## DistributionPackageClass\r | |
38 | #\r | |
39 | #\r | |
40 | class DistributionPackageClass(object):\r | |
41 | def __init__(self):\r | |
42 | self.Header = DistributionPackageHeaderClass()\r | |
43 | self.PackageSurfaceArea = sdict() # {(Guid, Version, Path) : PackageObj}\r | |
44 | self.ModuleSurfaceArea = sdict() # {(Guid, Version, Path) : ModuleObj}\r | |
45 | self.Tools = MiscFileClass()\r | |
46 | self.MiscellaneousFiles = MiscFileClass()\r | |
47 | self.UserExtensions = []\r | |
48 | \r | |
49 | ## Get all included packages and modules for a distribution package\r | |
50 | # \r | |
51 | # @param WorkspaceDir: WorkspaceDir\r | |
52 | # @param PackageList: A list of all packages\r | |
53 | # @param ModuleList: A list of all modules\r | |
54 | #\r | |
55 | def GetDistributionPackage(self, WorkspaceDir, PackageList, ModuleList):\r | |
56 | AllGuidVersionDict = {}\r | |
57 | # Get Packages\r | |
58 | if PackageList:\r | |
59 | for PackageFile in PackageList:\r | |
60 | PackageFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, PackageFile))\r | |
61 | DecObj = Dec(PackageFileFullPath, True, WorkspaceDir)\r | |
62 | PackageObj = DecObj.Package\r | |
63 | AllGuidVersionDict[PackageFileFullPath] = [PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version]\r | |
64 | \r | |
65 | # Parser inf file one bye one\r | |
66 | for File in PackageObj.MiscFiles.Files:\r | |
67 | Filename = os.path.normpath(os.path.join(PackageObj.PackageHeader.RelaPath, File.Filename))\r | |
68 | (Name, ExtName) = os.path.splitext(Filename)\r | |
69 | if ExtName.upper() == '.INF':\r | |
70 | InfObj = Inf(Filename, True, WorkspaceDir, DecObj.Identification.PackagePath)\r | |
71 | ModuleObj = InfObj.Module\r | |
72 | AllGuidVersionDict[File] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version]\r | |
73 | # Find and update Guid/Version of LibraryClass\r | |
74 | for Item in ModuleObj.LibraryClasses:\r | |
75 | if Item.RecommendedInstance:\r | |
76 | LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance))\r | |
77 | Guid, Version = '', ''\r | |
78 | if LibClassIns in AllGuidVersionDict:\r | |
79 | Guid = AllGuidVersionDict[LibClassIns][0]\r | |
80 | Version = AllGuidVersionDict[LibClassIns][1]\r | |
81 | else:\r | |
82 | Lib = Inf(LibClassIns, True, WorkspaceDir)\r | |
83 | Guid = Lib.Module.ModuleHeader.Guid\r | |
84 | Version = Lib.Module.ModuleHeader.Version\r | |
85 | AllGuidVersionDict[LibClassIns] = [Guid, Version]\r | |
86 | Item.RecommendedInstanceGuid = Guid\r | |
87 | Item.RecommendedInstanceVersion = Version\r | |
88 | # Find and update Guid/Version of \r | |
89 | for Item in ModuleObj.PackageDependencies:\r | |
90 | if Item.FilePath:\r | |
91 | PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath))\r | |
92 | Guid, Version = '', ''\r | |
93 | if PackageFilePath in AllGuidVersionDict:\r | |
94 | Guid = AllGuidVersionDict[PackageFilePath][0]\r | |
95 | Version = AllGuidVersionDict[PackageFilePath][1]\r | |
96 | else:\r | |
97 | PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir)\r | |
98 | Guid = PackageDependencies.Package.PackageHeader.Guid\r | |
99 | Version = PackageDependencies.Package.PackageHeader.Version\r | |
100 | AllGuidVersionDict[PackageFilePath] = [Guid, Version]\r | |
101 | Item.PackageGuid = Guid\r | |
102 | Item.PackageVersion = Version\r | |
103 | \r | |
104 | # Add module to package\r | |
105 | PackageObj.Modules[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj\r | |
106 | self.PackageSurfaceArea[(PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version, PackageObj.PackageHeader.CombinePath)] = PackageObj\r | |
107 | \r | |
108 | # Get Modules\r | |
109 | if ModuleList:\r | |
110 | for ModuleFile in ModuleList:\r | |
111 | ModuleFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, ModuleFile))\r | |
112 | InfObj = Inf(ModuleFileFullPath, True, WorkspaceDir)\r | |
113 | ModuleObj = InfObj.Module\r | |
114 | AllGuidVersionDict[ModuleFileFullPath] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version]\r | |
115 | # Find and update Guid/Version of LibraryClass\r | |
116 | for Item in ModuleObj.LibraryClasses:\r | |
117 | if Item.RecommendedInstance:\r | |
118 | LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance))\r | |
119 | Guid, Version = '', ''\r | |
120 | if LibClassIns in AllGuidVersionDict:\r | |
121 | Guid = AllGuidVersionDict[LibClassIns][0]\r | |
122 | Version = AllGuidVersionDict[LibClassIns][1]\r | |
123 | else:\r | |
124 | Lib = Inf(LibClassIns, True, WorkspaceDir)\r | |
125 | Guid = Lib.Module.ModuleHeader.Guid\r | |
126 | Version = Lib.Module.ModuleHeader.Version\r | |
127 | AllGuidVersionDict[LibClassIns] = [Guid, Version]\r | |
128 | Item.RecommendedInstanceGuid = Guid\r | |
129 | Item.RecommendedInstanceVersion = Version\r | |
130 | # Find and update Guid/Version of \r | |
131 | for Item in ModuleObj.PackageDependencies:\r | |
132 | if Item.FilePath:\r | |
133 | PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath))\r | |
134 | Guid, Version = '', ''\r | |
135 | if PackageFilePath in AllGuidVersionDict:\r | |
136 | Guid = AllGuidVersionDict[PackageFilePath][0]\r | |
137 | Version = AllGuidVersionDict[PackageFilePath][1]\r | |
138 | else:\r | |
139 | PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir)\r | |
140 | Guid = PackageDependencies.Package.PackageHeader.Guid\r | |
141 | Version = PackageDependencies.Package.PackageHeader.Version\r | |
142 | AllGuidVersionDict[PackageFilePath] = [Guid, Version]\r | |
143 | Item.PackageGuid = Guid\r | |
144 | Item.PackageVersion = Version\r | |
145 | self.ModuleSurfaceArea[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj\r | |
146 | \r | |
147 | ##\r | |
148 | #\r | |
149 | # This acts like the main() function for the script, unless it is 'import'ed into another\r | |
150 | # script.\r | |
151 | #\r | |
152 | if __name__ == '__main__':\r | |
30fdf114 LG |
153 | D = DistributionPackageClass()\r |
154 | D.GetDistributionPackage(os.getenv('WORKSPACE'), ['MdePkg/MdePkg.dec', 'TianoModulePkg/TianoModulePkg.dec'], ['MdeModulePkg/Application/HelloWorld/HelloWorld.inf'])\r | |
155 | Xml = DistributionPackageXml()\r | |
156 | print Xml.ToXml(D)\r | |
157 | E = Xml.FromXml('C:\\2.xml')\r | |
158 | #print Xml.ToXml(E)\r |