#!/usr/bin/python # Wrapper for pkg-config that keeps track of the packages that were requested. import garstowlib.config import garstowlib.packages import sys, os, re def find_pc(p): for dir in os.getenv("PKG_CONFIG_PATH").split(":"): if dir != "": dir += "/" fn = dir + p + ".pc" try: os.stat(fn) return fn except OSError: pass return None tty = open("/dev/tty", "w") logname = os.getenv("FAKE_PKG_CONFIG_LOG") if logname is None: tty.write("(fpc error: $FAKE_PKG_CONFIG_LOG not set)") sys.exit(1) packages = {} try: f = open(logname) for l in f.readlines(): packages[l.strip()] = 1 f.close() except IOError: pass if sys.argv[1] == "--fpc-dump" or sys.argv[1] == "--fpc-check": ps = packages.keys() ps.sort() used_pkgs = {} unknown_pcs = [] pns = garstowlib.packages.get_package_names() for p in ps: pc = find_pc(p) if pc is None: unknown_pcs.append(p) else: pc = os.readlink(pc) pc = re.sub(r'.*/packages/([^/]+)/.*', r'\1', pc) used_pkgs[pc] = pns.get(pc, "unknown:" + pc) used_pkgs_full = used_pkgs.values() used_pkgs_full.sort() unknown_pcs.sort() if sys.argv[1] == "--fpc-dump": print "Needs pkg-config packages: %s" % " ".join(ps) print "Needs existing GARStow packages: %s" % " ".join(used_pkgs_full) print "Unknown pkg-config packages: %s" % " ".join(unknown_pcs) else: rc = 0 packagename = sys.argv[2] this_port = garstowlib.packages.get_portfile(packagename) my_deps = set(garstowlib.packages.get_dependencies(packagename)) ignore_deps = set(this_port.variable("IGNORE_PKGCONFIG_DEPS").split()) missing = [(dep, garstowlib.config.select_dep_type(dep)) for dep in set(used_pkgs.keys()) - my_deps - ignore_deps] full_pn = pns[packagename] if missing != []: ps = {} for (dep, var) in missing: ps.setdefault(var, []).append(dep) portfile = garstowlib.packages.get_portfile(packagename) for (var, deps) in ps.items(): print "Missing dependencies from %s: %s" % (full_pn, " ".join([used_pkgs[d] for d in deps])) rc = 1 if unknown_pcs != []: print "Unknown dependencies in %s: %s" % (full_pn, " ".join(unknown_pcs)) sys.exit(rc) else: args = " ".join(sys.argv[1:]).split() while args != []: arg = args.pop(0) if arg[-1] == ",": arg = arg[:-1] if arg in (">=", "<=", ">", "<", "=", "!=", "--variable", "--atleast-pkgconfig-version", "--atleast-version", "--exact-version", "--max-version", "--define-variable"): args.pop(0) elif arg[0] == "-": continue else: tty.write("(fpc: " + arg + ")") packages[arg] = 1 f = open(logname, "w") for p in packages.keys(): print >>f, p f.close() tty.close() os.execvp("pkg-config", ["pkg-config"] + sys.argv[1:]) sys.exit(20)