]>
git.proxmox.com Git - mirror_edk2.git/blob - Tools/Python/GenMake.py
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
24 """Open the spdFile and process the msa files it contains."""
26 db
= xml
.dom
.minidom
.parse(inWorkspace(spdFile
))
28 for arch
in ["IA32", "X64"]:
29 for msaFile
in XmlList(db
, "/PackageSurfaceArea/MsaFiles/Filename"):
30 msaFileName
= XmlElementData(msaFile
)
31 doLib(msaFileName
, arch
)
33 # Copy the Include tree for the Package
34 packageDir
= os
.path
.dirname(spdFile
)
36 if not os
.path
.exists(os
.path
.join(packageDir
, "Include")):
37 print "Exporting the include dir..."
38 os
.system("svn export %s %s" %
39 (inWorkspace(os
.path
.join(packageDir
, "Include")),
40 os
.path
.join(packageDir
, "Include")))
42 print "Error: The directory '%s' is in the way. Please move it." % os
.path
.join(packageDir
, "Include")
46 """Make a path relative to the Mde Pkg root dir."""
47 return inWorkspace(os
.path
.join("MdePkg", f
))
49 def doLib(msafile
, arch
):
51 """Create a directory with the sources, AutoGen.h and a makefile."""
55 msa
= xml
.dom
.minidom
.parse(inMde(msafile
))
56 modName
= str(XmlElement(msa
, "/ModuleSurfaceArea/MsaHeader/ModuleName"))
57 base
, _
= os
.path
.splitext(msafile
)
58 msabase
= os
.path
.basename(base
)
60 suppArch
= str(XmlElement(msa
, "/ModuleSurfaceArea/ModuleDefinitions/SupportedArchitectures"))
61 if not arch
in string
.split(suppArch
, " "):
64 # What kind of module is this?
66 # Assume it is a driver.
67 identifier
= "DRIVERNAME = %s" % modName
69 # Let's see if it claims to produce a library class.
70 for libClass
in XmlList(msa
, "/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass"):
71 if libClass
.getAttribute("Usage") == "ALWAYS_PRODUCED":
73 identifier
= "LIBNAME = %s" % modName
77 buildDir
= os
.path
.join(modName
, "build-%s" % arch
)
80 for sourceFile
in XmlList(msa
, "/ModuleSurfaceArea/SourceFiles/Filename"):
82 sourceFileName
= str(XmlElementData(sourceFile
))
83 suppArchs
= sourceFile
.getAttribute("SupArchList").split(" ")
84 toolchain
= sourceFile
.getAttribute("ToolChainFamily")
85 base
, ext
= os
.path
.splitext(sourceFileName
)
87 if (suppArchs
== [""] or arch
in suppArchs
) and toolchain
in ["", "GCC"] and ext
in [".c", ".h", ".S"]:
88 if ext
in [".c", ".S"]:
91 print "Error: The msa file %s is ambiguous. There are mutliple sources that can produce the object file %s. Please fix it." % (msafile
, obj
)
95 sourceDir
= os
.path
.join(modName
, os
.path
.dirname(sourceFileName
))
97 mkdir(os
.path
.join(buildDir
, os
.path
.dirname(sourceFileName
)))
98 shutil
.copy(inMde(os
.path
.join(os
.path
.dirname(msafile
), sourceFileName
)),
101 # Write a Makefile for this module
102 f
= open(os
.path
.join(buildDir
, "Makefile"), "w")
103 f
.write(Makefile
.substitute(ARCH
=arch
, IDENTIFIER
=identifier
, OBJECTS
=string
.join(objects
, " ")))
106 # Right now we are getting the AutoGen.h file from a previous build. We
107 # could create it from scratch also.
108 shutil
.copy(inWorkspace("Build/Mde/DEBUG_UNIXGCC/%s/MdePkg/Library/%s/%s/DEBUG/AutoGen.h") % (arch
, modName
, msabase
), buildDir
)
110 # This acts like the main() function for the script, unless it is 'import'ed
111 # into another script.
112 if __name__
== '__main__':
114 openSpd("MdePkg/MdePkg.spd")