| 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 |