From c009df6d6240f928c6f4905dc15a973304b14aed Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Fri, 29 Jan 2016 16:29:43 +0000 Subject: [PATCH] projects.py: Fix ldflags, dependencies - Don't include self in ldflags anymore - Disable endless loop detection, because it skip dependencies - Add function warning() Signed-off-by: Jan Lindemann --- scripts/projects.py | 113 ++++++++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 47 deletions(-) diff --git a/scripts/projects.py b/scripts/projects.py index 557709d1..6830884e 100644 --- a/scripts/projects.py +++ b/scripts/projects.py @@ -1,5 +1,6 @@ #!/usr/bin/python -u +from __future__ import print_function import sys import argparse from sets import Set @@ -13,8 +14,11 @@ def re_section(name): '.*?' '(?=[)', re.DOTALL) - # --------------------------------------------------------------------- helpers + +def warning(*objs): + print("WARNING: ", *objs, file=sys.stderr) + def proj_dir(name): return projs_root + '/' + name @@ -37,8 +41,40 @@ def get_section(path, section): file.close() return r.rstrip() +def read_value(path, section, key): + warning("opening ", path) + try: + file = open(path) + except: + return None + r = () + if not len(section): + for line in file: + r = re.findall('^ *' + key + ' *= *(.*)', line) + if (len(r) > 0): + break + else: + in_section = False + pat = '[' + section + ']' + for line in file: + if (line.rstrip() == pat): + in_section = True + continue + if in_section: + if len(line) and line[0] == '[': + break + r = re.findall('^ *' + key + ' *= *(.*)', line) + if (len(r) > 0): + break + file.close() + + if len(r): + return r[0] + return None + def get_value(name, section, key): - if topdir and name == basename(realpath(topdir)): + #print("top_name = ", top_name) + if top_name and name == top_name: proj_root = topdir else: proj_root = projs_root + '/' + name @@ -49,38 +85,9 @@ def get_value(name, section, key): file.close() return r - r = () - for conf in [ '/make/project.conf', '/doc/share/project.txt' ]: - path = proj_root + conf - try: - file = open(path) - except: - continue - if not len(section): - for line in file: - r = re.findall('^ *' + key + ' *= *(.*)', line) - if (len(r) > 0): - break - else: - in_section = False - pat = '[' + section + ']' - for line in file: - if (line.rstrip() == pat): - in_section = True - continue - if in_section: - if len(line) and line[0] == '[': - break - r = re.findall('^ *' + key + ' *= *(.*)', line) - if (len(r) > 0): - break - file.close() - - if len(r): - return r[0] - return '' - - return None + path = proj_root + '/make/project.conf' + #print('path = ', path, 'top_name = ', top_name, 'name = ', name) + return read_value(path, section, key) # scope 0: no children # scope 1: children @@ -93,10 +100,11 @@ def add_modules_from_project_txt(buf, visited, spec, section, key, add_self, sco spec = name if spec in buf: return - if spec in visited: - return + #if spec in visited: + # return visited.add(spec) deps = get_value(name, section, key) + warning("name = ", name, "section = ", section, "key = ", key, "deps = ", deps, "scope = ", scope, "visited = ", visited) if deps and scope > 0: if scope == 1: subscope = 0 @@ -130,8 +138,10 @@ def get_libname(names): return ' '.join(reversed(vals)) def get_ldflags(names): + #print(names) deps = get_modules_from_project_txt(names, 'pkg.required', 'build', - scope = 1, add_self=True, names_only=True) + scope = 1, add_self=False, names_only=True) + #print(deps) r = '' for m in reversed(deps): libname = get_libname([m]) @@ -147,7 +157,7 @@ def cmd_test(args_): parser = argparse.ArgumentParser(description='Test') parser.add_argument('blah', default='', help='The blah argument') args=parser.parse_args(args_) - print "blah = " + args.blah + print("blah = " + args.blah) def cmd_ldlibpath(args_): parser = argparse.ArgumentParser(description='ldlibpath') @@ -158,19 +168,19 @@ def cmd_ldlibpath(args_): r = '' for m in deps: r = r + ':' + proj_dir(m) + '/lib' - print r[1:] + print(r[1:]) def cmd_libname(args_): parser = argparse.ArgumentParser(description='libname') parser.add_argument('module', nargs='*', help='Modules') args=parser.parse_args(args_) - print get_libname(args.module) + print(get_libname(args.module)) def cmd_ldflags(args_): parser = argparse.ArgumentParser(description='ldlibpath') parser.add_argument('module', nargs='*', help='Modules') args=parser.parse_args(args_) - print get_ldflags(args.module) + print(get_ldflags(args.module)) def cmd_cflags(args_): parser = argparse.ArgumentParser(description='ldlibpath') @@ -181,7 +191,7 @@ def cmd_cflags(args_): r = '' for m in reversed(deps): r = r + ' -I' + proj_dir(m) + '/include' - print r[1:] + print(r[1:]) def cmd_path(args_): parser = argparse.ArgumentParser(description='path') @@ -192,7 +202,7 @@ def cmd_path(args_): r = '' for m in deps: r = r + ':' + proj_dir(m) + '/bin' - print r[1:] + print(r[1:]) def cmd_pkg_requires(args_): parser = argparse.ArgumentParser(description='pkg-requires') @@ -201,7 +211,10 @@ def cmd_pkg_requires(args_): args=parser.parse_args(args_) r = [] for m in args.module: - deps = get_value(m, 'pkg.required', args.flavour).split(',') + value = get_value(m, 'pkg.required', args.flavour) + if not value: + continue + deps = value.split(',') for spec in deps: dep = re.split('([=><]+)', spec) for i, item in enumerate(dep): @@ -216,7 +229,7 @@ def cmd_pkg_requires(args_): else: raise Exception("Unknown version specifier in " + spec) r.append(' '.join(dep)) - print ', '.join(r) + print(', '.join(r)) def cmd_proj_dir(args_): parser = argparse.ArgumentParser(description='proj-dir') @@ -225,10 +238,11 @@ def cmd_proj_dir(args_): r = [] for m in args.module: r.append(proj_dir(m)) - print ' '.join(r) + print(' '.join(r)) # -------------------------------------------------------------------- here we go +warning("running ", ' '.join(sys.argv)) global_args = [] skip = 0 for a in sys.argv[1::]: @@ -250,7 +264,12 @@ parser.add_argument('--prefix', '-p', nargs='?', default = expanduser("~") + parser.add_argument('arg', nargs='*', help='Command arguments') args=parser.parse_args(global_args) projs_root = args.prefix -topdir = args.topdir +if args.topdir: + topdir = args.topdir + top_name = read_value(topdir + '/make/project.conf', 'build', 'name') + if not top_name: + top_name = re.sub('-[0-9.-]*$', '', basename(realpath(topdir))) + cmd = getattr(sys.modules[__name__], 'cmd_' + args.cmd.replace('-', '_')) cmd(sys.argv[(len(global_args) + 1)::])