1#!/usr/bin/env ruby 2 3require 'find' 4require 'open3' 5 6verbose = false 7 8pmoddeps = File.join(File.dirname(__FILE__), 'pmoddeps.gdb') 9 10provides = {} 11depends = {} 12 13Find.find(*ARGV) do |path| 14 next if not FileTest.file?(path) 15 next if not (path.end_with?('.ko') or ['kernel', 'kernel.debug'].include?(File.basename(path))) 16 17 mv = {} 18 md = {} 19 20 Open3.popen3(pmoddeps + ' ' + path) do |pin, pout, perr| 21 pin.close 22 pout.each do |line| 23 f = line.split 24 case f[0] 25 when 'module' 26 # ignore? 27 when 'version' 28 mv[f[1]] = f[2].to_i 29 when 'depend' 30 md[f[1]] = f[2..-1].map{|e| e.to_i} 31 end 32 end 33 end 34 35 modname = File.basename(path) 36 37 provides[modname] = mv 38 depends[modname] = md 39end 40 41kernel = provides.select{|pmn, pd| pmn.start_with?('kernel')} 42 43depends.each do |modname, md| 44 md.each do |depname, vers| 45 minv, pref, maxv = vers 46 47 chk = proc do |h| 48 not h.select{|pn, pv| pn == depname and pv >= minv and pv <= maxv}.empty? 49 end 50 51 defm = [] 52 # try module itself 53 defm << [modname, provides[modname]] 54 # try kernel 55 defm += kernel 56 # try module depend name 57 defm << [depname + '.ko', provides[depname + '.ko']] 58 59 defm.reject!{|e, v| not v} 60 match = defm.select{|mn, k| chk.call(k)} 61 if not match.empty? 62 puts "#{modname} depend #{depname} found in #{match[0][0]}" if verbose 63 next 64 end 65 66 # else not found in the right place 67 68 match = provides.select do |pmn, pd| 69 chk.call(pd) 70 end 71 72 if match.empty? 73 $stderr.puts "#{modname} depend #{depname} #{minv} #{pref} #{maxv} not found" 74 else 75 match.each do |m| 76 $stderr.puts "#{modname} depend #{depname} found in #{m[0]} instead" 77 end 78 end 79 end 80end 81