aboutsummarylogtreecommitdiffstats
path: root/build_depends.py
diff options
context:
space:
mode:
Diffstat (limited to 'build_depends.py')
-rwxr-xr-xbuild_depends.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/build_depends.py b/build_depends.py
new file mode 100755
index 000000000000..dd187493758b
--- /dev/null
+++ b/build_depends.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+
+import logging
+import subprocess
+import sys
+from pathlib import Path
+from collections import defaultdict
+
+from camisole.languages import Lang, load_builtins
+
+load_builtins()
+
+
+def by_name(name):
+ return Lang._full_registry[name]
+
+
+OVERWRITE = {
+ # java packages consist of symlinks to handle both Java 7 & 8, so we force
+ # the version (8) here
+ by_name('java'): {'/usr/lib/jvm/java-8-openjdk/bin/java',
+ '/usr/lib/jvm/java-8-openjdk/bin/javac'},
+ # go is provided by both 'go' and 'gcc-go'
+ by_name('go'): {'/usr/lib/go/bin/go'},
+}
+
+
+def list_paths():
+ for lang in Lang._full_registry:
+ cls = by_name(lang)
+ if cls in OVERWRITE:
+ for path in OVERWRITE[cls]:
+ yield cls, Path(path)
+ continue
+ for p in cls.required_binaries():
+ yield cls, Path(p.cmd)
+
+
+def get_package(binary):
+ try:
+ pkg = (subprocess.check_output(['pkgfile', '-qb', binary])
+ .decode().split('\n')[0]) or None
+ return pkg
+ except subprocess.CalledProcessError:
+ return None
+
+
+if __name__ == '__main__':
+ packages = defaultdict(set)
+ for lang, binary in list_paths():
+ pkg = get_package(binary)
+ if pkg is None:
+ logging.error("no package for %s", binary)
+ continue
+ packages[pkg].add(lang)
+ packages.pop('python', None) # already a strong dependency
+ packages = sorted(packages.items())
+ lines = ["{:<20} # handle {} sources".format(
+ "'{}'{}".format(pkg, ')' if i == len(packages) - 1 else ''),
+ ', '.join(sorted(lang.name for lang in langs)))
+ for i, (pkg, langs) in enumerate(packages)]
+ prefix = 'depends=('
+ print('{}{}'.format(prefix, lines[0]))
+ print('\n'.join(' ' * len(prefix) + line for line in lines[1:]))