Add a far maker
authorbbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 16 Dec 2006 06:39:33 +0000 (06:39 +0000)
committerbbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 16 Dec 2006 06:39:33 +0000 (06:39 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2103 6f19259b-4bc3-4df7-8a09-765794883524

Tools/Python/MkFar.py [new file with mode: 0755]
Tools/Python/WorkspaceRoutines.py [new file with mode: 0755]
Tools/Python/XmlRoutines.py

diff --git a/Tools/Python/MkFar.py b/Tools/Python/MkFar.py
new file mode 100755 (executable)
index 0000000..1dba1fc
--- /dev/null
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+import os, sys, re, getopt, string, glob, xml.dom.minidom, pprint, zipfile, tempfile
+from XmlRoutines import *
+from WorkspaceRoutines import *
+
+def parseMsa(msaFile, spdDir):
+
+  filelist = []
+
+  msaDir = os.path.dirname(msaFile)
+
+  msa = xml.dom.minidom.parse(inWorkspace(msaFile))
+
+  xmlPaths = [
+    "/ModuleSurfaceArea/SourceFiles/Filename" ]
+
+  for xmlPath in xmlPaths:
+    for f in XmlList(msa, xmlPath):
+      filelist.append(str(os.path.join(msaDir, XmlElementData(f))))
+
+  return filelist
+
+def parseSpd(spdFile):
+
+  filelist = [spdFile]
+  msaFileList = []
+
+  spdDir = os.path.dirname(spdFile)
+
+  spd = xml.dom.minidom.parse(inWorkspace(spdFile))
+
+  xmlPaths = [
+    "/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass/IncludeHeader",
+    "/PackageSurfaceArea/IndustryStdIncludes/IndustryStdHeader/IncludeHeader",
+    "/PackageSurfaceArea/<PackageHeaders/IncludePkgHeader" ]
+
+  for xmlPath in xmlPaths:
+    for f in XmlList(spd, xmlPath):
+      filelist.append(str(os.path.join(spdDir, XmlElementData(f))))
+
+  for xmlPath in ["/PackageSurfaceArea/MsaFiles/Filename"]:
+    for f in XmlList(spd, xmlPath):
+      msaFile = str(os.path.join(spdDir, XmlElementData(f)))
+      filelist.append(msaFile)
+
+      filelist += parseMsa(msaFile, spdDir)
+
+  return filelist
+
+def makeFar(filelist, farname):
+
+  man = \
+"""<?xml version="1.0" encoding="UTF-8"?>
+<FrameworkArchiveManifest>
+</FrameworkArchiveManifest>
+"""
+  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)
+    if extension == ".spd":
+      filelist = parseSpd(file)
+    elif extension == ".fpd":
+      filelist = [file]
+    else:
+      filelist = []
+    for f in set(filelist):
+      zip.write(inWorkspace(f), f)
+  zip.writestr("FrameworkArchiveManifest.xml", man)
+  zip.close()
+  return
+
+# 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)
+
+  # Process the command line args.
+  optlist, args = getopt.getopt(sys.argv[1:], 'h', [ 'example-long-arg=', 'testing'])
+
+  makeFar(args, "test.far")
diff --git a/Tools/Python/WorkspaceRoutines.py b/Tools/Python/WorkspaceRoutines.py
new file mode 100755 (executable)
index 0000000..c919065
--- /dev/null
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+import os, sys, re, getopt, string, glob, xml.dom.minidom, pprint, md5, socket, getpass, time, random
+
+def inWorkspace(rel_path=""):
+  """Treat the given path as relative to the workspace."""
+
+  # Make sure the user has set the workspace variable:
+  try:
+    return os.path.join(os.environ["WORKSPACE"], rel_path )
+  except:
+    print "Oops! You must set the WORKSPACE environment variable to run this script."
+    sys.exit()
+
+def genguid():
+  g = md5.md5(
+        str(random.random()) +
+        getpass.getuser() + 
+        str(time.time()) + 
+        socket.gethostbyname(socket.gethostname())).hexdigest()
+  return "%s-%s-%s-%s-%s" % (g[0:8], g[8:12], g[12:16], g[16:20], g[20:])
index 20671ea..6968f14 100755 (executable)
@@ -42,6 +42,11 @@ def XmlAttribute (Dom, String):
   except:
     return ''
 
+def XmlTopTag(Dom):
+  """Return the name of the Root or top tag in the XML tree."""
+  return Dom.firstChild.nodeName
+  
+
 # This acts like the main() function for the script, unless it is 'import'ed into another
 # script.
 if __name__ == '__main__':