#!/usr/bin/env python
import pisi.api
import commands
import sys
import os
blacklist = ('/lib/linux-gate.','/lib/libm.', '/lib/ld-linux.', '/lib/libc.', '/lib/librt.', 'linux-gate.so.1', '/lib/libpthread.', '/lib/libdl.')
def package_for_file (filename):
return pisi.api.search_file (filename)
def blacklisted (filename):
if not filename.startswith("/"):
filename = "/%s" % filename
for f in blacklist:
if f in filename:
return True
return False
def ldd (filename):
if "usr/share" in filename:
return
ldd = commands.getoutput ("ldd %s" % filename)
for line in ldd.split ("\n"):
line = line.replace("\n","").replace("\r","").strip()
if line == "":
continue
splits = line.split ("=>")
sourceLib = splits[0].strip()
if len(splits) > 1:
sourceLib = splits[1].strip().split (" ")[0]
else:
sourceLib = sourceLib.split (" ")[0].strip()
# Skip blacklisted
if blacklisted (sourceLib):
continue
if os.path.exists (sourceLib):
dep = package_for_file (sourceLib)
if len(dep) > 0:
# Circular dependencies are ugly :p
if dep[0][0] == sys.argv[1]:
break
# Check its not accounted for
if not dep[0][0] in dependsOn:
dependsOn[ dep[0][0] ] = "/%s" % dep [0][1][0]
if __name__ == "__main__":
if len(sys.argv) != 2:
print "Usage: %s package_name" % sys.argv[0]
sys.exit (1)
pkg = sys.argv[1]
try:
meta,files,other = pisi.api.info_name (pkg, True)
except:
print "Could not find package: %s" % pkg
sys.exit (1)
dependsOn = dict()
for file in files.list:
filename = file.path
if not filename.startswith("/"):
filename = "/%s" % filename
if hasattr(file, 'type'):
if file.type == "executable":
ldd (filename)
elif file.type == "library" and ".so" in filename:
ldd (filename)
else:
if ".so" in filename:
ldd (filename)
print "[ Dependencies ]"
for dep in dependsOn:
print "Depends on %s from %s" % (dependsOn[dep], dep)
print "\n[ XML Dependencies ]"
print ""
for dep in dependsOn:
print " %s" % dep
print ""
# Suggest build dependencies
print "\n[XML Build Dependencies]"
print ""
for dep in dependsOn:
package = "%s-devel" % dep
try:
subject = pisi.api.info_name (package, True)
print " %s" % package
except:
print " " % package
print ""