89 lines
3.2 KiB
Python
Executable file
89 lines
3.2 KiB
Python
Executable file
#!/usr/bin/python3
|
|
|
|
import argparse
|
|
from contextlib import ExitStack
|
|
import logging
|
|
import sys
|
|
from typing import Dict, List
|
|
|
|
from ognibuild.buildsystem import NoBuildToolsFound, detect_buildsystems
|
|
from ognibuild.requirements import Requirement
|
|
from ognibuild.resolver.apt import AptResolver
|
|
from ognibuild.session.plain import PlainSession
|
|
|
|
parser = argparse.ArgumentParser('report-apt-deps-status')
|
|
parser.add_argument('directory', type=str, default='.', nargs='?')
|
|
parser.add_argument(
|
|
'--detailed', action='store_true', help='Show detailed analysis')
|
|
args = parser.parse_args()
|
|
|
|
logging.basicConfig(format='%(message)s', level=logging.INFO)
|
|
|
|
session = PlainSession()
|
|
with ExitStack() as es:
|
|
es.enter_context(session)
|
|
session.chdir(args.directory)
|
|
resolver = AptResolver.from_session(session)
|
|
|
|
try:
|
|
bss = list(detect_buildsystems(args.directory))
|
|
except NoBuildToolsFound:
|
|
logging.fatal('No build tools found')
|
|
sys.exit(1)
|
|
logging.debug("Detected buildsystems: %s", ", ".join(map(str, bss)))
|
|
deps: Dict[str, List[Requirement]] = {}
|
|
for buildsystem in bss:
|
|
try:
|
|
declared_reqs = buildsystem.get_declared_dependencies(session, [])
|
|
for stage, req in declared_reqs:
|
|
deps.setdefault(stage, []).append(req)
|
|
except NotImplementedError:
|
|
logging.warning(
|
|
'Unable to get dependencies from buildsystem %r, skipping',
|
|
buildsystem)
|
|
continue
|
|
|
|
if args.detailed:
|
|
for stage, reqs in deps.items():
|
|
logging.info("Stage: %s", stage)
|
|
for req in reqs:
|
|
apt_req = resolver.resolve(req)
|
|
logging.info("%s: %s", req, apt_req.pkg_relation_str())
|
|
logging.info('')
|
|
else:
|
|
build_depends = []
|
|
test_depends = []
|
|
run_depends = []
|
|
unresolved = []
|
|
for stage, reqs in deps.items():
|
|
for req in reqs:
|
|
apt_req = resolver.resolve(req)
|
|
if apt_req is None:
|
|
unresolved.append(req)
|
|
elif stage == 'core':
|
|
build_depends.append(apt_req)
|
|
run_depends.append(apt_req)
|
|
elif stage == 'build':
|
|
build_depends.append(apt_req)
|
|
elif stage == 'test':
|
|
test_depends.append(apt_req)
|
|
else:
|
|
raise NotImplementedError('stage %s not supported' % stage)
|
|
if build_depends:
|
|
logging.info(
|
|
'Build-Depends: %s',
|
|
', '.join([d.pkg_relation_str() for d in build_depends]))
|
|
if test_depends:
|
|
logging.info(
|
|
'Test-Depends: %s',
|
|
', '.join([d.pkg_relation_str() for d in test_depends]))
|
|
if run_depends:
|
|
logging.info(
|
|
'Depends: %s',
|
|
', '.join([d.pkg_relation_str() for d in run_depends]))
|
|
if unresolved:
|
|
sys.stdout.write('\n')
|
|
logging.warning(
|
|
'Unable to find apt packages for the following dependencies:')
|
|
for req in unresolved:
|
|
logging.warning('* %s', req)
|