bin/chroot-maint: Enhance the `CROSS_TOOLS' pattern machinery.
[distorted-chroot] / bin / chroot-maint
index 1d4a2a9..fbd45e3 100755 (executable)
@@ -1431,6 +1431,7 @@ class Config (object):
     "*_DEPS": ("PKGDEPS", _conv_list),
     "*_QEMUHOST": ("QEMUHOST", _conv_str),
     "*_QEMUARCH": ("QEMUARCH", _conv_str),
+    "*_QEMUDIST": ("QEMUDIST", _conv_str),
     "*_ALIASES": ("DISTALIAS", _conv_str)
   }
 
@@ -1858,7 +1859,8 @@ class ChrootJob (BaseJob):
       me._tools_chroot = CrossToolsJob.ensure\
         ("%s-%s" % (me._dist, C.TOOLSARCH), FRESH)
       me._qemu_chroot = CrossToolsJob.ensure\
-        ("%s-%s" % (me._dist, C.QEMUHOST[me._arch]), FRESH)
+        ("%s-%s" % (C.QEMUDIST.get(me._dist, me._dist),
+                    C.QEMUHOST[me._arch]), FRESH)
       me.await(me._tools_chroot)
       me.await(me._qemu_chroot)
 
@@ -1895,9 +1897,10 @@ class ChrootJob (BaseJob):
       crossdir = OS.path.join(C.LOCAL, "cross",
                               "%s-%s" % (dist, C.TOOLSARCH))
 
-      qarch, qhost = C.QEMUARCH[arch], C.QEMUHOST[arch]
+      qarch, qhost, qdist = \
+        C.QEMUARCH[arch], C.QEMUHOST[arch], C.QEMUDIST.get(dist, dist)
       qemudir = OS.path.join(C.LOCAL, "cross",
-                             "%s-%s" % (dist, qhost), "QEMU")
+                             "%s-%s" % (qdist, qhost), "QEMU")
 
       ## Acquire lockfiles in a canonical order to prevent deadlocks.
       donors = [C.TOOLSARCH]
@@ -2051,8 +2054,9 @@ class ChrootJob (BaseJob):
         run_root(["mv", new, real])
       for path in have_link.iterkeys():
         if path in want_link: continue
-        progress("remove obsolete link `%s' -> `%s'" % path)
         real = root + path
+        progress("remove obsolete link `%s' -> `%s'" %
+                 (path, OS.readlink(real)))
         run_root(["rm", "-f", real])
 
       ## Remove diversions from paths which don't need them any more.  Here
@@ -2253,6 +2257,7 @@ exit 101
         apt-get -y dist-upgrade
         apt-get -y autoremove
         apt-get -y clean
+        ldconfig
       """], stdin = DISCARD)
       if arch in C.FOREIGN_ARCHS: me._install_cross_tools()
       me._meta.update = zulu(); me._meta.write()
@@ -2379,15 +2384,25 @@ class CrossToolsJob (BaseJob):
 
       ## Work through the shopping list, copying the things it names into the
       ## cross-tools tree.
+      ##
+      ## Each thing in the `CROSS_PATHS' list is a `|'-separated list of glob
+      ## patterns, optionally preceded by `?'.  Unless the list starts with
+      ## `?', at least one of the patterns must match at least one file.
+      ## Patterns may contain the token `MULTI', which is replaced by the
+      ## donor architecture's multiarch triplet.
       scan = []
       for pat in C.CROSS_PATHS:
-        pat = pat.replace("MULTI", mymulti)
         any = False
-        for rootpath in GLOB.iglob(root + pat):
+        pat = pat.replace("MULTI", mymulti)
+        if pat.startswith("?"):
+          pat = pat[1:]
           any = True
-          path = rootpath[len(root):]
-          progress("copy `%s'" % path)
-          run_program(["rsync", "-aHR", "%s/.%s" % (root, path), crossnew])
+        for subpat in pat.split("|"):
+          for rootpath in GLOB.iglob(root + subpat):
+            any = True
+            path = rootpath[len(root):]
+            progress("copy `%s'" % path)
+            run_program(["rsync", "-aHR", "%s/.%s" % (root, path), crossnew])
         if not any:
           raise RuntimeError("no matches for cross-tool pattern `%s'" % pat)
 
@@ -2668,6 +2683,11 @@ class PackageBuildJob (BaseJob):
       run_schroot_session(session,
                           ["mount", "-oremount,rw", "/usr/local.schroot"],
                           rootp = True, stdin = DISCARD)
+      run_schroot_session(session,
+                          ["mount", "--bind",
+                           "/usr/local.schroot/%s/include.aside" % arch,
+                           "/usr/local.schroot/%s/include" % arch],
+                          rootp = True, stdin = DISCARD)
 
       progress("configure `%s' %s for %s" % (pkg, ver, arch))
       run_schroot_session(session, ["sh", "-e", "-c", """