summaryrefslogtreecommitdiff
path: root/Tools/Python/GenMake.py
blob: 56401fbbc0854c766169924c93e6ed39c02a183c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python

"""Create Makefiles for the MdePkg."""

import os, sys, getopt, string, xml.dom.minidom, shutil
from XmlRoutines import *
from WorkspaceRoutines import *

ARCH = "X64"

Makefile = """MAKEROOT ?= ..

LIBNAME = %s

OBJECTS = %s 

include $(MAKEROOT)/lib.makefile
"""

def openMdeSpd():

  """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)
    DoLib(msaFileName)

  return db

def inMde(f):
  """Make a path relative to the Mde Pkg root dir."""
  return inWorkspace(os.path.join("MdePkg", f))

def DoLib(msafile):

  """Create a directory with the sources, AutoGen.h and a makefile."""

  sources = []

  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"))
  if not ARCH in string.split(suppArch, " "):
    return

  try:
    os.path.isdir(libName) or os.mkdir(libName);
  except:
    print "Error: file %s exists" % libName
    sys.exit()
    

  for msaFile in XmlList(msa, "/ModuleSurfaceArea/SourceFiles/Filename"):

    msaFileName = str(XmlElementData(msaFile))
    arch = msaFile.getAttribute("SupArchList")
    toolchain = msaFile.getAttribute("ToolChainFamily")
    base, ext = os.path.splitext(msaFileName)

    if arch in ["", ARCH] and (ext in [".c", ".h"] or toolchain in ["GCC"]):
      if ext in [".c", ".S"]:
        sources.append(str(base+".o"))
      targetDir = os.path.join(libName, os.path.dirname(msaFileName))
      try:
        os.makedirs(targetDir)
      except:
        pass
      shutil.copy(inMde(os.path.join(os.path.dirname(msafile), msaFileName)), 
        targetDir)

    # Write a Makefile for this module
    f = open(os.path.join(libName, "Makefile"), "w")
    f.write(Makefile % (libName, string.join(sources, " ")))
    f.close()

    # Right now we are getting the AutoGen.h file from a previous build. We
    # could create it from scratch also.
    shutil.copy(inWorkspace("Build/Mde/DEBUG_UNIXGCC/%s/MdePkg/Library/%s/%s/DEBUG/AutoGen.h") % (ARCH, libName, msabase), libName)

# This acts like the main() function for the script, unless it is 'import'ed
# into another script.
if __name__ == '__main__':

  openMdeSpd();