xref: /dragonfly/tools/tools/chkmoddeps/chkdeps.rb (revision 2b3f93ea)
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