diff --git a/scripts/build.py b/scripts/build.py index 265bbc06..9a5b8950 100644 --- a/scripts/build.py +++ b/scripts/build.py @@ -20,77 +20,78 @@ glob_order = [] proj_base=pwd.getpwuid(os.getuid()).pw_dir + "/local/src/cvs.stable/proj" search_path=[".", "dspc/src", "dspc/src/dspcd-plugins", "dspc/src/io" ] glob_prereq_type="BUILD" +dep_cache = {} def find_proj_path(name): - name=name.replace("dspider-", "") - for sub in search_path: - path=proj_base + "/" + sub + "/" + name - if os.path.exists(path): - return path - raise Exception("module " + name + " not found below " + proj_base) + name=name.replace("dspider-", "") + for sub in search_path: + path=proj_base + "/" + sub + "/" + name + if os.path.exists(path): + return path + raise Exception("module " + name + " not found below " + proj_base) def read_deps(cur, prereq_type): - path = find_proj_path(cur) - os.chdir(path) + path = find_proj_path(cur) + os.chdir(path) # ignoring prereq_type, as it has never been anything but BUILD, now # only looking for PREREQ without anything - p = subprocess.Popen("LD_LIBRARY_PATH= make echo-prereq | sed '/PREREQ " + " *=/ !d; s/.*=//'", shell=True, stdout=subprocess.PIPE) - p.wait() - if p.returncode: # FIXME: doesn't work, because sed kills make's return code - raise Exception("failed to get " + prereq_type + " prerequisites from " + path) - r = Set() - for d in p.stdout.read().split(): - r.add(d) - if cur in r: - r.remove(cur) - return r + p = subprocess.Popen("LD_LIBRARY_PATH= make echo-prereq | sed '/PREREQ " + " *=/ !d; s/.*=//'", shell=True, stdout=subprocess.PIPE) + p.wait() + if p.returncode: # FIXME: doesn't work, because sed kills make's return code + raise Exception("failed to get " + prereq_type + " prerequisites from " + path) + r = Set() + for d in p.stdout.read().split(): + r.add(d) + if cur in r: + r.remove(cur) + return r def add_tree(cur, prereq_type): - if cur in all_deps: - return 0 - all_deps.add(cur) - deps = read_deps(cur, prereq_type) - for d in deps: - add_tree(d, prereq_type) - dep_tree[cur] = deps - return len(deps) + if cur in all_deps: + return 0 + all_deps.add(cur) + deps = read_deps(cur, prereq_type) + for d in deps: + add_tree(d, prereq_type) + dep_tree[cur] = deps + return len(deps) def calculate_order(order, modules, prereq_type): - for m in modules: - add_tree(m, prereq_type) - while len(all_deps): - for d in all_deps: - if not len(dep_tree[d]): - break - else: - print all_deps - raise Exception("fatal: the dependencies between these modules are unresolvable") - order.append(d) - all_deps.remove(d) - for k in dep_tree.keys(): - if d in dep_tree[k]: - dep_tree[k].remove(d) - return 1 + for m in modules: + add_tree(m, prereq_type) + while len(all_deps): + for d in all_deps: + if not len(dep_tree[d]): + break + else: + print all_deps + raise Exception("fatal: the dependencies between these modules are unresolvable") + order.append(d) + all_deps.remove(d) + for k in dep_tree.keys(): + if d in dep_tree[k]: + dep_tree[k].remove(d) + return 1 def run_make(module, target): - path = find_proj_path(module) - print "========= running make " + target + " in " + path - os.chdir(path) - if subprocess.call(["make", target]): - raise Exception(time.strftime("%Y-%m-%d %H:%M") + ": failed to make target " + target + " in module " + module + " below base " + proj_base) + path = find_proj_path(module) + print "========= running make " + target + " in " + path + os.chdir(path) + if subprocess.call(["make", target]): + raise Exception(time.strftime("%Y-%m-%d %H:%M") + ": failed to make target " + target + " in module " + module + " below base " + proj_base) def build(modules, order, target): - if target in ["clean", "distclean"]: - for m in reversed(order): - run_make(m, target) - if m in modules: - modules.remove(m) - if not len(modules): - print "all modules cleaned" - return - else: - for m in order: - run_make(m, target) + if target in ["clean", "distclean"]: + for m in reversed(order): + run_make(m, target) + if m in modules: + modules.remove(m) + if not len(modules): + print "all modules cleaned" + return + else: + for m in order: + run_make(m, target) # -- parse command line modules = Set() @@ -109,8 +110,8 @@ modules=args.modules env_exclude=os.getenv('BUILD_EXCLUDE', '') if len(env_exclude): - print "exluding modules from environment: " + env_exclude - exclude += " " + env_exclude + print "exluding modules from environment: " + env_exclude + exclude += " " + env_exclude # -- build if target != 'order':