diff --git a/branches/devel/scripts/deputils/checkdeps.rb b/branches/devel/scripts/deputils/checkdeps.rb new file mode 100755 index 00000000..65762132 --- /dev/null +++ b/branches/devel/scripts/deputils/checkdeps.rb @@ -0,0 +1,127 @@ +#!/usr/bin/ruby -w + +# Licensed under GPL-2 or later +# Author: Petteri Räty + +$: << File.dirname(__FILE__) +require "pkgutil.rb" + +$verbose = false +$quiet = false + +pkgs_to_check=[] + +def print_help(exit_value) + puts 'Usage: checkdeps.rb opts|pkgs' + puts + puts 'Options:' + puts '-q, --quiet' + puts '-v, --verbose' + puts '-h, --help' + puts '-d, --debug' + puts + puts 'Everything else is passed to qfile as it is' + exit(exit_value) +end + +ARGV.each do | arg | + if arg =~ /^(-v|--verbose)$/ + $verbose = true + elsif arg =~ /^(-h|--help)$/ + print_help(0) + elsif arg =~ /^(-q|--quiet)$/ + $quiet = true + elsif arg =~ /^(-d|--debug)$/ + $DEBUG = true + $verbose = true + else + pkgs_to_check << arg + end +end + +pkgs_to_check.length == 0 && print_help(1) + +class ElfObj + attr_reader :path, :pkgs + + def initialize(path) + @path = path + @pkgs = [] + end + + def <<(pkg) + if ! @pkgs.index(pkg) + @pkgs << pkg + else + nil + end + end + + def <=>(r) + return @path <=> r.path + end + + def to_s() + puts 'ElfObj to_s:' if $DEBUG + s = "\t" + @path + s+="\t" + @path + "\n\t\t" + @pkgs.sort.join("\n\t\t") if $DEBUG + s + end +end + + +def handle_new_lib(obj,lib) + puts 'library: ' + lib if $DEBUG + $lib_hash[lib]=nil + pkg = get_pkg_of_lib(lib) + + if ! pkg + return + end + + if obj_table = $pkg_hash[pkg] + obj_table << obj + else + $pkg_hash[pkg]=[obj] + obj << pkg + end +end + +$lib_hash ={} +$pkg_hash ={} + +qlist = IO.popen("qlist #{pkgs_to_check.join(' ')}") + +scan_elf = ScanElf.instance + +while obj = qlist.gets + obj.rstrip! + if is_elf(obj) + puts 'obj: ' + obj if $DEBUG + elf_obj = ElfObj.new(obj) + scan_elf.each(obj) do | lib | + handle_new_lib(elf_obj,lib) unless $lib_hash.key?(lib) + end + else + puts "#{file} is not executable or a normal file" if $verbose + end +end + +qlist.close + +if $? != 0 + $stderr.puts('qlist did not run succesfully.') + $stderr.puts('Please emerge portage-utils if you don\'t already have it.') +end + +$pkg_hash.sort.each do | pair | + puts 'Key: ' if $DEBUG + puts pair[0] + puts 'Value: ' if $DEBUG + puts pair[1].uniq.sort unless $quiet + puts 'end Hash.' if $DEBUG +end + +if $verbose + puts $lib_hash.keys +end diff --git a/branches/devel/scripts/deputils/oneelf.rb b/branches/devel/scripts/deputils/oneelf.rb new file mode 100755 index 00000000..ac0c419e --- /dev/null +++ b/branches/devel/scripts/deputils/oneelf.rb @@ -0,0 +1,19 @@ +#!/usr/bin/ruby -w + +# Licensed under GPL-2 or later +# Author: Petteri Räty + +$: << File.dirname(__FILE__) +require "pkgutil.rb" + +elf = ARGV[0] + +if ! elf || ! is_elf(elf) + $stderr.puts 'This program takes one arguments that should be an elf file.' + exit 1 +end + +run_scanelf(elf) do | lib | + puts lib + puts "\t" + get_pkg_of_lib(lib) +end \ No newline at end of file diff --git a/branches/devel/scripts/deputils/pkgutil.rb b/branches/devel/scripts/deputils/pkgutil.rb new file mode 100755 index 00000000..12f03857 --- /dev/null +++ b/branches/devel/scripts/deputils/pkgutil.rb @@ -0,0 +1,60 @@ +# Licensed under GPL-2 or later +# Author: Petteri Räty + +MAGIC="\x7FELF" +def is_elf(file) + File.executable?(file) && File.file?(file) && File.read(file, 4) == MAGIC +end + +def get_pkg_of_lib(lib) + command='qfile -qC ' + lib + output = `#{command}`.split("\n") + output.uniq! + output.join(' || ') +end + +def handle_extra_output(prog) + $stderr.puts 'This program expects only one line' + $stderr.puts 'of output from scanelf. Extra lines:' + while line = scanelf.gets + $stderr.puts line + end + exit 2 +end + +def run_scanelf(elf) + scanelf = IO.popen("scanelf -q -F '%n#F' #{elf}") + first_line = scanelf.gets + handle_extra_output(scanelf) if not scanelf.eof? + scanelf.close + + libs = first_line.split(',') + for lib in libs + yield lib + end +end + +class ScanElf + private_class_method :new + @@instance = nil + + def ScanElf.instance + @@instance = new unless @@instance + @@instance + end + + def initialize + @process = IO.popen('scanelf -q -F "%n#F" -f /dev/stdin','r+') + end + + def each(elf) + @process.puts(elf) + result = @process.gets + + libs = result.split(',') + for lib in libs + yield lib + end + end +end + \ No newline at end of file