From b27e0166c499a1e0dbad3eb6c76ba5077e1f7e14 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Sat, 31 Dec 2016 14:10:18 +0000 Subject: [PATCH] projects.py: Add cmd_required_pkg() Signed-off-by: Jan Lindemann --- scripts/projects.py | 48 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/scripts/projects.py b/scripts/projects.py index 6f42a15a..a595b6db 100644 --- a/scripts/projects.py +++ b/scripts/projects.py @@ -4,11 +4,14 @@ from __future__ import print_function import sys import argparse from sets import Set +from os.path import isfile from os.path import isdir from os.path import expanduser from os.path import basename from os.path import realpath +import subprocess import re +import platform # meaning of pkg.required.xxx variables # build: needs to be built and installed before this can be built @@ -33,11 +36,18 @@ def re_section(name): '(?=[)', re.DOTALL) -def get_os(): +def remove_duplicates(seq): + seen = set() + seen_add = seen.add + return [x for x in seq if not (x in seen or seen_add(x))] + +def get_os(args = ""): for d in [ projs_root + 'ytools/devutil/scripts', '/opt/ytools/bin' ]: - script=d + '/get_os.sh' - if os.path.isfile(script): + script = d + '/get_os.sh' + if isfile(script): cmd = '/bin/bash ' + script + if args: + cmd = cmd + ' ' + args p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) (out, rr) = p.communicate() if rr: @@ -57,9 +67,9 @@ def htdocs_dir(name): def pkg_required_os_cascade(): os = get_os() - # TODO: implement this - #return [ 'os', 'os.linux', 'os.linux.suse', 'os.linux.suse.tumbleweed' ] ? - return [ 'os', 'linux', 'suse', 'suse-tumbleweed' ] + name = re.sub('-.*', '', os) + # e.g. os, linux, suse, suse-tumbleweed + return [ 'os', platform.system().lower(), name, os ] def strip_module_from_spec(mod): return re.sub(r'-devel$|-run$', '', re.split('([=><]+)', mod)[0].strip()) @@ -131,6 +141,14 @@ def get_value(name, section, key): #print('path = ', path, 'top_name = ', top_name, 'name = ', name) return read_value(path, section, key) +def collect_values(names, section, key): + r = "" + for n in names: + val = get_value(n, section, key) + if val: + r = r + " " + val + return remove_duplicates([x.strip() for x in r.split(",")]) + # scope 0: no children # scope 1: children # scope 2: recursive @@ -240,6 +258,24 @@ def cmd_test(args_): args=parser.parse_args(args_) print("blah = " + args.blah) +def cmd_required_pkg(args_): + parser = argparse.ArgumentParser(description='required-pkg') + parser.add_argument('module', nargs='*', help='Modules') + args=parser.parse_args(args_) + deps = get_modules_from_project_txt(args.module, 'pkg.required.jw', [ 'build' ], + scope = 2, add_self=True, names_only=True) + subsecs = pkg_required_os_cascade() + required = [] + for s in subsecs: + vals = collect_values(deps, 'pkg.required.' + s, 'build') + if vals: + required = required + vals + # TODO: add all not in build tree as -devel + r = '' + for m in required: + r = r + ' ' + m + print(r[1:]) + def cmd_ldlibpath(args_): parser = argparse.ArgumentParser(description='ldlibpath') parser.add_argument('module', nargs='*', help='Modules')