git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2276 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| """Create GNU Makefiles for the Libraries of the MdePkg."""
 | |
| 
 | |
| import os, sys, getopt, string, xml.dom.minidom, shutil
 | |
| from XmlRoutines import *
 | |
| from WorkspaceRoutines import *
 | |
| 
 | |
| Makefile = string.Template("""ARCH = $ARCH
 | |
| 
 | |
| MAKEROOT ?= ../..
 | |
| 
 | |
| VPATH = ..
 | |
| 
 | |
| $IDENTIFIER
 | |
| 
 | |
| OBJECTS = $OBJECTS
 | |
| 
 | |
| include $$(MAKEROOT)/lib.makefile
 | |
| """)
 | |
| 
 | |
| def openSpd(spdFile):
 | |
| 
 | |
|   """Open the spdFile and process the msa files it contains."""
 | |
| 
 | |
|   db = xml.dom.minidom.parse(inWorkspace(spdFile))
 | |
| 
 | |
|   for arch in ["IA32", "X64"]:
 | |
|     for msaFile in XmlList(db, "/PackageSurfaceArea/MsaFiles/Filename"):
 | |
|       msaFileName = XmlElementData(msaFile)
 | |
|       doLib(msaFileName, arch)
 | |
| 
 | |
|   # Copy the Include tree for the Package
 | |
|   packageDir = os.path.dirname(spdFile)
 | |
|   mkdir(packageDir)
 | |
|   if not os.path.exists(os.path.join(packageDir, "Include")):
 | |
|     print "Exporting the include dir..."
 | |
|     os.system("svn export %s %s" % 
 | |
|       (inWorkspace(os.path.join(packageDir, "Include")), 
 | |
|       os.path.join(packageDir, "Include")))
 | |
|   else: 
 | |
|     print "Error: The directory '%s' is in the way. Please move it." % os.path.join(packageDir, "Include")
 | |
|     sys.exit()
 | |
| 
 | |
| def inMde(f):
 | |
|   """Make a path relative to the Mde Pkg root dir."""
 | |
|   return inWorkspace(os.path.join("MdePkg", f))
 | |
| 
 | |
| def doLib(msafile, arch):
 | |
| 
 | |
|   """Create a directory with the sources, AutoGen.h and a makefile."""
 | |
| 
 | |
|   objects = []
 | |
| 
 | |
|   msa = xml.dom.minidom.parse(inMde(msafile))
 | |
|   modName = 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
 | |
| 
 | |
|   # What kind of module is this?
 | |
| 
 | |
|   # Assume it is a driver.
 | |
|   identifier = "DRIVERNAME = %s" % modName
 | |
| 
 | |
|   # Let's see if it claims to produce a library class.
 | |
|   for libClass in XmlList(msa, "/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass"):
 | |
|     if libClass.getAttribute("Usage") == "ALWAYS_PRODUCED":
 | |
|       # It's a library.
 | |
|       identifier = "LIBNAME = %s" % modName
 | |
| 
 | |
|   mkdir(modName)
 | |
| 
 | |
|   buildDir = os.path.join(modName, "build-%s" % arch )
 | |
|   mkdir(buildDir)
 | |
| 
 | |
|   for sourceFile in XmlList(msa, "/ModuleSurfaceArea/SourceFiles/Filename"):
 | |
| 
 | |
|     sourceFileName = str(XmlElementData(sourceFile))
 | |
|     suppArchs = sourceFile.getAttribute("SupArchList").split(" ")
 | |
|     toolchain = sourceFile.getAttribute("ToolChainFamily")
 | |
|     base, ext = os.path.splitext(sourceFileName)
 | |
| 
 | |
|     if (suppArchs == [""] or arch in suppArchs) and toolchain in ["", "GCC"] and ext in [".c", ".h", ".S"]:
 | |
|       if ext in [".c", ".S"]:
 | |
|         obj = str(base+".o")
 | |
|         if obj in objects:
 | |
|           print "Error: The msa file %s is ambiguous. There are mutliple sources that can produce the object file %s. Please fix it." % (msafile, obj)
 | |
|           sys.exit()
 | |
|         else:
 | |
|           objects.append(obj)
 | |
|       sourceDir = os.path.join(modName, os.path.dirname(sourceFileName))
 | |
|       mkdir(sourceDir)
 | |
|       mkdir(os.path.join(buildDir, os.path.dirname(sourceFileName)))
 | |
|       shutil.copy(inMde(os.path.join(os.path.dirname(msafile), sourceFileName)), 
 | |
|         sourceDir)
 | |
| 
 | |
|     # Write a Makefile for this module
 | |
|     f = open(os.path.join(buildDir, "Makefile"), "w")
 | |
|     f.write(Makefile.substitute(ARCH=arch, IDENTIFIER=identifier, OBJECTS=string.join(objects, " ")))
 | |
|     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, modName, msabase), buildDir)
 | |
| 
 | |
| # This acts like the main() function for the script, unless it is 'import'ed
 | |
| # into another script.
 | |
| if __name__ == '__main__':
 | |
| 
 | |
|   openSpd("MdePkg/MdePkg.spd")
 |