OLD | NEW |
1 #! /usr/bin/python | 1 #! /usr/bin/python |
2 # -*- coding: utf-8 -*- | 2 # -*- coding: utf-8 -*- |
3 # | 3 # |
4 # Copyright (C) 2011, International Business Machines | 4 # Copyright (C) 2011-2014, International Business Machines |
5 # Corporation and others. All Rights Reserved. | 5 # Corporation and others. All Rights Reserved. |
6 # | 6 # |
7 # file name: dependencies.py | 7 # file name: dependencies.py |
8 # | 8 # |
9 # created on: 2011may26 | 9 # created on: 2011may26 |
10 | 10 |
11 """Reader module for dependency data for the ICU dependency tester. | 11 """Reader module for dependency data for the ICU dependency tester. |
12 | 12 |
13 Reads dependencies.txt and makes the data available. | 13 Reads dependencies.txt and makes the data available. |
14 | 14 |
15 Attributes: | 15 Attributes: |
16 files: Set of "library/filename.o" files mentioned in the dependencies file. | 16 files: Set of "library/filename.o" files mentioned in the dependencies file. |
17 items: Map from library or group names to item maps. | 17 items: Map from library or group names to item maps. |
18 Each item has a "type" ("library" or "group" or "system_symbols"). | 18 Each item has a "type" ("library" or "group" or "system_symbols"). |
19 A library or group item can have an optional set of "files" (as in the files
attribute). | 19 A library or group item can have an optional set of "files" (as in the files
attribute). |
20 Each item can have an optional set of "deps" (libraries & groups). | 20 Each item can have an optional set of "deps" (libraries & groups). |
21 A group item also has a "library" name unless it is a group of system symbol
s. | 21 A group item also has a "library" name unless it is a group of system symbol
s. |
22 The one "system_symbols" item and its groups have sets of "system_symbols" | 22 The one "system_symbols" item and its groups have sets of "system_symbols" |
23 with standard-library system symbol names. | 23 with standard-library system symbol names. |
24 libraries: Set of library names mentioned in the dependencies file. | 24 libraries: Set of library names mentioned in the dependencies file. |
| 25 file_to_item: Map from a symbol (ushoe.o) to library or group (shoesize) |
25 """ | 26 """ |
26 __author__ = "Markus W. Scherer" | 27 __author__ = "Markus W. Scherer" |
27 | 28 |
28 # TODO: Support binary items. | 29 # TODO: Support binary items. |
29 # .txt syntax: binary: tools/genrb | 30 # .txt syntax: binary: tools/genrb |
30 # item contents: {"type": "binary"} with optional files & deps | 31 # item contents: {"type": "binary"} with optional files & deps |
31 # A binary must not be used as a dependency for anything else. | 32 # A binary must not be used as a dependency for anything else. |
32 | 33 |
33 import sys | 34 import sys |
34 | 35 |
35 files = set() | 36 files = set() |
36 items = {} | 37 items = {} |
37 libraries = set() | 38 libraries = set() |
| 39 file_to_item = {} |
38 | 40 |
39 _line_number = 0 | 41 _line_number = 0 |
40 _groups_to_be_defined = set() | 42 _groups_to_be_defined = set() |
41 | 43 |
42 def _CheckLibraryName(name): | 44 def _CheckLibraryName(name): |
43 global _line_number | 45 global _line_number |
44 if not name: | 46 if not name: |
45 sys.exit("Error:%d: \"library: \" without name" % _line_number) | 47 sys.exit("Error:%d: \"library: \" without name" % _line_number) |
46 if name.endswith(".o"): | 48 if name.endswith(".o"): |
47 sys.exit("Error:%d: invalid library name %s" % (_line_number, name)) | 49 sys.exit("Error:%d: invalid library name %s" % (_line_number, name)) |
(...skipping 30 matching lines...) Expand all Loading... |
78 if not line: continue | 80 if not line: continue |
79 if not line.startswith(" "): return line | 81 if not line.startswith(" "): return line |
80 if item_files == None: item_files = item["files"] = set() | 82 if item_files == None: item_files = item["files"] = set() |
81 for file_name in line.split(): | 83 for file_name in line.split(): |
82 _CheckFileName(file_name) | 84 _CheckFileName(file_name) |
83 file_name = library_name + "/" + file_name | 85 file_name = library_name + "/" + file_name |
84 if file_name in files: | 86 if file_name in files: |
85 sys.exit("Error:%d: file %s listed in multiple groups" % (_line_number,
file_name)) | 87 sys.exit("Error:%d: file %s listed in multiple groups" % (_line_number,
file_name)) |
86 files.add(file_name) | 88 files.add(file_name) |
87 item_files.add(file_name) | 89 item_files.add(file_name) |
| 90 file_to_item[file_name] = item["name"] |
88 | 91 |
89 def _IsLibrary(item): return item and item["type"] == "library" | 92 def _IsLibrary(item): return item and item["type"] == "library" |
90 | 93 |
91 def _IsLibraryGroup(item): return item and "library" in item | 94 def _IsLibraryGroup(item): return item and "library" in item |
92 | 95 |
93 def _ReadDeps(deps_file, item, library_name): | 96 def _ReadDeps(deps_file, item, library_name): |
94 global items, _line_number, _groups_to_be_defined | 97 global items, _line_number, _groups_to_be_defined |
95 item_deps = item.get("deps") | 98 item_deps = item.get("deps") |
96 while True: | 99 while True: |
97 line = _ReadLine(deps_file) | 100 line = _ReadLine(deps_file) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 while True: | 147 while True: |
145 while not line: line = _RemoveComment(deps_file.next()) | 148 while not line: line = _RemoveComment(deps_file.next()) |
146 | 149 |
147 if line.startswith("library: "): | 150 if line.startswith("library: "): |
148 current_type = "library" | 151 current_type = "library" |
149 name = line[9:].lstrip() | 152 name = line[9:].lstrip() |
150 _CheckLibraryName(name) | 153 _CheckLibraryName(name) |
151 if name in items: | 154 if name in items: |
152 sys.exit("Error:%d: library definition using duplicate name %s" % (_li
ne_number, name)) | 155 sys.exit("Error:%d: library definition using duplicate name %s" % (_li
ne_number, name)) |
153 libraries.add(name) | 156 libraries.add(name) |
154 item = items[name] = {"type": "library"} | 157 item = items[name] = {"type": "library", "name": name} |
155 line = _ReadFiles(deps_file, item, name) | 158 line = _ReadFiles(deps_file, item, name) |
156 elif line.startswith("group: "): | 159 elif line.startswith("group: "): |
157 current_type = "group" | 160 current_type = "group" |
158 name = line[7:].lstrip() | 161 name = line[7:].lstrip() |
159 _CheckGroupName(name) | 162 _CheckGroupName(name) |
160 if name not in items: | 163 if name not in items: |
161 sys.exit("Error:%d: group %s defined before mentioned as a dependency"
% | 164 sys.exit("Error:%d: group %s defined before mentioned as a dependency"
% |
162 (_line_number, name)) | 165 (_line_number, name)) |
163 if name not in _groups_to_be_defined: | 166 if name not in _groups_to_be_defined: |
164 sys.exit("Error:%d: group definition using duplicate name %s" % (_line
_number, name)) | 167 sys.exit("Error:%d: group definition using duplicate name %s" % (_line
_number, name)) |
165 _groups_to_be_defined.remove(name) | 168 _groups_to_be_defined.remove(name) |
166 item = items[name] | 169 item = items[name] |
| 170 item["name"] = name |
167 library_name = item.get("library") | 171 library_name = item.get("library") |
168 if library_name: | 172 if library_name: |
169 line = _ReadFiles(deps_file, item, library_name) | 173 line = _ReadFiles(deps_file, item, library_name) |
170 else: | 174 else: |
171 line = _ReadSystemSymbols(deps_file, item) | 175 line = _ReadSystemSymbols(deps_file, item) |
172 elif line == " deps": | 176 elif line == " deps": |
173 if current_type == "library": | 177 if current_type == "library": |
174 line = _ReadDeps(deps_file, items[name], name) | 178 line = _ReadDeps(deps_file, items[name], name) |
175 elif current_type == "group": | 179 elif current_type == "group": |
176 item = items[name] | 180 item = items[name] |
177 line = _ReadDeps(deps_file, item, item.get("library")) | 181 line = _ReadDeps(deps_file, item, item.get("library")) |
178 elif current_type == "system_symbols": | 182 elif current_type == "system_symbols": |
179 item = items[current_type] | 183 item = items[current_type] |
180 line = _ReadDeps(deps_file, item, None) | 184 line = _ReadDeps(deps_file, item, None) |
181 else: | 185 else: |
182 sys.exit("Error:%d: deps before any library or group" % _line_number) | 186 sys.exit("Error:%d: deps before any library or group" % _line_number) |
183 elif line == "system_symbols:": | 187 elif line == "system_symbols:": |
184 current_type = "system_symbols" | 188 current_type = "system_symbols" |
185 if current_type in items: | 189 if current_type in items: |
186 sys.exit("Error:%d: duplicate entry for system_symbols" % _line_number
) | 190 sys.exit("Error:%d: duplicate entry for system_symbols" % _line_number
) |
187 item = items[current_type] = {"type": current_type} | 191 item = items[current_type] = {"type": current_type, "name": current_type
} |
188 line = _ReadSystemSymbols(deps_file, item) | 192 line = _ReadSystemSymbols(deps_file, item) |
189 else: | 193 else: |
190 sys.exit("Syntax error:%d: %s" % (_line_number, line)) | 194 sys.exit("Syntax error:%d: %s" % (_line_number, line)) |
191 except StopIteration: | 195 except StopIteration: |
192 pass | 196 pass |
193 if _groups_to_be_defined: | 197 if _groups_to_be_defined: |
194 sys.exit("Error: some groups mentioned in dependencies are undefined: %s" %
_groups_to_be_defined) | 198 sys.exit("Error: some groups mentioned in dependencies are undefined: %s" %
_groups_to_be_defined) |
OLD | NEW |