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
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)::])