Import BaseMemoryLibMmx;
[mirror_edk2.git] / Tools / Python / GenMake.py
1 #!/usr/bin/env python
2
3 """Create GNU Makefiles for the Libraries of the MdePkg."""
4
5 import os, sys, getopt, string, xml.dom.minidom, shutil
6 from XmlRoutines import *
7 from WorkspaceRoutines import *
8
9 Makefile = string.Template("""ARCH = $ARCH
10
11 MAKEROOT ?= ../..
12
13 VPATH = ..
14
15 $IDENTIFIER
16
17 OBJECTS = $OBJECTS
18
19 include $$(MAKEROOT)/lib.makefile
20 """)
21
22 def openSpd(spdFile):
23
24 """Open the spdFile and process the msa files it contains."""
25
26 db = xml.dom.minidom.parse(inWorkspace(spdFile))
27
28 for arch in ["IA32", "X64"]:
29 for msaFile in XmlList(db, "/PackageSurfaceArea/MsaFiles/Filename"):
30 msaFileName = XmlElementData(msaFile)
31 doLib(msaFileName, arch)
32
33 # Copy the Include tree for the Package
34 packageDir = os.path.dirname(spdFile)
35 mkdir(packageDir)
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")))
41 else:
42 print "Error: The directory '%s' is in the way. Please move it." % os.path.join(packageDir, "Include")
43 sys.exit()
44
45 def inMde(f):
46 """Make a path relative to the Mde Pkg root dir."""
47 return inWorkspace(os.path.join("MdePkg", f))
48
49 def doLib(msafile, arch):
50
51 """Create a directory with the sources, AutoGen.h and a makefile."""
52
53 objects = []
54
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)
59
60 suppArch = str(XmlElement(msa, "/ModuleSurfaceArea/ModuleDefinitions/SupportedArchitectures"))
61 if not arch in string.split(suppArch, " "):
62 return
63
64 # What kind of module is this?
65
66 # Assume it is a driver.
67 identifier = "DRIVERNAME = %s" % modName
68
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":
72 # It's a library.
73 identifier = "LIBNAME = %s" % modName
74
75 mkdir(modName)
76
77 buildDir = os.path.join(modName, "build-%s" % arch )
78 mkdir(buildDir)
79
80 for sourceFile in XmlList(msa, "/ModuleSurfaceArea/SourceFiles/Filename"):
81
82 sourceFileName = str(XmlElementData(sourceFile))
83 suppArchs = sourceFile.getAttribute("SupArchList").split(" ")
84 toolchain = sourceFile.getAttribute("ToolChainFamily")
85 base, ext = os.path.splitext(sourceFileName)
86
87 if (suppArchs == [""] or arch in suppArchs) and toolchain in ["", "GCC"] and ext in [".c", ".h", ".S"]:
88 if ext in [".c", ".S"]:
89 obj = str(base+".o")
90 if obj in objects:
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)
92 sys.exit()
93 else:
94 objects.append(obj)
95 sourceDir = os.path.join(modName, os.path.dirname(sourceFileName))
96 mkdir(sourceDir)
97 mkdir(os.path.join(buildDir, os.path.dirname(sourceFileName)))
98 shutil.copy(inMde(os.path.join(os.path.dirname(msafile), sourceFileName)),
99 sourceDir)
100
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, " ")))
104 f.close()
105
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)
109
110 # This acts like the main() function for the script, unless it is 'import'ed
111 # into another script.
112 if __name__ == '__main__':
113
114 openSpd("MdePkg/MdePkg.spd")