]>
git.proxmox.com Git - mirror_edk2.git/blob - Tools/Python/MkFar.py
3 import os
, sys
, getopt
, string
, xml
.dom
.minidom
, zipfile
, md5
4 from XmlRoutines
import *
5 from WorkspaceRoutines
import *
8 """This class is used to collect arbitrarty data from the template file."""
10 """Assign the default values for the far fields."""
11 far
.FileName
= "output.far"
24 def parseMsa(msaFile
, spdDir
):
28 msaDir
= os
.path
.dirname(msaFile
)
30 msa
= xml
.dom
.minidom
.parse(inWorkspace(os
.path
.join(spdDir
, msaFile
)))
33 "/ModuleSurfaceArea/SourceFiles/Filename",
34 "/ModuleSurfaceArea/NonProcessedFiles/Filename" ]
36 for xmlPath
in xmlPaths
:
37 for f
in XmlList(msa
, xmlPath
):
38 filelist
.append(str(os
.path
.join(msaDir
, XmlElementData(f
))))
42 def parseSpd(spdFile
):
46 spdDir
= os
.path
.dirname(spdFile
)
48 spd
= xml
.dom
.minidom
.parse(inWorkspace(spdFile
))
51 "/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass/IncludeHeader",
52 "/PackageSurfaceArea/IndustryStdIncludes/IndustryStdHeader/IncludeHeader",
53 "/PackageSurfaceArea/PackageHeaders/IncludePkgHeader" ]
55 for xmlPath
in xmlPaths
:
56 for f
in XmlList(spd
, xmlPath
):
57 files
.append(str(XmlElementData(f
)))
59 for f
in XmlList(spd
, "/PackageSurfaceArea/MsaFiles/Filename"):
60 msaFile
= str(XmlElementData(f
))
61 files
+= parseMsa(msaFile
, spdDir
)
64 os
.chdir(inWorkspace(spdDir
))
65 for root
, dirs
, entries
in os
.walk("Include"):
66 # Some files need to be skipped.
67 for r
in ["CVS", ".svn"]:
71 files
.append(os
.path
.join(os
.path
.normpath(root
), entry
))
76 def makeFarHeader(doc
):
78 header
= doc
.createElement("FarHeader")
79 name
= doc
.createElement("FarName")
80 name
.appendChild(doc
.createTextNode(far
.FarName
))
81 header
.appendChild(name
)
82 guidVal
= doc
.createElement("GuidValue")
83 guidVal
.appendChild(doc
.createTextNode(genguid()))
84 header
.appendChild(guidVal
)
85 ver
= doc
.createElement("Version")
86 ver
.appendChild(doc
.createTextNode(far
.Version
))
87 header
.appendChild(ver
)
88 abstract
= doc
.createElement("Abstract")
89 abstract
.appendChild(doc
.createTextNode(far
.Abstract
))
90 header
.appendChild(abstract
)
91 desc
= doc
.createElement("Description")
92 desc
.appendChild(doc
.createTextNode(far
.Description
))
93 header
.appendChild(desc
)
94 copy
= doc
.createElement("Copyright")
95 copy
.appendChild(doc
.createTextNode(far
.Copyright
))
96 header
.appendChild(copy
)
97 lic
= doc
.createElement("License")
98 lic
.appendChild(doc
.createTextNode(far
.License
))
99 header
.appendChild(lic
)
100 spec
= doc
.createElement("Specification")
101 spec
.appendChild(doc
.createTextNode("FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"))
102 header
.appendChild(spec
)
106 def getSpdGuidVersion(spdFile
):
108 spd
= xml
.dom
.minidom
.parse(inWorkspace(spdFile
))
110 return (XmlElement(spd
, "/PackageSurfaceArea/SpdHeader/GuidValue"),
111 XmlElement(spd
, "/PackageSurfaceArea/SpdHeader/Version"))
113 def makeFar(files
, farname
):
115 domImpl
= xml
.dom
.minidom
.getDOMImplementation()
116 man
= domImpl
.createDocument(None, "FrameworkArchiveManifest", None)
117 top_element
= man
.documentElement
119 top_element
.appendChild(makeFarHeader(man
))
121 packList
= man
.createElement("FarPackageList")
122 top_element
.appendChild(packList
)
124 platList
= man
.createElement("FarPlatformList")
125 top_element
.appendChild(platList
)
127 contents
= man
.createElement("Contents")
128 top_element
.appendChild(contents
)
130 exts
= man
.createElement("UserExtensions")
131 top_element
.appendChild(exts
)
133 zip = zipfile
.ZipFile(farname
, "w")
134 for infile
in set(files
):
135 if not os
.path
.exists(inWorkspace(infile
)):
136 print "Skipping non-existent file '%s'." % infile
137 (_
, extension
) = os
.path
.splitext(infile
)
138 if extension
== ".spd":
139 filelist
= parseSpd(infile
)
140 spdDir
= os
.path
.dirname(infile
)
142 (spdGuid
, spdVersion
) = getSpdGuidVersion(infile
)
144 package
= man
.createElement("FarPackage")
145 packList
.appendChild(package
)
147 spdfilename
= farFileNode(man
, inWorkspace(infile
))
148 zip.write(inWorkspace(infile
), infile
)
149 spdfilename
.appendChild(man
.createTextNode(lean(infile
)))
150 package
.appendChild(spdfilename
)
152 guidValue
= man
.createElement("GuidValue")
153 guidValue
.appendChild(man
.createTextNode(spdGuid
))
154 package
.appendChild(guidValue
)
156 version
= man
.createElement("Version")
157 version
.appendChild(man
.createTextNode(spdVersion
))
158 package
.appendChild(version
)
160 defaultPath
= man
.createElement("DefaultPath")
161 defaultPath
.appendChild(man
.createTextNode(spdDir
))
162 package
.appendChild(defaultPath
)
164 farPlatformList
= man
.createElement("FarPlatformList")
165 package
.appendChild(farPlatformList
)
167 packContents
= man
.createElement("Contents")
168 package
.appendChild(packContents
)
170 ue
= man
.createElement("UserExtensions")
171 package
.appendChild(ue
)
173 for spdfile
in filelist
:
174 content
= farFileNode(man
, inWorkspace(os
.path
.join(spdDir
, spdfile
)))
175 zip.write(inWorkspace(os
.path
.join(spdDir
, spdfile
)), spdfile
)
176 content
.appendChild(man
.createTextNode(lean(spdfile
)))
177 packContents
.appendChild(content
)
179 elif extension
== ".fpd":
181 platform
= man
.createElement("FarPlatform")
182 platList
.appendChild(platform
)
184 fpdfilename
= farFileNode(man
, inWorkspace(infile
))
185 zip.write(inWorkspace(infile
), infile
)
186 platform
.appendChild(fpdfilename
)
187 fpdfilename
.appendChild(man
.createTextNode(lean(infile
)))
190 content
= farFileNode(man
, inWorkspace(infile
))
191 zip.write(inWorkspace(infile
), infile
)
192 content
.appendChild(man
.createTextNode(lean(infile
)))
193 contents
.appendChild(content
)
195 zip.writestr("FrameworkArchiveManifest.xml", man
.toprettyxml(2*" "))
199 def farFileNode(doc
, filename
):
200 content
= doc
.createElement("FarFilename")
201 f
=open(filename
, "rb")
202 content
.setAttribute("Md5sum", md5
.md5(f
.read()).hexdigest())
206 # This acts like the main() function for the script, unless it is 'import'ed
207 # into another script.
208 if __name__
== '__main__':
210 # Create a pretty printer for dumping data structures in a readable form.
211 # pp = pprint.PrettyPrinter(indent=2)
213 # Process the command line args.
214 optlist
, args
= getopt
.getopt(sys
.argv
[1:], 'hf:t:', [ 'template=', 'far=', 'help'])
216 # First pass through the options list.
218 if o
in ["-h", "--help"]:
220 Pass a list of .spd and .fpd files to be placed into a far for distribution.
221 You may give the name of the far with a -f or --far option. For example:
223 %s --far library.far MdePkg/MdePkg.spd
225 The file paths of .spd and .fpd are treated as relative to the WORKSPACE
226 environment variable which must be set to a valid workspace root directory.
227 """ % os
.path
.basename(sys
.argv
[0])
230 optlist
.remove((o
,a
))
231 if o
in ["-t", "--template"]:
232 # The template file is processed first, so that command line options can
235 execfile(templateName
)
236 optlist
.remove((o
,a
))
238 # Second pass through the options list. These can override the first pass.
241 if o
in ["-f", "--far"]:
244 # Let's err on the side of caution and not let people blow away data
246 if os
.path
.exists(far
.FileName
):
247 print "Error: File %s exists. Not overwriting." % far
.FileName
250 makeFar(far
.SpdFiles
+ far
.FpdFiles
+ far
.ExtraFiles
+ args
, far
.FileName
)