summaryrefslogtreecommitdiff
path: root/pkgconfig.py
diff options
context:
space:
mode:
authorDavid M. Lee <dlee@digium.com>2013-01-07 14:24:28 -0600
committerDavid M. Lee <dlee@digium.com>2013-01-07 14:24:28 -0600
commitf3ab456a17af1c89a6e3be4d20c5944853df1cb0 (patch)
treed00e1a332cd038a6d906a1ea0ac91e1a4458e617 /pkgconfig.py
Import pjproject-2.0.1
Diffstat (limited to 'pkgconfig.py')
-rw-r--r--pkgconfig.py171
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)
+