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