Merge branch 'vendor/EXPAT'
[dragonfly.git] / tools / tools / chkmoddeps / chkdeps.rb
1 #!/usr/bin/env ruby
2
3 require 'find'
4 require 'open3'
5
6 verbose = false
7
8 pmoddeps = File.join(File.dirname(__FILE__), 'pmoddeps.gdb')
9
10 provides = {}
11 depends = {}
12
13 Find.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
39 end
40
41 kernel = provides.select{|pmn, pd| pmn.start_with?('kernel')}
42
43 depends.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
80 end