]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Python/GenMake.py
Add a python script that can generate gnu makefiles for the mde package.
[mirror_edk2.git] / Tools / Python / GenMake.py
diff --git a/Tools/Python/GenMake.py b/Tools/Python/GenMake.py
new file mode 100755 (executable)
index 0000000..56401fb
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+
+"""Create Makefiles for the MdePkg."""
+
+import os, sys, getopt, string, xml.dom.minidom, shutil
+from XmlRoutines import *
+from WorkspaceRoutines import *
+
+ARCH = "X64"
+
+Makefile = """MAKEROOT ?= ..
+
+LIBNAME = %s
+
+OBJECTS = %s 
+
+include $(MAKEROOT)/lib.makefile
+"""
+
+def openMdeSpd():
+
+  """Open the MdePkg.spd and process the msa files."""
+
+  db = xml.dom.minidom.parse(inWorkspace("MdePkg/MdePkg.spd"))
+
+  for msaFile in XmlList(db, "/PackageSurfaceArea/MsaFiles/Filename"):
+    msaFileName = XmlElementData(msaFile)
+    DoLib(msaFileName)
+
+  return db
+
+def inMde(f):
+  """Make a path relative to the Mde Pkg root dir."""
+  return inWorkspace(os.path.join("MdePkg", f))
+
+def DoLib(msafile):
+
+  """Create a directory with the sources, AutoGen.h and a makefile."""
+
+  sources = []
+
+  msa = xml.dom.minidom.parse(inMde(msafile))
+  libName = str(XmlElement(msa, "/ModuleSurfaceArea/MsaHeader/ModuleName"))
+  base, _ = os.path.splitext(msafile)
+  msabase = os.path.basename(base)
+
+  suppArch = str(XmlElement(msa, "/ModuleSurfaceArea/ModuleDefinitions/SupportedArchitectures"))
+  if not ARCH in string.split(suppArch, " "):
+    return
+
+  try:
+    os.path.isdir(libName) or os.mkdir(libName);
+  except:
+    print "Error: file %s exists" % libName
+    sys.exit()
+    
+
+  for msaFile in XmlList(msa, "/ModuleSurfaceArea/SourceFiles/Filename"):
+
+    msaFileName = str(XmlElementData(msaFile))
+    arch = msaFile.getAttribute("SupArchList")
+    toolchain = msaFile.getAttribute("ToolChainFamily")
+    base, ext = os.path.splitext(msaFileName)
+
+    if arch in ["", ARCH] and (ext in [".c", ".h"] or toolchain in ["GCC"]):
+      if ext in [".c", ".S"]:
+        sources.append(str(base+".o"))
+      targetDir = os.path.join(libName, os.path.dirname(msaFileName))
+      try:
+        os.makedirs(targetDir)
+      except:
+        pass
+      shutil.copy(inMde(os.path.join(os.path.dirname(msafile), msaFileName)), 
+        targetDir)
+
+    # Write a Makefile for this module
+    f = open(os.path.join(libName, "Makefile"), "w")
+    f.write(Makefile % (libName, string.join(sources, " ")))
+    f.close()
+
+    # Right now we are getting the AutoGen.h file from a previous build. We
+    # could create it from scratch also.
+    shutil.copy(inWorkspace("Build/Mde/DEBUG_UNIXGCC/%s/MdePkg/Library/%s/%s/DEBUG/AutoGen.h") % (ARCH, libName, msabase), libName)
+
+# This acts like the main() function for the script, unless it is 'import'ed
+# into another script.
+if __name__ == '__main__':
+
+  openMdeSpd();