diff options
author | David M. Lee <dlee@digium.com> | 2013-01-07 14:24:28 -0600 |
---|---|---|
committer | David M. Lee <dlee@digium.com> | 2013-01-07 14:24:28 -0600 |
commit | f3ab456a17af1c89a6e3be4d20c5944853df1cb0 (patch) | |
tree | d00e1a332cd038a6d906a1ea0ac91e1a4458e617 /pkgconfig.py |
Import pjproject-2.0.1
Diffstat (limited to 'pkgconfig.py')
-rw-r--r-- | pkgconfig.py | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/pkgconfig.py b/pkgconfig.py new file mode 100644 index 0000000..496e311 --- /dev/null +++ b/pkgconfig.py @@ -0,0 +1,171 @@ +import sys +import os + +REMOVE_THESE = ["-I/usr/include", "-I/usr/include/", "-L/usr/lib", "-L/usr/lib/"] + +class Pkg: + def __init__(self, pkg_name): + self.name = pkg_name + self.priority = 0 + self.vars = {} + + def parse(self, pkg_config_path): + f = None + for pkg_path in pkg_config_path.split(':'): + if pkg_path[-1] != '/': + pkg_path += '/' + fname = pkg_path + self.name + '.pc' + try: + f = open(fname, "r") + break + except: + continue + if not f: + #sys.stderr.write("pkgconfig.py: unable to find %s.pc in %s\n" % (self.name, pkg_config_path)) + return False + + for line in f.readlines(): + line = line.strip() + if not line: + continue + if line[0]=='#': + continue + pos1 = line.find('=') + pos2 = line.find(':') + if pos1 > 0 and (pos1 < pos2 or pos2 < 0): + pos = pos1 + elif pos2 > 0 and (pos2 < pos1 or pos1 < 0): + pos = pos2 + else: + continue + name = line[:pos].lower() + value = line[pos+1:] + self.vars[name] = value + f.close() + + for name in self.vars.keys(): + value = self.vars[name] + while True: + pos1 = value.find("${") + if pos1 < 0: + break + pos2 = value.find("}") + if pos2 < 0: + break + value = value.replace(value[pos1:pos2+1], self.vars[value[pos1+2:pos2]]) + self.vars[name] = value + return True + + def requires(self): + if not 'requires' in self.vars: + return [] + deps = [] + req_list = self.vars['requires'] + for req_item in req_list.split(','): + req_item = req_item.strip() + for i in range(len(req_item)): + if "=<>".find(req_item[i]) >= 0: + deps.append(req_item[:i].strip()) + break + return deps + + def libs(self): + if not 'libs' in self.vars: + return [] + return self.vars['libs'].split(' ') + + def cflags(self): + if not 'cflags' in self.vars: + return [] + return self.vars['cflags'].split(' ') + + +def calculate_pkg_priority(pkg, pkg_dict, loop_cnt): + if loop_cnt > 10: + sys.stderr.write("Circular dependency with pkg %s\n" % (pkg)) + return 0 + reqs = pkg.requires() + prio = 1 + for req in reqs: + if not req in pkg_dict: + continue + req_pkg = pkg_dict[req] + prio += calculate_pkg_priority(req_pkg, pkg_dict, loop_cnt+1) + return prio + +if __name__ == "__main__": + pkg_names = [] + pkg_dict = {} + commands = [] + exist_check = False + + for i in range(1,len(sys.argv)): + if sys.argv[i][0] == '-': + cmd = sys.argv[i] + commands.append(cmd) + if cmd=='--exists': + exist_check = True + elif cmd=="--help": + print "This is not very helpful, is it" + sys.exit(0) + elif cmd=="--version": + print "0.1" + sys.exit(0) + else: + pkg_names.append(sys.argv[i]) + + # Fix search path + PKG_CONFIG_PATH = os.getenv("PKG_CONFIG_PATH", "").strip() + if not PKG_CONFIG_PATH: + PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/lib/pkgconfig" + PKG_CONFIG_PATH = PKG_CONFIG_PATH.replace(";", ":") + + # Parse files + for pkg_name in pkg_names: + pkg = Pkg(pkg_name) + if not pkg.parse(PKG_CONFIG_PATH): + sys.exit(1) + pkg_dict[pkg_name] = pkg + + if exist_check: + sys.exit(0) + + # Calculate priority based on dependency + for pkg_name in pkg_dict.keys(): + pkg = pkg_dict[pkg_name] + pkg.priority = calculate_pkg_priority(pkg, pkg_dict, 1) + + # Sort package based on dependency + pkg_names = sorted(pkg_names, key=lambda pkg_name: pkg_dict[pkg_name].priority, reverse=True) + + # Get the options + opts = [] + for cmd in commands: + if cmd=='--libs': + for pkg_name in pkg_names: + libs = pkg_dict[pkg_name].libs() + for lib in libs: + opts.append(lib) + if lib[:2]=="-l": + break + for pkg_name in pkg_names: + opts += pkg_dict[pkg_name].libs() + elif cmd=='--cflags': + for pkg_name in pkg_names: + opts += pkg_dict[pkg_name].cflags() + elif cmd[0]=='-': + sys.stderr.write("pkgconfig.py: I don't know how to handle " + sys.argv[i] + "\n") + + filtered_opts = [] + for opt in opts: + opt = opt.strip() + if not opt: + continue + if REMOVE_THESE.count(opt) != 0: + continue + if filtered_opts.count(opt) != 0: + continue + filtered_opts.append(opt) + + print ' '.join(filtered_opts) + |