Gentoo Archives: gentoo-commits

From: slis <lis.slawek@×××××.com>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoolkit:revdep-rebuild commit in: pym/gentoolkit/revdep_rebuild/
Date: Mon, 30 Sep 2013 05:35:12
Message-Id: 1380519385.6282695a77af21bd60a31d182575c5a12a1a359b.slis@gentoo
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())