3 """Create GNU Makefiles for the Libraries of the MdePkg."""
5 import os
, sys
, getopt
, string
, xml
.dom
.minidom
, shutil
6 from XmlRoutines
import *
7 from WorkspaceRoutines
import *
9 Makefile
= string
.Template("""ARCH = $ARCH
19 include $$(MAKEROOT)/lib.makefile
23 """Make a directory if it is not there already."""
32 """Open the spdFile and process the msa files it contains."""
34 db
= xml
.dom
.minidom
.parse(inWorkspace(spdFile
))
36 for arch
in ["IA32", "X64"]:
37 for msaFile
in XmlList(db
, "/PackageSurfaceArea/MsaFiles/Filename"):
38 msaFileName
= XmlElementData(msaFile
)
39 doLib(msaFileName
, arch
)
41 # Copy the Include tree for the Package
42 packageDir
= os
.path
.dirname(spdFile
)
44 if not os
.path
.exists(os
.path
.join(packageDir
, "Include")):
45 print "Exporting the include dir..."
46 os
.system("svn export %s %s" %
47 (inWorkspace(os
.path
.join(packageDir
, "Include")),
48 os
.path
.join(packageDir
, "Include")))
50 print "Error: The directory '%s' is in the way. Please move it." % os
.path
.join(packageDir
, "Include")
54 """Make a path relative to the Mde Pkg root dir."""
55 return inWorkspace(os
.path
.join("MdePkg", f
))
57 def doLib(msafile
, arch
):
59 """Create a directory with the sources, AutoGen.h and a makefile."""
63 msa
= xml
.dom
.minidom
.parse(inMde(msafile
))
64 modName
= str(XmlElement(msa
, "/ModuleSurfaceArea/MsaHeader/ModuleName"))
65 base
, _
= os
.path
.splitext(msafile
)
66 msabase
= os
.path
.basename(base
)
68 suppArch
= str(XmlElement(msa
, "/ModuleSurfaceArea/ModuleDefinitions/SupportedArchitectures"))
69 if not arch
in string
.split(suppArch
, " "):
72 # What kind of module is this?
74 # Assume it is a driver.
75 identifier
= "DRIVERNAME = %s" % modName
77 # Let's see if it claims to produce a library class.
78 for libClass
in XmlList(msa
, "/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass"):
79 if libClass
.getAttribute("Usage") == "ALWAYS_PRODUCED":
81 identifier
= "LIBNAME = %s" % modName
85 buildDir
= os
.path
.join(modName
, "build-%s" % arch
)
88 for sourceFile
in XmlList(msa
, "/ModuleSurfaceArea/SourceFiles/Filename"):
90 sourceFileName
= str(XmlElementData(sourceFile
))
91 suppArchs
= sourceFile
.getAttribute("SupArchList").split(" ")
92 toolchain
= sourceFile
.getAttribute("ToolChainFamily")
93 base
, ext
= os
.path
.splitext(sourceFileName
)
95 if (suppArchs
== [""] or arch
in suppArchs
) and toolchain
in ["", "GCC"] and ext
in [".c", ".h", ".S"]:
96 if ext
in [".c", ".S"]:
99 print "Error: The msa file %s is ambiguous. There are mutliple sources that can produce the object file %s. Please fix it." % (msafile
, obj
)
103 sourceDir
= os
.path
.join(modName
, os
.path
.dirname(sourceFileName
))
105 mkdir(os
.path
.join(buildDir
, os
.path
.dirname(sourceFileName
)))
106 shutil
.copy(inMde(os
.path
.join(os
.path
.dirname(msafile
), sourceFileName
)),
109 # Write a Makefile for this module
110 f
= open(os
.path
.join(buildDir
, "Makefile"), "w")
111 f
.write(Makefile
.substitute(ARCH
=arch
, IDENTIFIER
=identifier
, OBJECTS
=string
.join(objects
, " ")))
114 # Right now we are getting the AutoGen.h file from a previous build. We
115 # could create it from scratch also.
116 shutil
.copy(inWorkspace("Build/Mde/DEBUG_UNIXGCC/%s/MdePkg/Library/%s/%s/DEBUG/AutoGen.h") % (arch
, modName
, msabase
), buildDir
)
118 # This acts like the main() function for the script, unless it is 'import'ed
119 # into another script.
120 if __name__
== '__main__':
122 openSpd("MdePkg/MdePkg.spd")