From 2897231803d9d506f7cb7c68eeb59dcc4805084d Mon Sep 17 00:00:00 2001
From: jwang36 <jwang36@6f19259b-4bc3-4df7-8a09-765794883524>
Date: Mon, 22 Jan 2007 09:59:07 +0000
Subject: Python script for generating build files for platform and modules,
 which uses the enhanced XmlRoutines.py written by Bruce.

The functionalities include:
- parse all packages(.spd) and modules(.msa)
- parse active platform(.fpd). You must set active platform in target.txt otherwise nothing will be parsed.
- parse tools_def.txt and target.txt
- generate Ant build files for active platform and its modules. The generated build file is re-designed and can be called separately once generated.
- multi-thread build

The functionalities which haven't been implemented include:
- AutoGen. No AutoGen.h and AutoGen.c will be generated. If you want run the build file, you have to run the "build" command in advance to generate the AutoGen.h/.c files and remove the any other intermediate files.
- generate FFS and FV files. Only compiling will be done by the generated build file.

Usage:
- type "python ${WORKSPACE}/Tools/Python/buildgen/BuildFile.py" in shell to generate build file
- goto "${WORKSPACE}/Build/${platform}/${target}_${toolchaintag}/", type "ant" to run the build file


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2278 6f19259b-4bc3-4df7-8a09-765794883524
---
 Tools/Python/buildgen/BuildConfig.py | 185 +++++++++++++++++++++++++++++++++++
 1 file changed, 185 insertions(+)
 create mode 100644 Tools/Python/buildgen/BuildConfig.py

(limited to 'Tools/Python/buildgen/BuildConfig.py')

diff --git a/Tools/Python/buildgen/BuildConfig.py b/Tools/Python/buildgen/BuildConfig.py
new file mode 100644
index 0000000000..e91bd294a5
--- /dev/null
+++ b/Tools/Python/buildgen/BuildConfig.py
@@ -0,0 +1,185 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2007, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+"""Tools and build configuration"""
+
+from sets import Set
+
+class Config(dict):
+    def __init__(self, file):
+        """file (target configuration file)"""
+        configFile = open(file)
+        while True:
+            line = configFile.readline()
+            if line == "": break    ## no more line
+
+            line = line.strip()
+            # skip blank line
+            if line == "": continue
+            # skip comment line
+            if line[0] == '#': continue
+            # skip invalid line
+            if line[0] == '=':
+                print "! invalid configuration:", line
+                continue
+
+            defStrings = line.split('=', 1)
+            name = defStrings[0].strip()
+            value = defStrings[1].strip()
+            self[name] = value
+
+        configFile.close()
+
+    def __getitem__(self, attr):
+        if attr not in self:
+            return ""
+
+        value = dict.__getitem__(self, attr)
+        if value == None:
+            value = ""
+        return value
+
+class ToolConfig(dict):
+    def __init__(self, file):
+        """file (tools configuration file path)"""
+        self.Targets = Set()
+        self.Toolchains = Set()
+        self.Archs = Set()
+        self.ToolCodes = Set()
+        self.Families = Set()
+        self.Attributes = Set(["FAMILY", "NAME", "PATH", "FLAGS", "EXT", "DPATH", "SPATH", "LIBPATH", "INCLUDEPATH"])
+        
+        configFile = open(file)
+        while True:
+            line = configFile.readline()
+            if line == "": break
+
+            line = line.strip()
+            # skip blank line
+            if line == "": continue
+            # skip comment line
+            if line[0] == '#': continue
+            # skip invalid line
+            if line[0] == '=':
+                print "! invalid definition:", line
+                continue
+
+            # split the definition at the first "="
+            tool_def = line.split('=', 1)
+            name = tool_def[0].strip()
+            value = tool_def[1].strip()
+            
+            # the name of a tool definition must have five parts concatenated by "_"
+            keys = name.split('_')
+            # skip non-definition line
+            if len(keys) < 5: continue
+        
+            keys = (keys[1], keys[0], keys[2], keys[3], keys[4])
+            self[keys] = value
+            
+            ###############################################
+            ## statistics
+            ###############################################
+            if keys[0] != '*': self.Toolchains.add(keys[0])
+            if keys[1] != '*': self.Targets.add(keys[1])
+            if keys[2] != '*': self.Archs.add(keys[2])
+            if keys[3] != '*': self.ToolCodes.add(keys[3])
+            if keys[4] == "FAMILY": self.Families.add(value)
+            elif keys[4] == '*': raise Exception("No * allowed in ATTRIBUTE field")
+
+        configFile.close()
+        # expand the "*" in each field
+        self.expand()
+
+    def __getitem__(self, attrs):
+        if len(attrs) != 5:
+            return ""
+        
+        if attrs not in self:
+            return ""
+        
+        value = dict.__getitem__(self, attrs)
+        if value == None:
+            value = ""
+        return value
+    
+    def expand(self):
+        summary = {}
+        toolchains = []
+        targets = []
+        archs = []
+        toolcodes = []
+        for key in self:
+            value = self[key]
+            if key[0] == '*':
+                toolchains = self.Toolchains
+            else:
+                toolchains = [key[0]]
+
+            for toolchain in toolchains:
+                if key[1] == '*':
+                    targets = self.Targets
+                else:
+                    targets = [key[1]]
+                    
+                for target in targets:
+                    if key[2] == '*':
+                        archs = self.Archs
+                    else:
+                        archs = [key[2]]
+                        
+                    for arch in archs:
+                        if key[3] == '*':
+                            toolcodes = self.ToolCodes
+                        else:
+                            toolcodes = [key[3]]
+                            
+                        for toolcode in toolcodes:
+                            attribute = key[4]
+                            summary[(toolchain, target, arch, toolcode, attribute)] = value
+        self.clear()
+        for toolchain in self.Toolchains:
+            for target in self.Targets:
+                for arch in self.Archs:
+                    for toolcode in self.ToolCodes:
+                        key = (toolchain, target, arch, toolcode, "NAME")
+                        if key not in summary: continue
+                        for attr in self.Attributes:
+                            key = (toolchain, target, arch, toolcode, attr)
+                            if key not in summary: continue
+                            self[key] = summary[key]
+
+
+    def __str__(self):
+        s = ""
+        for entry in self:
+            s += entry[0] + "_" + entry[1] + "_" + entry[2] + "_" + entry[3] + "_" + entry[4]
+            s += " = " + self[entry] + "\n"
+        return s
+
+class TargetConfig(Config):
+    pass
+
+## for test
+if __name__ == "__main__":
+    import os
+    if "WORKSPACE" not in os.environ:
+        raise "No WORKSPACE given"
+    cfg = ToolConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "tools_def.txt"))
+    tgt = TargetConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "target.txt"))
+
+    for key in cfg:
+        print key,"=",cfg[key]
+    
+    print
+    for name in tgt:
+        print name,"=",tgt[name]
+        
\ No newline at end of file
-- 
cgit v1.2.3