]>
git.proxmox.com Git - mirror_edk2.git/blob - Tools/Python/MkFar.py
ffe27a870aa7483bf8de06c4c0605e59cbc2c8a2
3 import os
, sys
, getopt
, string
, xml
.dom
.minidom
, zipfile
, md5
4 from XmlRoutines
import *
5 from WorkspaceRoutines
import *
7 def parseMsa(msaFile
, spdDir
):
11 msaDir
= os
.path
.dirname(msaFile
)
13 msa
= xml
.dom
.minidom
.parse(inWorkspace(os
.path
.join(spdDir
, msaFile
)))
16 "/ModuleSurfaceArea/SourceFiles/Filename",
17 "/ModuleSurfaceArea/NonProcessedFiles/Filename" ]
20 for xmlPath
in xmlPaths
:
21 for f
in XmlList(msa
, xmlPath
):
22 filelist
.append(str(os
.path
.join(msaDir
, XmlElementData(f
))))
26 def parseSpd(spdFile
):
30 spdDir
= os
.path
.dirname(spdFile
)
32 spd
= xml
.dom
.minidom
.parse(inWorkspace(spdFile
))
35 "/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass/IncludeHeader",
36 "/PackageSurfaceArea/IndustryStdIncludes/IndustryStdHeader/IncludeHeader",
37 "/PackageSurfaceArea/PackageHeaders/IncludePkgHeader" ]
39 for xmlPath
in xmlPaths
:
40 for f
in XmlList(spd
, xmlPath
):
41 files
.append(str(XmlElementData(f
)))
43 for f
in XmlList(spd
, "/PackageSurfaceArea/MsaFiles/Filename"):
44 msaFile
= str(XmlElementData(f
))
45 files
+= parseMsa(msaFile
, spdDir
)
48 os
.chdir(inWorkspace(spdDir
))
49 for root
, dirs
, entries
in os
.walk("Include"):
50 for r
in ["CVS", ".svn"]:
54 files
.append(os
.path
.join(os
.path
.normpath(root
), entry
))
59 def makeFarHeader(doc
):
61 header
= doc
.createElement("FarHeader")
62 name
= doc
.createElement("FarName")
63 name
.appendChild(doc
.createTextNode("My New Far"))
64 header
.appendChild(name
)
65 guidVal
= doc
.createElement("GuidValue")
66 guidVal
.appendChild(doc
.createTextNode(genguid()))
67 header
.appendChild(guidVal
)
68 ver
= doc
.createElement("Version")
69 ver
.appendChild(doc
.createTextNode("1.0"))
70 header
.appendChild(ver
)
71 abstract
= doc
.createElement("Abstract")
72 abstract
.appendChild(doc
.createTextNode("This is a cool new far."))
73 header
.appendChild(abstract
)
74 desc
= doc
.createElement("Description")
75 desc
.appendChild(doc
.createTextNode("This is a cool new far. It can do great things."))
76 header
.appendChild(desc
)
77 copy
= doc
.createElement("Copyright")
78 copy
.appendChild(doc
.createTextNode("Copyright (c) Intel Corporation 2006."))
79 header
.appendChild(copy
)
80 lic
= doc
.createElement("License")
81 lic
.appendChild(doc
.createTextNode("BSD Compatible."))
82 header
.appendChild(lic
)
83 spec
= doc
.createElement("Specification")
84 spec
.appendChild(doc
.createTextNode("FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"))
85 header
.appendChild(spec
)
89 def getSpdGuidVersion(spdFile
):
91 spd
= xml
.dom
.minidom
.parse(inWorkspace(spdFile
))
93 return (XmlElement(spd
, "/PackageSurfaceArea/SpdHeader/GuidValue"),
94 XmlElement(spd
, "/PackageSurfaceArea/SpdHeader/Version"))
96 def makeFar(filelist
, farname
):
98 domImpl
= xml
.dom
.minidom
.getDOMImplementation()
99 man
= domImpl
.createDocument(None, "FrameworkArchiveManifest", None)
100 top_element
= man
.documentElement
102 top_element
.appendChild(makeFarHeader(man
))
104 packList
= man
.createElement("FarPackageList")
105 top_element
.appendChild(packList
)
107 platList
= man
.createElement("FarPlatformList")
108 top_element
.appendChild(platList
)
110 contents
= man
.createElement("Contents")
111 top_element
.appendChild(contents
)
113 exts
= man
.createElement("UserExtensions")
114 top_element
.appendChild(exts
)
116 zip = zipfile
.ZipFile(farname
, "w")
117 for infile
in filelist
:
118 if not os
.path
.exists(inWorkspace(infile
)):
119 print "Skipping non-existent file '%s'." % infile
120 (_
, extension
) = os
.path
.splitext(infile
)
121 if extension
== ".spd":
122 filelist
= parseSpd(infile
)
123 spdDir
= os
.path
.dirname(infile
)
125 (spdGuid
, spdVersion
) = getSpdGuidVersion(infile
)
127 package
= man
.createElement("FarPackage")
128 packList
.appendChild(package
)
130 spdfilename
= farFileNode(man
, inWorkspace(infile
))
131 zip.write(inWorkspace(infile
), infile
)
132 spdfilename
.appendChild(man
.createTextNode(infile
))
133 package
.appendChild(spdfilename
)
135 guidValue
= man
.createElement("GuidValue")
136 guidValue
.appendChild(man
.createTextNode(spdGuid
))
137 package
.appendChild(guidValue
)
139 version
= man
.createElement("Version")
140 version
.appendChild(man
.createTextNode(spdVersion
))
141 package
.appendChild(version
)
143 defaultPath
= man
.createElement("DefaultPath")
144 defaultPath
.appendChild(man
.createTextNode(spdDir
))
145 package
.appendChild(defaultPath
)
147 farPlatformList
= man
.createElement("FarPlatformList")
148 package
.appendChild(farPlatformList
)
150 packContents
= man
.createElement("Contents")
151 package
.appendChild(packContents
)
153 ue
= man
.createElement("UserExtensions")
154 package
.appendChild(ue
)
156 for spdfile
in filelist
:
157 content
= farFileNode(man
, inWorkspace(os
.path
.join(spdDir
, spdfile
)))
158 zip.write(inWorkspace(os
.path
.join(spdDir
, spdfile
)), spdfile
)
159 content
.appendChild(man
.createTextNode(spdfile
))
160 packContents
.appendChild(content
)
162 elif extension
== ".fpd":
164 platform
= man
.createElement("FarPlatform")
165 platList
.appendChild(platform
)
167 fpdfilename
= farFileNode(man
, inWorkspace(infile
))
168 zip.write(inWorkspace(infile
), infile
)
169 platform
.appendChild(fpdfilename
)
170 fpdfilename
.appendChild( man
.createTextNode(infile
) )
173 content
= farFileNode(man
, inWorkspace(infile
))
174 zip.write(inWorkspace(infile
), infile
)
175 content
.appendChild(man
.createTextNode(infile
))
176 contents
.appendChild(content
)
178 zip.writestr("FrameworkArchiveManifest.xml", man
.toprettyxml(2*" "))
182 def farFileNode(doc
, filename
):
183 content
= doc
.createElement("FarFilename")
184 f
=open(filename
, "rb")
185 content
.setAttribute("Md5sum", md5
.md5(f
.read()).hexdigest())
189 # This acts like the main() function for the script, unless it is 'import'ed
190 # into another script.
191 if __name__
== '__main__':
193 # Create a pretty printer for dumping data structures in a readable form.
194 # pp = pprint.PrettyPrinter(indent=2)
196 # Default name for far file.
197 farName
= "output.far"
199 # Process the command line args.
200 optlist
, args
= getopt
.getopt(sys
.argv
[1:], 'hf:', [ 'far=', 'help'])
203 if o
in ["-h", "--help"]:
205 Pass a list of .spd and .fpd files to be placed into a far for distribution.
206 You may give the name of the far with a -f or --far option. For example:
208 %s --far library.far MdePkg/MdePkg.spd
210 The file paths of .spd and .fpd are relative to the WORKSPACE envirnonment
211 which must be set to a valid workspace root directory.
212 """ % os
.path
.basename(sys
.argv
[0])
215 if o
in ["-f", "--far"]:
218 makeFar(args
, farName
)