build.py: Encapsulate build functionality in class Build

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2018-03-07 10:32:37 +00:00
commit 4fc4fc3c62

View file

@ -51,7 +51,9 @@ def debug(*objs):
if args.debug: if args.debug:
print("DEBUG: ", *objs, file=sys.stderr) print("DEBUG: ", *objs, file=sys.stderr)
def build_find_proj_path(name): class Build(object):
def find_proj_path(self, name):
name=name.replace("dspider-", "") name=name.replace("dspider-", "")
search_path=[".", "dspc/src", "dspc/src/dspcd-plugins", "dspc/src/io" ] search_path=[".", "dspc/src", "dspc/src/dspcd-plugins", "dspc/src/io" ]
for sub in search_path: for sub in search_path:
@ -60,10 +62,10 @@ def build_find_proj_path(name):
return os.path.abspath(path) return os.path.abspath(path)
raise Exception("module " + name + " not found below " + projs_root) raise Exception("module " + name + " not found below " + projs_root)
def build_find_proj_path_cached(name): def find_proj_path_cached(self, name):
return res_cache.run(build_find_proj_path, [ name ]) return res_cache.run(self.find_proj_path, [ name ])
def build_read_deps(cur, prereq_type): def read_deps(self, cur, prereq_type):
# dep cache doesn't make a difference at all # dep cache doesn't make a difference at all
projects_py="/usr/bin/python2 " + my_dir + "/projects.py --prefix " + projs_root + " " + os.getenv('PROJECTS_PY_EXTRA_ARGS', "") projects_py="/usr/bin/python2 " + my_dir + "/projects.py --prefix " + projs_root + " " + os.getenv('PROJECTS_PY_EXTRA_ARGS', "")
if prereq_type in dep_cache: if prereq_type in dep_cache:
@ -91,10 +93,10 @@ def build_read_deps(cur, prereq_type):
dep_cache[prereq_type][cur] = r dep_cache[prereq_type][cur] = r
return r return r
def build_read_deps_cached(cur, prereq_type): def read_deps_cached(self, cur, prereq_type):
return res_cache.run(build_read_deps, [ cur, prereq_type ]) return res_cache.run(self.read_deps, [ cur, prereq_type ])
def build_add_dep_tree(cur, prereq_types, tree, all_deps): def add_dep_tree(self, cur, prereq_types, tree, all_deps):
debug("adding prerequisites " + ' '.join(prereq_types) + " of module " + cur) debug("adding prerequisites " + ' '.join(prereq_types) + " of module " + cur)
if cur in all_deps: if cur in all_deps:
debug('already handled module ' + cur) debug('already handled module ' + cur)
@ -104,17 +106,17 @@ def build_add_dep_tree(cur, prereq_types, tree, all_deps):
all_deps.add(cur) all_deps.add(cur)
for t in prereq_types: for t in prereq_types:
debug("checking prereqisites of type " + t) debug("checking prereqisites of type " + t)
deps.update(build_read_deps_cached(cur, t)) deps.update(self.read_deps_cached(cur, t))
for d in deps: for d in deps:
build_add_dep_tree(d, prereq_types, tree, all_deps) self.add_dep_tree(d, prereq_types, tree, all_deps)
tree[cur] = deps tree[cur] = deps
return len(deps) return len(deps)
def build_calculate_order(order, modules, prereq_types, all_deps): def calculate_order(self, order, modules, prereq_types, all_deps):
dep_tree = {} dep_tree = {}
for m in modules: for m in modules:
debug("--- adding dependency tree of module " + m) debug("--- adding dependency tree of module " + m)
build_add_dep_tree(m, prereq_types, dep_tree, all_deps) self.add_dep_tree(m, prereq_types, dep_tree, all_deps)
while len(all_deps): while len(all_deps):
for d in all_deps: for d in all_deps:
if not len(dep_tree[d]): if not len(dep_tree[d]):
@ -129,10 +131,10 @@ def build_calculate_order(order, modules, prereq_types, all_deps):
dep_tree[k].remove(d) dep_tree[k].remove(d)
return 1 return 1
def build_run_make(module, target, cur_project, num_projects): def run_make(self, module, target, cur_project, num_projects):
#make_cmd = "make " + target + " 2>&1" #make_cmd = "make " + target + " 2>&1"
make_cmd = [ "make", target ] make_cmd = [ "make", target ]
path = build_find_proj_path_cached(module) path = self.find_proj_path_cached(module)
delim_len=120 delim_len=120
delim='---- %d/%d: running %s in %s -' % (cur_project, num_projects, make_cmd, path) delim='---- %d/%d: running %s in %s -' % (cur_project, num_projects, make_cmd, path)
delim = delim + '-' * (delim_len - len(delim)) delim = delim + '-' * (delim_len - len(delim))
@ -149,13 +151,13 @@ def build_run_make(module, target, cur_project, num_projects):
print(make_cmd + ' failed') print(make_cmd + ' failed')
raise Exception(time.strftime("%Y-%m-%d %H:%M") + ": failed to make target " + target + " in module " + module + " below base " + projs_root) raise Exception(time.strftime("%Y-%m-%d %H:%M") + ": failed to make target " + target + " in module " + module + " below base " + projs_root)
def build_run_make_on_modules(modules, order, target): def run_make_on_modules(self, modules, order, target):
cur_project = 0 cur_project = 0
num_projects = len(order) num_projects = len(order)
if target in ["clean", "distclean"]: if target in ["clean", "distclean"]:
for m in reversed(order): for m in reversed(order):
cur_project += 1 cur_project += 1
build_run_make(m, target, cur_project, num_projects) self.run_make(m, target, cur_project, num_projects)
if m in modules: if m in modules:
modules.remove(m) modules.remove(m)
if not len(modules): if not len(modules):
@ -164,9 +166,9 @@ def build_run_make_on_modules(modules, order, target):
else: else:
for m in order: for m in order:
cur_project += 1 cur_project += 1
build_run_make(m, target, cur_project, num_projects) self.run_make(m, target, cur_project, num_projects)
def cmd_build(args_): def run(self, args_):
all_deps = Set() all_deps = Set()
visited = {} visited = {}
glob_order = [] glob_order = []
@ -208,7 +210,7 @@ def cmd_build(args_):
glob_prereq_types = [ "build", "run", "release", "devel" ] glob_prereq_types = [ "build", "run", "release", "devel" ]
print("using prerequisite types " + ' '.join(glob_prereq_types)) print("using prerequisite types " + ' '.join(glob_prereq_types))
build_calculate_order(order, modules, glob_prereq_types, all_deps) self.calculate_order(order, modules, glob_prereq_types, all_deps)
if args.ignore_deps: if args.ignore_deps:
order = [m for m in order if m in args.modules] order = [m for m in order if m in args.modules]
order = [m for m in order if m not in exclude] order = [m for m in order if m not in exclude]
@ -225,10 +227,14 @@ def cmd_build(args_):
if args.dry_run: if args.dry_run:
exit(0) exit(0)
build_run_make_on_modules(modules, order, target) self.run_make_on_modules(modules, order, target)
print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
def cmd_build(args_):
build = Build()
build.run(args_)
# -------------------------------------------------------------------- here we go # -------------------------------------------------------------------- here we go
global_args = [] global_args = []