X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=Tools%2FPython%2FMkFar.py;h=ffe27a870aa7483bf8de06c4c0605e59cbc2c8a2;hp=1dba1fc4aae0ad3a7f9148fafa822e28e43c0eb1;hb=10d6603f3b5bac1467d428523678bb1e862686d9;hpb=e853a9d4831ae95363ce5fdcce71cbb23aff2269 diff --git a/Tools/Python/MkFar.py b/Tools/Python/MkFar.py index 1dba1fc4aa..ffe27a870a 100755 --- a/Tools/Python/MkFar.py +++ b/Tools/Python/MkFar.py @@ -1,19 +1,21 @@ #!/usr/bin/env python -import os, sys, re, getopt, string, glob, xml.dom.minidom, pprint, zipfile, tempfile +import os, sys, getopt, string, xml.dom.minidom, zipfile, md5 from XmlRoutines import * from WorkspaceRoutines import * def parseMsa(msaFile, spdDir): - filelist = [] + filelist = [msaFile] msaDir = os.path.dirname(msaFile) - msa = xml.dom.minidom.parse(inWorkspace(msaFile)) + msa = xml.dom.minidom.parse(inWorkspace(os.path.join(spdDir, msaFile))) xmlPaths = [ - "/ModuleSurfaceArea/SourceFiles/Filename" ] + "/ModuleSurfaceArea/SourceFiles/Filename", + "/ModuleSurfaceArea/NonProcessedFiles/Filename" ] + for xmlPath in xmlPaths: for f in XmlList(msa, xmlPath): @@ -23,8 +25,7 @@ def parseMsa(msaFile, spdDir): def parseSpd(spdFile): - filelist = [spdFile] - msaFileList = [] + files = [] spdDir = os.path.dirname(spdFile) @@ -33,53 +34,185 @@ def parseSpd(spdFile): xmlPaths = [ "/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass/IncludeHeader", "/PackageSurfaceArea/IndustryStdIncludes/IndustryStdHeader/IncludeHeader", - "/PackageSurfaceArea/ - - -""" + domImpl = xml.dom.minidom.getDOMImplementation() + man = domImpl.createDocument(None, "FrameworkArchiveManifest", None) + top_element = man.documentElement + + top_element.appendChild(makeFarHeader(man)) + + packList = man.createElement("FarPackageList") + top_element.appendChild(packList) + + platList = man.createElement("FarPlatformList") + top_element.appendChild(platList) + + contents = man.createElement("Contents") + top_element.appendChild(contents) + + exts = man.createElement("UserExtensions") + top_element.appendChild(exts) + zip = zipfile.ZipFile(farname, "w") - for file in args: - if not os.path.exists(inWorkspace(file)): - print "Skipping non-existent file '%s'." % file - (_, extension) = os.path.splitext(file) + for infile in filelist: + if not os.path.exists(inWorkspace(infile)): + print "Skipping non-existent file '%s'." % infile + (_, extension) = os.path.splitext(infile) if extension == ".spd": - filelist = parseSpd(file) + filelist = parseSpd(infile) + spdDir = os.path.dirname(infile) + + (spdGuid, spdVersion) = getSpdGuidVersion(infile) + + package = man.createElement("FarPackage") + packList.appendChild(package) + + spdfilename = farFileNode(man, inWorkspace(infile)) + zip.write(inWorkspace(infile), infile) + spdfilename.appendChild(man.createTextNode(infile)) + package.appendChild(spdfilename) + + guidValue = man.createElement("GuidValue") + guidValue.appendChild(man.createTextNode(spdGuid)) + package.appendChild(guidValue) + + version = man.createElement("Version") + version.appendChild(man.createTextNode(spdVersion)) + package.appendChild(version) + + defaultPath = man.createElement("DefaultPath") + defaultPath.appendChild(man.createTextNode(spdDir)) + package.appendChild(defaultPath) + + farPlatformList = man.createElement("FarPlatformList") + package.appendChild(farPlatformList) + + packContents = man.createElement("Contents") + package.appendChild(packContents) + + ue = man.createElement("UserExtensions") + package.appendChild(ue) + + for spdfile in filelist: + content = farFileNode(man, inWorkspace(os.path.join(spdDir, spdfile))) + zip.write(inWorkspace(os.path.join(spdDir, spdfile)), spdfile) + content.appendChild(man.createTextNode(spdfile)) + packContents.appendChild(content) + elif extension == ".fpd": - filelist = [file] + + platform = man.createElement("FarPlatform") + platList.appendChild(platform) + + fpdfilename = farFileNode(man, inWorkspace(infile)) + zip.write(inWorkspace(infile), infile) + platform.appendChild(fpdfilename) + fpdfilename.appendChild( man.createTextNode(infile) ) + else: - filelist = [] - for f in set(filelist): - zip.write(inWorkspace(f), f) - zip.writestr("FrameworkArchiveManifest.xml", man) + content = farFileNode(man, inWorkspace(infile)) + zip.write(inWorkspace(infile), infile) + content.appendChild(man.createTextNode(infile)) + contents.appendChild(content) + + zip.writestr("FrameworkArchiveManifest.xml", man.toprettyxml(2*" ")) zip.close() return -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. +def farFileNode(doc, filename): + content = doc.createElement("FarFilename") + f=open(filename, "rb") + content.setAttribute("Md5sum", md5.md5(f.read()).hexdigest()) + f.close() + return content + +# This acts like the main() function for the script, unless it is 'import'ed +# into another script. if __name__ == '__main__': # Create a pretty printer for dumping data structures in a readable form. # pp = pprint.PrettyPrinter(indent=2) + # Default name for far file. + farName = "output.far" + # Process the command line args. - optlist, args = getopt.getopt(sys.argv[1:], 'h', [ 'example-long-arg=', 'testing']) + optlist, args = getopt.getopt(sys.argv[1:], 'hf:', [ 'far=', 'help']) + + for o, a in optlist: + if o in ["-h", "--help"]: + print """ +Pass a list of .spd and .fpd files to be placed into a far for distribution. +You may give the name of the far with a -f or --far option. For example: + + %s --far library.far MdePkg/MdePkg.spd + +The file paths of .spd and .fpd are relative to the WORKSPACE envirnonment +which must be set to a valid workspace root directory. +""" % os.path.basename(sys.argv[0]) + + sys.exit() + if o in ["-f", "--far"]: + farName = a - makeFar(args, "test.far") + makeFar(args, farName)