build.py: add option --buildarch
authorHelmut Grohne <helmut@subdivi.de>
Thu, 8 Oct 2020 11:40:46 +0000 (13:40 +0200)
committerHelmut Grohne <helmut@subdivi.de>
Thu, 8 Oct 2020 11:40:46 +0000 (13:40 +0200)
This allows selecting the architecture of the build server defaulting to
the local native architecture.

build.py

index 9fc3b8b..5e2ee85 100755 (executable)
--- a/build.py
+++ b/build.py
@@ -45,10 +45,16 @@ def do_build(source, version, architecture, server):
     print("status %s code %d" % (status, code))
     return (now, code == 0, logtarget, status == "given-back")
 
+def get_build_arch():
+    return subprocess.check_output(["dpkg", "--print-architecture"],
+                                   encoding="ascii").strip()
+
 def main():
     argp = argparse.ArgumentParser()
     argp.add_argument("server", help="machine to build on")
+    argp.add_argument("--buildarch", help="build architecture of the server")
     args = argp.parse_args()
+    buildarch = args.buildarch or get_build_arch()
     db = sqlite3.connect("db", detect_types=sqlite3.PARSE_DECLTYPES)
     with contextlib.closing(db.cursor()) as cur:
         cur.execute("BEGIN IMMEDIATE;")
@@ -56,7 +62,7 @@ def main():
             SELECT d.source, d.version, d.architecture, r.id
                 FROM depstate AS d
                     JOIN buildrequests AS r
-                        ON 'amd64' = ifnull(r.buildarch, 'amd64')
+                        ON ? = ifnull(r.buildarch, 'amd64')
                             AND d.architecture = ifnull(r.hostarch, d.architecture)
                             AND d.source = r.source
                     JOIN depcheck
@@ -64,10 +70,10 @@ def main():
                 WHERE d.satisfiable = 1 AND depcheck.giveback = 0
                     AND NOT EXISTS (SELECT 1 FROM building
                         WHERE d.source = building.source
-                            OR ('amd64' = building.buildarch AND
+                            OR (? = building.buildarch AND
                                 d.architecture = building.hostarch))
                 ORDER BY r.priority DESC, r.requesttime ASC, random()
-                LIMIT 1;""")
+                LIMIT 1;""", (buildarch, buildarch))
         row = cur.fetchone()
         if not row:
             cur.execute("""
@@ -82,23 +88,23 @@ def main():
             print("no package satisfiable")
             time.sleep(60)
             return
-        source, version, architecture, requestid = row
+        source, version, hostarch, requestid = row
         cur.execute("""INSERT INTO building (source, buildarch, hostarch, pid)
                            VALUES (?, ?, ?, ?);""",
-                    (source, 'amd64', architecture, os.getpid()))
+                    (source, buildarch, hostarch, os.getpid()))
         cur.execute("COMMIT;")
     try:
         print("building %s_%s for %s%s" %
-              (source, version, architecture,
+              (source, version, hostarch,
                "" if requestid is None else " (request %d)" % requestid))
         timestamp, success, filename, giveback = \
-            do_build(source, version, architecture, args.server)
+            do_build(source, version, hostarch, args.server)
         with contextlib.closing(db.cursor()) as cur:
             cur.execute("""INSERT INTO builds
                             (source, version, buildarch, hostarch, success,
                              starttime, filename)
                             VALUES (?, ?, ?, ?, ?, ?, ?);""",
-                        (source, version, 'amd64', architecture, success,
+                        (source, version, buildarch, hostarch, success,
                          timestamp, filename))
             if requestid is not None:
                 cur.execute("DELETE FROM buildrequests WHERE id = ?;",
@@ -106,7 +112,7 @@ def main():
             if giveback:
                 cur.execute("""UPDATE depcheck SET giveback = 1
                                 WHERE architecture = ?;""",
-                            (architecture,))
+                            (hostarch,))
     finally:
         with contextlib.closing(db.cursor()) as cur:
             cur.execute("DELETE FROM building WHERE pid = ?;", (os.getpid(),))