[28634] in Source-Commits
build-system commit: dabuild: Add -k (--keep-going) option
daemon@ATHENA.MIT.EDU (Anders Kaseorg)
Tue Jun 21 04:07:01 2016
Date: Tue, 21 Jun 2016 04:06:58 -0400
From: Anders Kaseorg <andersk@mit.edu>
Message-Id: <201606210806.u5L86wU6031220@drugstore.mit.edu>
To: source-commits@mit.edu
https://github.com/mit-athena/build-system/commit/5b6327c9f889b1953ef71a1aed223b016b24c020
commit 5b6327c9f889b1953ef71a1aed223b016b24c020
Author: Debathena Build System <debathena@mit.edu>
Date: Tue Jun 21 03:49:28 2016 -0400
dabuild: Add -k (--keep-going) option
dabuild | 34 +++++++++++++++++++++++++++-------
1 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/dabuild b/dabuild
index 00eb478..bb65f9e 100755
--- a/dabuild
+++ b/dabuild
@@ -126,7 +126,7 @@ def resolve_build_order_core(sources, binary_map, build_deps, bin_deps):
}
# Order has (package, packages to build before it) format
- order = []
+ order = OrderedDict()
working_set = [
(source, build_deps_src[source])
for source in sources
@@ -145,7 +145,7 @@ def resolve_build_order_core(sources, binary_map, build_deps, bin_deps):
for pkg, deps in working_set[:]:
if all(dep in order for dep in deps):
- order.append(pkg)
+ order[pkg] = deps
working_set.remove( (pkg, deps) )
else:
pass
@@ -231,10 +231,10 @@ def create_build_schedule(distro, build_targets, arches, bindep_distro=None):
order = resolve_build_order(distro, build_targets, arches, bindep_distro)
schedule = OrderedDict()
- for package in order:
+ for package, deps in order.iteritems():
for arch in arches:
if package in build_targets[arch]:
- key = (distro.name, distro.release, package)
+ key = (distro.name, distro.release, package, deps)
if key not in schedule:
schedule[key] = list()
schedule[key].append(arch)
@@ -253,6 +253,7 @@ def main():
argparser.add_argument("architecture", nargs='*', help="List of architectures to build for")
argparser.add_argument("--on-production-repository", action="store_true", help="Build even if non-development repository is specified")
argparser.add_argument("--bindep-base", "-B", help="Release on which binary dependency resolution is based")
+ argparser.add_argument("--keep-going", "-k", action="store_true", help="Continue building on errors")
args = argparser.parse_args()
repos = [args.repository]
@@ -293,7 +294,7 @@ def main():
print
for repo, order in groupby(build_list, lambda x: x[0]):
print "Order in %s:" % repo
- for _, _, package, arches in order:
+ for _, _, package, _, arches in order:
print "* %s %s [%s]" % (package, distros[repo].sources[package].version, ' '.join(arches))
print
@@ -303,9 +304,28 @@ def main():
if answer not in {'y', 'yes'}:
return
- for repo, release, source_name, pkg_arches in build_list:
+ failures = OrderedDict()
+
+ for repo, release, source_name, deps, pkg_arches in build_list:
+ previous_failures = [dep for dep in deps if (repo, release, dep) in failures]
+ if previous_failures:
+ print "Skipping %s in %s due to previous failure of %s" % \
+ (source_name, repo, ' '.join(previous_failures))
+ failures[repo, release, source_name] = pkg_arches[:]
+ continue
+
for arch in pkg_arches:
- build_package(distros[repo], release, distros[repo].sources[source_name], arch)
+ try:
+ build_package(distros[repo], release, distros[repo].sources[source_name], arch)
+ except subprocess.CalledProcessError if args.keep_going else () as err:
+ print "FAILED"
+ print err.output
+ failures.setdefault((repo, release, source_name), []).append(arch)
+
+ if failures:
+ for repo, release, source_name in failures:
+ print "Build failed: %s in %s" % (source_name, repo)
+ raise RuntimeError("some builds failed")
if __name__ == '__main__':
if not dabuildsys.claim_lock():