From: Mark Wooding Date: Tue, 5 May 2020 19:53:44 +0000 (+0100) Subject: Merge branch 'master' into deploy.universe X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/distorted-chroot/commitdiff_plain/c7c01b125d221388f3d786e995aae4677e86dd2c?hp=187d247a9e72e933eb7d54ae920950e97be03084 Merge branch 'master' into deploy.universe * master: Makefile: Add a new thing for running arbitrary commands. Makefile: Change the tag for maintenance to be `MAINT'. Makefile: Fix `squote' to have the right number of `\'s. bin/chroot-maint: Run `ldconfig' after an update. bin/chroot-maint: Fix mistakenly indented file-contents literals. src/jobclient.c: Cope if the jobserver pipe is set nonblocking. bin/chroot-maint: Force `--no-merged-usr'. bin/chroot-maint: Update the path correctly when following a symlink. bin/chroot-maint: Don't forget to copy symlinks to directories. --- diff --git a/Makefile b/Makefile index ea89661..c9befaf 100644 --- a/Makefile +++ b/Makefile @@ -274,7 +274,8 @@ throwrc = { $1; echo $$? >&4; } ## $(call squote,TXT) ## ## Single-quote TXT. -squote = '$(subst ','\\'',$1)' +squote = '$(subst ','\'',$1)' +#' ## $(call chroot-dist,D-A) -> D ## $(call chroot-arch,D-A) -> A @@ -638,7 +639,7 @@ JOBS = chroot cross-tools pkg-build MAINTQ_ = -q MAINTQ_0 = -q -MAINT = +$(call v_tag,RUN)\ +MAINT = +$(call v_tag,MAINT)\ PYTHONPATH=$(STATE)/lib/python $(STATE)/bin/chroot-maint \ $(MAINTQ_$V) $(OPTS) @@ -646,6 +647,19 @@ maint: all check $(MAINT) -f$(FRESH) $(JOBS) .PHONY: maint +###-------------------------------------------------------------------------- +### Running random commands. + +CMD = echo %d %a +subst-command = $(subst %d,$(call chroot-dist,$1), \ + $(subst %a,$(call chroot-arch,$1), \ + $(subst %r,$1, $(CMD)))) + +run: $(foreach c,$(ALL_CHROOTS),run/$c) +$(foreach c,$(ALL_CHROOTS),run/$c): run/%: + $(V_AT)$(call v_print,RUN,$(call subst-command,$*))\ + $(call subst-command,$*) + ###-------------------------------------------------------------------------- ### Other maintenance targets. diff --git a/bin/chroot-maint b/bin/chroot-maint index 2f91e9c..4dba315 100755 --- a/bin/chroot-maint +++ b/bin/chroot-maint @@ -1944,7 +1944,7 @@ class ChrootJob (BaseJob): continue ff.append(f) path = OS.path.join(dir, f) - if not OS.path.isdir(path): examine(path) + if OS.path.islink(path) or not OS.path.isdir(path): examine(path) files[:] = ff OS.path.walk(crossdir, visit, None) OS.path.walk(OS.path.join(crossdir, "TOOLCHAIN", gnuarch), @@ -2116,7 +2116,7 @@ class ChrootJob (BaseJob): ## Install the base system. progress("install base system") - run_root(["eatmydata", "debootstrap"] + + run_root(["eatmydata", "debootstrap", "--no-merged-usr"] + (arch in C.FOREIGN_ARCHS and ["--foreign"] or []) + ["--arch=" + arch, "--variant=minbase", "--include=" + ",".join(C.BASE_PACKAGES), @@ -2156,12 +2156,12 @@ class ChrootJob (BaseJob): with safewrite_root\ (OS.path.join(mnt, "fs/etc/apt/apt.conf.d/20arch")) as f: f.write("""\ - ### -*-conf-*- +### -*-conf-*- - APT { - Architecture "%s"; - }; - """ % arch) +APT { + Architecture "%s"; +}; +""" % arch) ## Set up the locale and time zone from the host system. progress("configure locales and timezone") @@ -2184,10 +2184,10 @@ class ChrootJob (BaseJob): with safewrite_root(OS.path.join(mnt, "fs/usr/sbin/policy-rc.d"), mode = "755") as f: f.write("""\ - #! /bin/sh - echo >&2 "policy-rc.d: Services disabled by policy." - exit 101 - """) +#! /bin/sh +echo >&2 "policy-rc.d: Services disabled by policy." +exit 101 +""") ## Hack the dynamic linker to prefer libraries in `/usr' over ## `/usr/local'. This prevents `dpkg-shlibdeps' from becoming @@ -2199,10 +2199,10 @@ class ChrootJob (BaseJob): with safewrite_root\ (OS.path.join(mnt, "fs/etc/ld.so.conf.d/zzz-local.conf")) as f: f.write("""\ - ### -*-conf-*- - ### Local hack to make /usr/local/ late. - /usr/local/lib - """) +### -*-conf-*- +### Local hack to make /usr/local/ late. +/usr/local/lib +""") ## If this is a foreign architecture then we need to set it up. if arch in C.FOREIGN_ARCHS: @@ -2253,6 +2253,7 @@ class ChrootJob (BaseJob): 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() @@ -2375,7 +2376,7 @@ class CrossToolsJob (BaseJob): try: dest = dest[:dest.rindex("/")] except ValueError: dest = "" if path == "": path = link - else: path = "%s/%s" % (path, link) + else: path = "%s/%s" % (link, path) ## Work through the shopping list, copying the things it names into the ## cross-tools tree. diff --git a/src/jobclient.c b/src/jobclient.c index bc8d858..02141d4 100644 --- a/src/jobclient.c +++ b/src/jobclient.c @@ -33,6 +33,7 @@ #include #include +#include #include #define PY_SSIZE_T_CLEAN @@ -52,6 +53,7 @@ static PyObject *pymeth_jobclient(PyObject *me, PyObject *arg) PyObject *rc = 0; struct sigaction sa, oldsa; sigset_t mask, oldmask; + fd_set infd; int rstrchld = 0; int fd, sfd; int kid, st; @@ -101,7 +103,11 @@ again: * like this happens, then we go back and try reaping children again. */ Py_BEGIN_ALLOW_THREADS - n = read(sigfd, &ch, 1); + for (;;) { + n = read(sigfd, &ch, 1); if (n >= 0 || errno != EAGAIN) break; + FD_ZERO(&infd); FD_SET(sigfd, &infd); + n = select(sigfd + 1, &infd, 0, 0, 0); if (n < 0) break; + } Py_END_ALLOW_THREADS if (n == 1) rc = Py_BuildValue("(cOO)", ch, Py_None, Py_None); else if (!n) rc = Py_BuildValue("(sOO)", "", Py_None, Py_None);