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 <jan@janware.com>
This commit is contained in:
Jan Lindemann 2016-01-29 16:29:43 +00:00
commit c009df6d62

View file

@ -1,5 +1,6 @@
#!/usr/bin/python -u #!/usr/bin/python -u
from __future__ import print_function
import sys import sys
import argparse import argparse
from sets import Set from sets import Set
@ -13,8 +14,11 @@ def re_section(name):
'.*?' '.*?'
'(?=[)', '(?=[)',
re.DOTALL) re.DOTALL)
# --------------------------------------------------------------------- helpers # --------------------------------------------------------------------- helpers
def warning(*objs):
print("WARNING: ", *objs, file=sys.stderr)
def proj_dir(name): def proj_dir(name):
return projs_root + '/' + name return projs_root + '/' + name
@ -37,8 +41,40 @@ def get_section(path, section):
file.close() file.close()
return r.rstrip() 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): 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 proj_root = topdir
else: else:
proj_root = projs_root + '/' + name proj_root = projs_root + '/' + name
@ -49,38 +85,9 @@ def get_value(name, section, key):
file.close() file.close()
return r return r
r = () path = proj_root + '/make/project.conf'
for conf in [ '/make/project.conf', '/doc/share/project.txt' ]: #print('path = ', path, 'top_name = ', top_name, 'name = ', name)
path = proj_root + conf return read_value(path, section, key)
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
# scope 0: no children # scope 0: no children
# scope 1: children # scope 1: children
@ -93,10 +100,11 @@ def add_modules_from_project_txt(buf, visited, spec, section, key, add_self, sco
spec = name spec = name
if spec in buf: if spec in buf:
return return
if spec in visited: #if spec in visited:
return # return
visited.add(spec) visited.add(spec)
deps = get_value(name, section, key) 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 deps and scope > 0:
if scope == 1: if scope == 1:
subscope = 0 subscope = 0
@ -130,8 +138,10 @@ def get_libname(names):
return ' '.join(reversed(vals)) return ' '.join(reversed(vals))
def get_ldflags(names): def get_ldflags(names):
#print(names)
deps = get_modules_from_project_txt(names, 'pkg.required', 'build', 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 = '' r = ''
for m in reversed(deps): for m in reversed(deps):
libname = get_libname([m]) libname = get_libname([m])
@ -147,7 +157,7 @@ def cmd_test(args_):
parser = argparse.ArgumentParser(description='Test') parser = argparse.ArgumentParser(description='Test')
parser.add_argument('blah', default='', help='The blah argument') parser.add_argument('blah', default='', help='The blah argument')
args=parser.parse_args(args_) args=parser.parse_args(args_)
print "blah = " + args.blah print("blah = " + args.blah)
def cmd_ldlibpath(args_): def cmd_ldlibpath(args_):
parser = argparse.ArgumentParser(description='ldlibpath') parser = argparse.ArgumentParser(description='ldlibpath')
@ -158,19 +168,19 @@ def cmd_ldlibpath(args_):
r = '' r = ''
for m in deps: for m in deps:
r = r + ':' + proj_dir(m) + '/lib' r = r + ':' + proj_dir(m) + '/lib'
print r[1:] print(r[1:])
def cmd_libname(args_): def cmd_libname(args_):
parser = argparse.ArgumentParser(description='libname') parser = argparse.ArgumentParser(description='libname')
parser.add_argument('module', nargs='*', help='Modules') parser.add_argument('module', nargs='*', help='Modules')
args=parser.parse_args(args_) args=parser.parse_args(args_)
print get_libname(args.module) print(get_libname(args.module))
def cmd_ldflags(args_): def cmd_ldflags(args_):
parser = argparse.ArgumentParser(description='ldlibpath') parser = argparse.ArgumentParser(description='ldlibpath')
parser.add_argument('module', nargs='*', help='Modules') parser.add_argument('module', nargs='*', help='Modules')
args=parser.parse_args(args_) args=parser.parse_args(args_)
print get_ldflags(args.module) print(get_ldflags(args.module))
def cmd_cflags(args_): def cmd_cflags(args_):
parser = argparse.ArgumentParser(description='ldlibpath') parser = argparse.ArgumentParser(description='ldlibpath')
@ -181,7 +191,7 @@ def cmd_cflags(args_):
r = '' r = ''
for m in reversed(deps): for m in reversed(deps):
r = r + ' -I' + proj_dir(m) + '/include' r = r + ' -I' + proj_dir(m) + '/include'
print r[1:] print(r[1:])
def cmd_path(args_): def cmd_path(args_):
parser = argparse.ArgumentParser(description='path') parser = argparse.ArgumentParser(description='path')
@ -192,7 +202,7 @@ def cmd_path(args_):
r = '' r = ''
for m in deps: for m in deps:
r = r + ':' + proj_dir(m) + '/bin' r = r + ':' + proj_dir(m) + '/bin'
print r[1:] print(r[1:])
def cmd_pkg_requires(args_): def cmd_pkg_requires(args_):
parser = argparse.ArgumentParser(description='pkg-requires') parser = argparse.ArgumentParser(description='pkg-requires')
@ -201,7 +211,10 @@ def cmd_pkg_requires(args_):
args=parser.parse_args(args_) args=parser.parse_args(args_)
r = [] r = []
for m in args.module: 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: for spec in deps:
dep = re.split('([=><]+)', spec) dep = re.split('([=><]+)', spec)
for i, item in enumerate(dep): for i, item in enumerate(dep):
@ -216,7 +229,7 @@ def cmd_pkg_requires(args_):
else: else:
raise Exception("Unknown version specifier in " + spec) raise Exception("Unknown version specifier in " + spec)
r.append(' '.join(dep)) r.append(' '.join(dep))
print ', '.join(r) print(', '.join(r))
def cmd_proj_dir(args_): def cmd_proj_dir(args_):
parser = argparse.ArgumentParser(description='proj-dir') parser = argparse.ArgumentParser(description='proj-dir')
@ -225,10 +238,11 @@ def cmd_proj_dir(args_):
r = [] r = []
for m in args.module: for m in args.module:
r.append(proj_dir(m)) r.append(proj_dir(m))
print ' '.join(r) print(' '.join(r))
# -------------------------------------------------------------------- here we go # -------------------------------------------------------------------- here we go
warning("running ", ' '.join(sys.argv))
global_args = [] global_args = []
skip = 0 skip = 0
for a in sys.argv[1::]: 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') parser.add_argument('arg', nargs='*', help='Command arguments')
args=parser.parse_args(global_args) args=parser.parse_args(global_args)
projs_root = args.prefix 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 = getattr(sys.modules[__name__], 'cmd_' + args.cmd.replace('-', '_'))
cmd(sys.argv[(len(global_args) + 1)::]) cmd(sys.argv[(len(global_args) + 1)::])