]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Python/buildgen/BuildConfig.py
Python script for generating build files for platform and modules, which uses the...
[mirror_edk2.git] / Tools / Python / buildgen / BuildConfig.py
CommitLineData
28972318 1#!/usr/bin/env python\r
2\r
3# Copyright (c) 2007, Intel Corporation\r
4# All rights reserved. This program and the accompanying materials\r
5# are licensed and made available under the terms and conditions of the BSD License\r
6# which accompanies this distribution. The full text of the license may be found at\r
7# http://opensource.org/licenses/bsd-license.php\r
8#\r
9# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12"""Tools and build configuration"""\r
13\r
14from sets import Set\r
15\r
16class Config(dict):\r
17 def __init__(self, file):\r
18 """file (target configuration file)"""\r
19 configFile = open(file)\r
20 while True:\r
21 line = configFile.readline()\r
22 if line == "": break ## no more line\r
23\r
24 line = line.strip()\r
25 # skip blank line\r
26 if line == "": continue\r
27 # skip comment line\r
28 if line[0] == '#': continue\r
29 # skip invalid line\r
30 if line[0] == '=':\r
31 print "! invalid configuration:", line\r
32 continue\r
33\r
34 defStrings = line.split('=', 1)\r
35 name = defStrings[0].strip()\r
36 value = defStrings[1].strip()\r
37 self[name] = value\r
38\r
39 configFile.close()\r
40\r
41 def __getitem__(self, attr):\r
42 if attr not in self:\r
43 return ""\r
44\r
45 value = dict.__getitem__(self, attr)\r
46 if value == None:\r
47 value = ""\r
48 return value\r
49\r
50class ToolConfig(dict):\r
51 def __init__(self, file):\r
52 """file (tools configuration file path)"""\r
53 self.Targets = Set()\r
54 self.Toolchains = Set()\r
55 self.Archs = Set()\r
56 self.ToolCodes = Set()\r
57 self.Families = Set()\r
58 self.Attributes = Set(["FAMILY", "NAME", "PATH", "FLAGS", "EXT", "DPATH", "SPATH", "LIBPATH", "INCLUDEPATH"])\r
59 \r
60 configFile = open(file)\r
61 while True:\r
62 line = configFile.readline()\r
63 if line == "": break\r
64\r
65 line = line.strip()\r
66 # skip blank line\r
67 if line == "": continue\r
68 # skip comment line\r
69 if line[0] == '#': continue\r
70 # skip invalid line\r
71 if line[0] == '=':\r
72 print "! invalid definition:", line\r
73 continue\r
74\r
75 # split the definition at the first "="\r
76 tool_def = line.split('=', 1)\r
77 name = tool_def[0].strip()\r
78 value = tool_def[1].strip()\r
79 \r
80 # the name of a tool definition must have five parts concatenated by "_"\r
81 keys = name.split('_')\r
82 # skip non-definition line\r
83 if len(keys) < 5: continue\r
84 \r
85 keys = (keys[1], keys[0], keys[2], keys[3], keys[4])\r
86 self[keys] = value\r
87 \r
88 ###############################################\r
89 ## statistics\r
90 ###############################################\r
91 if keys[0] != '*': self.Toolchains.add(keys[0])\r
92 if keys[1] != '*': self.Targets.add(keys[1])\r
93 if keys[2] != '*': self.Archs.add(keys[2])\r
94 if keys[3] != '*': self.ToolCodes.add(keys[3])\r
95 if keys[4] == "FAMILY": self.Families.add(value)\r
96 elif keys[4] == '*': raise Exception("No * allowed in ATTRIBUTE field")\r
97\r
98 configFile.close()\r
99 # expand the "*" in each field\r
100 self.expand()\r
101\r
102 def __getitem__(self, attrs):\r
103 if len(attrs) != 5:\r
104 return ""\r
105 \r
106 if attrs not in self:\r
107 return ""\r
108 \r
109 value = dict.__getitem__(self, attrs)\r
110 if value == None:\r
111 value = ""\r
112 return value\r
113 \r
114 def expand(self):\r
115 summary = {}\r
116 toolchains = []\r
117 targets = []\r
118 archs = []\r
119 toolcodes = []\r
120 for key in self:\r
121 value = self[key]\r
122 if key[0] == '*':\r
123 toolchains = self.Toolchains\r
124 else:\r
125 toolchains = [key[0]]\r
126\r
127 for toolchain in toolchains:\r
128 if key[1] == '*':\r
129 targets = self.Targets\r
130 else:\r
131 targets = [key[1]]\r
132 \r
133 for target in targets:\r
134 if key[2] == '*':\r
135 archs = self.Archs\r
136 else:\r
137 archs = [key[2]]\r
138 \r
139 for arch in archs:\r
140 if key[3] == '*':\r
141 toolcodes = self.ToolCodes\r
142 else:\r
143 toolcodes = [key[3]]\r
144 \r
145 for toolcode in toolcodes:\r
146 attribute = key[4]\r
147 summary[(toolchain, target, arch, toolcode, attribute)] = value\r
148 self.clear()\r
149 for toolchain in self.Toolchains:\r
150 for target in self.Targets:\r
151 for arch in self.Archs:\r
152 for toolcode in self.ToolCodes:\r
153 key = (toolchain, target, arch, toolcode, "NAME")\r
154 if key not in summary: continue\r
155 for attr in self.Attributes:\r
156 key = (toolchain, target, arch, toolcode, attr)\r
157 if key not in summary: continue\r
158 self[key] = summary[key]\r
159\r
160\r
161 def __str__(self):\r
162 s = ""\r
163 for entry in self:\r
164 s += entry[0] + "_" + entry[1] + "_" + entry[2] + "_" + entry[3] + "_" + entry[4]\r
165 s += " = " + self[entry] + "\n"\r
166 return s\r
167\r
168class TargetConfig(Config):\r
169 pass\r
170\r
171## for test\r
172if __name__ == "__main__":\r
173 import os\r
174 if "WORKSPACE" not in os.environ:\r
175 raise "No WORKSPACE given"\r
176 cfg = ToolConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "tools_def.txt"))\r
177 tgt = TargetConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "target.txt"))\r
178\r
179 for key in cfg:\r
180 print key,"=",cfg[key]\r
181 \r
182 print\r
183 for name in tgt:\r
184 print name,"=",tgt[name]\r
185