1 |
commit: 6282695a77af21bd60a31d182575c5a12a1a359b |
2 |
Author: slis <lis.slawek <AT> gmail <DOT> com> |
3 |
AuthorDate: Mon Sep 30 05:36:25 2013 +0000 |
4 |
Commit: slis <lis.slawek <AT> gmail <DOT> com> |
5 |
CommitDate: Mon Sep 30 05:36:25 2013 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=6282695a |
7 |
|
8 |
Fixed multilib support |
9 |
|
10 |
--- |
11 |
pym/gentoolkit/revdep_rebuild/analyse.py | 136 +++++++++++++++++++++++-------- |
12 |
pym/gentoolkit/revdep_rebuild/rebuild.py | 2 +- |
13 |
2 files changed, 105 insertions(+), 33 deletions(-) |
14 |
|
15 |
diff --git a/pym/gentoolkit/revdep_rebuild/analyse.py b/pym/gentoolkit/revdep_rebuild/analyse.py |
16 |
index 1b7372c..e630bc9 100644 |
17 |
--- a/pym/gentoolkit/revdep_rebuild/analyse.py |
18 |
+++ b/pym/gentoolkit/revdep_rebuild/analyse.py |
19 |
@@ -20,13 +20,14 @@ def prepare_checks(files_to_check, libraries, bits, cmd_max_args): |
20 |
libs = [] # libs found by scanelf |
21 |
dependencies = [] # list of lists of files (from file_to_check) that uses |
22 |
# library (for dependencies[id] and libs[id] => id==id) |
23 |
+ bits = [] |
24 |
|
25 |
|
26 |
# from runner import ScanRunner |
27 |
# sr = ScanRunner(['-M', str(bits), '-nBF', '%F %n'], files_to_check, cmd_max_args) |
28 |
# sr.wait() |
29 |
|
30 |
- for line in scan(['-M', str(bits), '-nBF', '%F %n'], files_to_check, cmd_max_args): |
31 |
+ for line in scan(['-M', str(bits), '-nBF', '%F %n %M'], files_to_check, cmd_max_args): |
32 |
#call_program(['scanelf', '-M', str(bits), '-nBF', '%F %n',]+files_to_check).strip().split('\n'): |
33 |
r = line.strip().split(' ') |
34 |
if len(r) < 2: # no dependencies? |
35 |
@@ -38,12 +39,34 @@ def prepare_checks(files_to_check, libraries, bits, cmd_max_args): |
36 |
i = libs.index(d) |
37 |
dependencies[i].append(r[0]) |
38 |
else: |
39 |
+ #print d, 'bits:', r[2][8:] # 8: -> strlen('ELFCLASS') |
40 |
libs.append(d) |
41 |
dependencies.append([r[0],]) |
42 |
|
43 |
return (libs, dependencies) |
44 |
|
45 |
|
46 |
+def scan_files(libs_and_bins, cmd_max_args): |
47 |
+ import os |
48 |
+ |
49 |
+ scanned_files = {} # {bits: {soname: (filename, needed), ...}, ...} |
50 |
+ for line in scan(['-nBF', '%F %f %S %n %M'], libs_and_bins, cmd_max_args): |
51 |
+ filename, sfilename, soname, needed, bits = line.split(' ') |
52 |
+ filename = os.path.realpath(filename) |
53 |
+ needed = needed.split(',') |
54 |
+ bits = bits[8:] # 8: -> strlen('ELFCLASS') |
55 |
+ if not soname: |
56 |
+ soname = sfilename |
57 |
+ |
58 |
+ try: |
59 |
+ scanned_files[bits][soname] = (filename, needed) |
60 |
+ except KeyError: |
61 |
+ scanned_files[bits] = {} |
62 |
+ scanned_files[bits][soname] = (filename, needed) |
63 |
+ return scanned_files |
64 |
+ |
65 |
+ |
66 |
+ |
67 |
def extract_dependencies_from_la(la, libraries, to_check, logger): |
68 |
broken = [] |
69 |
|
70 |
@@ -98,7 +121,7 @@ def find_broken(found_libs, system_libraries, to_check): |
71 |
# join libraries and looking at it as string is way too faster than for-jumping |
72 |
|
73 |
broken = [] |
74 |
- sl = '|'.join(system_libraries) |
75 |
+ sl = '|'.join(system_libraries) + '|' |
76 |
|
77 |
if not to_check: |
78 |
for f in found_libs: |
79 |
@@ -113,6 +136,25 @@ def find_broken(found_libs, system_libraries, to_check): |
80 |
return broken |
81 |
|
82 |
|
83 |
+def find_broken2(scanned_files, logger): |
84 |
+ broken_libs = {} |
85 |
+ for bits, libs in scanned_files.items(): |
86 |
+ logger.debug('Checking for bits: %s' % bits) |
87 |
+ alllibs = '|'.join(libs.keys()) + '|' |
88 |
+ for soname, needed in libs.items(): |
89 |
+ for l in needed[1]: |
90 |
+ if not l+'|' in alllibs: |
91 |
+ try: |
92 |
+ broken_libs[bits][l].add(soname) |
93 |
+ except KeyError: |
94 |
+ try: |
95 |
+ broken_libs[bits][l] = set([soname]) |
96 |
+ except KeyError: |
97 |
+ broken_libs = {bits: {l: set([soname])}} |
98 |
+ |
99 |
+ return broken_libs |
100 |
+ |
101 |
+ |
102 |
def main_checks(found_libs, broken, dependencies, logger): |
103 |
''' Checks for broken dependencies. |
104 |
found_libs have to be the same as returned by prepare_checks |
105 |
@@ -131,6 +173,18 @@ def main_checks(found_libs, broken, dependencies, logger): |
106 |
return broken_pathes |
107 |
|
108 |
|
109 |
+def main_checks2(broken, scanned_files, logger): |
110 |
+ broken_pathes = [] |
111 |
+ for bits, _broken in broken.items(): |
112 |
+ for soname, needed in _broken.items(): |
113 |
+ logger.info('Broken files that requires: %s (%s bits)' % (bold(soname), bits)) |
114 |
+ for n in needed: |
115 |
+ fp = scanned_files[bits][n][0] |
116 |
+ logger.info(yellow(' * ') + n + ' (' + fp + ')') |
117 |
+ broken_pathes.append(fp) |
118 |
+ return broken_pathes |
119 |
+ |
120 |
+ |
121 |
def analyse(settings, logger, libraries=None, la_libraries=None, |
122 |
libraries_links=None, binaries=None, _libs_to_check=set()): |
123 |
"""Main program body. It will collect all info and determine the |
124 |
@@ -169,56 +223,74 @@ def analyse(settings, logger, libraries=None, la_libraries=None, |
125 |
|
126 |
|
127 |
logger.debug('Found '+ str(len(libraries)) + ' libraries (+' + str(len(libraries_links)) + ' symlinks) and ' + str(len(binaries)) + ' binaries') |
128 |
+ logger.info(green(' * ') + bold('Scanning files')) |
129 |
+ |
130 |
+ libs_and_bins = libraries+binaries |
131 |
|
132 |
+ scanned_files = scan_files(libs_and_bins, settings['CMD_MAX_ARGS']) |
133 |
+ |
134 |
logger.warn(green(' * ') + bold('Checking dynamic linking consistency')) |
135 |
logger.debug('Search for ' + str(len(binaries)+len(libraries)) + ' within ' + str(len(libraries)+len(libraries_links))) |
136 |
- libs_and_bins = libraries+binaries |
137 |
+ |
138 |
+ broken = find_broken2(scanned_files, logger) |
139 |
+ broken_pathes = main_checks2(broken, scanned_files, logger) |
140 |
+ |
141 |
+ broken_la = extract_dependencies_from_la(la_libraries, libraries+libraries_links, _libs_to_check, logger) |
142 |
+ broken_pathes += broken_la |
143 |
+ |
144 |
+ logger.warn(green(' * ') + bold('Assign files to packages')) |
145 |
+ |
146 |
+ return assign_packages(broken_pathes, logger, settings) |
147 |
|
148 |
+ import sys |
149 |
+ sys.exit() |
150 |
+ |
151 |
#l = [] |
152 |
#for line in call_program(['scanelf', '-M', '64', '-BF', '%F',] + libraries).strip().split('\n'): |
153 |
#l.append(line) |
154 |
#libraries = l |
155 |
|
156 |
- found_libs = [] |
157 |
- dependencies = [] |
158 |
+ ## old version from here |
159 |
+ #found_libs = [] |
160 |
+ #dependencies = [] |
161 |
|
162 |
- if _libs_to_check: |
163 |
- nltc = [] |
164 |
- for ltc in _libs_to_check: |
165 |
- if os.path.isfile(ltc): |
166 |
- ltc = scan(['-nBSF', '%S'], [ltc,], settings['CMD_MAX_ARGS'])[0].split()[0] |
167 |
- nltc += [ltc,] |
168 |
- _libs_to_check = nltc |
169 |
+ #if _libs_to_check: |
170 |
+ #nltc = [] |
171 |
+ #for ltc in _libs_to_check: |
172 |
+ #if os.path.isfile(ltc): |
173 |
+ #ltc = scan(['-nBSF', '%S'], [ltc,], settings['CMD_MAX_ARGS'])[0].split()[0] |
174 |
+ #nltc += [ltc,] |
175 |
+ #_libs_to_check = nltc |
176 |
|
177 |
- _bits, linkg = platform.architecture() |
178 |
- if _bits.startswith('32'): |
179 |
- bits = 32 |
180 |
- elif _bits.startswith('64'): |
181 |
- bits = 64 |
182 |
+ #_bits, linkg = platform.architecture() |
183 |
+ #if _bits.startswith('32'): |
184 |
+ #bits = 32 |
185 |
+ #elif _bits.startswith('64'): |
186 |
+ #bits = 64 |
187 |
|
188 |
- import time |
189 |
- broken = [] |
190 |
- for av_bits in glob.glob('/lib[0-9]*') or ('/lib32',): |
191 |
- bits = int(av_bits[4:]) |
192 |
+ #import time |
193 |
+ #broken = [] |
194 |
+ #for av_bits in glob.glob('/lib[0-9]*') or ('/lib32',): |
195 |
+ #bits = int(av_bits[4:]) |
196 |
|
197 |
- #_libraries = scan(['-M', str(bits), '-BF', '%F'], libraries+libraries_links, settings['CMD_MAX_ARGS']) |
198 |
- _libraries = libraries+libraries_links |
199 |
+ ##_libraries = scan(['-M', str(bits), '-BF', '%F'], libraries+libraries_links, settings['CMD_MAX_ARGS']) |
200 |
+ #_libraries = libraries+libraries_links |
201 |
|
202 |
- found_libs, dependencies = prepare_checks(libs_and_bins, _libraries, bits, settings['CMD_MAX_ARGS']) |
203 |
- broken = find_broken(found_libs, _libraries, _libs_to_check) |
204 |
+ #found_libs, dependencies = prepare_checks(libs_and_bins, _libraries, bits, settings['CMD_MAX_ARGS']) |
205 |
+ #broken = find_broken(found_libs, _libraries, _libs_to_check) |
206 |
|
207 |
- bits /= 2 |
208 |
- bits = int(bits) |
209 |
+ #bits /= 2 |
210 |
+ #bits = int(bits) |
211 |
|
212 |
- broken_la = extract_dependencies_from_la(la_libraries, libraries+libraries_links, _libs_to_check, logger) |
213 |
+ #broken_la = extract_dependencies_from_la(la_libraries, libraries+libraries_links, _libs_to_check, logger) |
214 |
|
215 |
|
216 |
- broken_pathes = main_checks(found_libs, broken, dependencies, logger) |
217 |
- broken_pathes += broken_la |
218 |
+ #broken_pathes = main_checks(found_libs, broken, dependencies, logger) |
219 |
+ #broken_pathes += broken_la |
220 |
|
221 |
- logger.warn(green(' * ') + bold('Assign files to packages')) |
222 |
+ #logger.warn(green(' * ') + bold('Assign files to packages')) |
223 |
|
224 |
- return assign_packages(broken_pathes, logger, settings) |
225 |
+ #return assign_packages(broken_pathes, logger, settings) |
226 |
|
227 |
|
228 |
|
229 |
|
230 |
diff --git a/pym/gentoolkit/revdep_rebuild/rebuild.py b/pym/gentoolkit/revdep_rebuild/rebuild.py |
231 |
index cfceacc..a943902 100644 |
232 |
--- a/pym/gentoolkit/revdep_rebuild/rebuild.py |
233 |
+++ b/pym/gentoolkit/revdep_rebuild/rebuild.py |
234 |
@@ -240,5 +240,5 @@ def main(settings=None, logger=None): |
235 |
|
236 |
|
237 |
if __name__ == '__main__': |
238 |
- main(rebuild.parse_options()) |
239 |
+ main(parse_options()) |