| #!/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") |