]>
Commit | Line | Data |
---|---|---|
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") |