2007-01-10 03:23:35 +01:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
"""Create GNU Makefiles for the Libraries of the MdePkg."""
|
2007-01-10 03:23:35 +01:00
|
|
|
|
|
|
|
import os, sys, getopt, string, xml.dom.minidom, shutil
|
|
|
|
from XmlRoutines import *
|
|
|
|
from WorkspaceRoutines import *
|
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
copyingSources = 1
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
Makefile = string.Template("""ARCH = $ARCH
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
MAKEROOT ?= ../..
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
VPATH = ..
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
LIBNAME = $LIBNAME
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
OBJECTS = $OBJECTS
|
|
|
|
|
|
|
|
include $$(MAKEROOT)/lib.makefile
|
|
|
|
""")
|
|
|
|
|
|
|
|
def mkdir(path):
|
|
|
|
"""Make a directory if it is not there already."""
|
|
|
|
|
|
|
|
try:
|
|
|
|
os.makedirs(path)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
|
|
|
def openMdeSpd(arch):
|
2007-01-10 03:23:35 +01:00
|
|
|
|
|
|
|
"""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)
|
2007-01-10 23:36:15 +01:00
|
|
|
doLib(msaFileName, arch)
|
2007-01-10 03:23:35 +01:00
|
|
|
|
|
|
|
return db
|
|
|
|
|
|
|
|
def inMde(f):
|
|
|
|
"""Make a path relative to the Mde Pkg root dir."""
|
|
|
|
return inWorkspace(os.path.join("MdePkg", f))
|
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
def doLib(msafile, arch):
|
2007-01-10 03:23:35 +01:00
|
|
|
|
|
|
|
"""Create a directory with the sources, AutoGen.h and a makefile."""
|
|
|
|
|
2007-01-11 01:14:05 +01:00
|
|
|
objects = []
|
2007-01-10 03:23:35 +01:00
|
|
|
|
|
|
|
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"))
|
2007-01-10 23:36:15 +01:00
|
|
|
if not arch in string.split(suppArch, " "):
|
2007-01-10 03:23:35 +01:00
|
|
|
return
|
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
mkdir(libName);
|
|
|
|
|
|
|
|
buildDir = os.path.join(libName, "build-%s" % arch )
|
|
|
|
mkdir(buildDir)
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
for sourceFile in XmlList(msa, "/ModuleSurfaceArea/SourceFiles/Filename"):
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
sourceFileName = str(XmlElementData(sourceFile))
|
|
|
|
suppArchs = sourceFile.getAttribute("SupArchList").split(" ")
|
|
|
|
toolchain = sourceFile.getAttribute("ToolChainFamily")
|
|
|
|
base, ext = os.path.splitext(sourceFileName)
|
2007-01-10 03:23:35 +01:00
|
|
|
|
2007-01-11 01:14:05 +01:00
|
|
|
if ( suppArchs == [""] or arch in suppArchs) and toolchain in ["", "GCC"] and ext in [".c", ".h", ".S"]:
|
2007-01-10 03:23:35 +01:00
|
|
|
if ext in [".c", ".S"]:
|
2007-01-11 01:14:05 +01:00
|
|
|
obj = str(base+".o")
|
|
|
|
if obj in objects:
|
|
|
|
print "Error: The msa file %s is ambigous. There are mutliple sources that can produce the object file %s. Please fix it." % (msafile, obj)
|
|
|
|
sys.exit()
|
|
|
|
else:
|
|
|
|
objects.append(obj)
|
2007-01-10 23:36:15 +01:00
|
|
|
sourceDir = os.path.join(libName, os.path.dirname(sourceFileName))
|
|
|
|
mkdir(sourceDir)
|
|
|
|
mkdir(os.path.join(buildDir, os.path.dirname(sourceFileName)))
|
|
|
|
if copyingSources :
|
|
|
|
shutil.copy(inMde(os.path.join(os.path.dirname(msafile), sourceFileName)),
|
|
|
|
sourceDir)
|
2007-01-10 03:23:35 +01:00
|
|
|
|
|
|
|
# Write a Makefile for this module
|
2007-01-10 23:36:15 +01:00
|
|
|
f = open(os.path.join(buildDir, "Makefile"), "w")
|
2007-01-11 01:14:05 +01:00
|
|
|
f.write(Makefile.substitute(ARCH=arch, LIBNAME=libName, OBJECTS=string.join(objects, " ")))
|
2007-01-10 03:23:35 +01:00
|
|
|
f.close()
|
|
|
|
|
|
|
|
# Right now we are getting the AutoGen.h file from a previous build. We
|
|
|
|
# could create it from scratch also.
|
2007-01-10 23:36:15 +01:00
|
|
|
shutil.copy(inWorkspace("Build/Mde/DEBUG_UNIXGCC/%s/MdePkg/Library/%s/%s/DEBUG/AutoGen.h") % (arch, libName, msabase), buildDir)
|
2007-01-10 03:23:35 +01:00
|
|
|
|
|
|
|
# This acts like the main() function for the script, unless it is 'import'ed
|
|
|
|
# into another script.
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
2007-01-10 23:36:15 +01:00
|
|
|
for arch in ["IA32", "X64"]:
|
|
|
|
openMdeSpd(arch);
|