3 ### Main maintenance script for chroots
5 ### (c) 2018 Mark Wooding
8 ###----- Licensing notice ---------------------------------------------------
10 ### This file is part of the distorted.org.uk chroot maintenance tools.
12 ### distorted-chroot is free software: you can redistribute it and/or
13 ### modify it under the terms of the GNU General Public License as
14 ### published by the Free Software Foundation; either version 2 of the
15 ### License, or (at your option) any later version.
17 ### distorted-chroot is distributed in the hope that it will be useful,
18 ### but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 ### General Public License for more details.
22 ### You should have received a copy of the GNU General Public License
23 ### along with distorted-chroot. If not, write to the Free Software
24 ### Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
30 .PHONY: all clean check
31 .SECONDEXPANSION: #sorry
33 ###--------------------------------------------------------------------------
38 ## Level of pickiness to aspire to.
41 ## Volume group from which to allocate chroot volumes and snapshots.
42 CONFIG_VARS += VG LVPREFIX
43 VG := vg-$(shell hostname)
46 ## Logical volume size, as an LVM option.
47 CONFIG_VARS += LVSZ SNAPOPT
52 CONFIG_VARS += DEBMIRROR
53 DEBMIRROR = http://deb.debian.org/debian/
55 ## APT sources configurations. (Also, $($d_APTSRC) for each $d in $(DISTS).)
57 APTSRC = etc/aptsrc.conf $(wildcard etc/aptsrc.local.conf)
59 ## APT configuration fragment names. These will be linked into
60 ## `/etc/apt/apt.conf.d' in each chroot. To put a fragment f in a surprising
61 ## place, set $(_$f_APTCONFSRC).
62 CONFIG_VARS += APTCONF $(foreach f,$(APTCONF),_$f_APTCONFSRC)
63 APTCONF = $(notdir $(wildcard etc/apt-conf.d/[0-9]*[!~]))
68 eval $$(apt-config $(foreach a,$(APTCONF),-cetc/apt-conf.d/$a) \
69 shell proxy Acquire::http::proxy); \
70 case $${proxy+t} in (t) echo "$$proxy" ;; (*) echo nil ;; esac)
72 ## Debian distributions to support.
73 CONFIG_VARS += PRIMARY_DIST DISTS
74 PRIMARY_DIST = stretch
75 DISTS = $(PRIMARY_DIST) buster bullseye sid
77 ## Host's native architecture(s).
78 CONFIG_VARS += MYARCH NATIVE_ARCHS
79 MYARCH := $(shell dpkg --print-architecture)
80 OTHERARCHS := $(shell dpkg --print-foreign-architectures)
81 NATIVE_ARCHS = $(MYARCH) $(OTHERARCHS)
83 ## Foreign (emulated) architectures to support.
84 CONFIG_VARS += FOREIGN_ARCHS
87 ## Master lists of chroots to build and maintain.
88 CONFIG_VARS += NATIVE_CHROOTS FOREIGN_CHROOTS
89 NATIVE_CHROOTS = $(foreach a,$(NATIVE_ARCHS), \
90 $(foreach d,$(or $($a_DISTS) $(DISTS)), \
92 FOREIGN_CHROOTS = $(foreach a,$(FOREIGN_ARCHS), \
93 $(foreach d,$(or $($a_DISTS) $(DISTS)), \
96 ## Extra packages to be installed in chroots. `BASE_PACKAGES' are installed
97 ## through `debootstrap'; `EXTRA_PACKAGES' are installed later, using Apt,
98 ## which is faster in foreign chroots.
99 CONFIG_VARS += BASE_PACKAGES EXTRA_PACKAGES
100 BASE_PACKAGES = eatmydata
101 EXTRA_PACKAGES = build-essential
102 EXTRA_PACKAGES += ccache
103 EXTRA_PACKAGES += fakeroot
104 EXTRA_PACKAGES += libfile-fcntllock-perl
105 EXTRA_PACKAGES += locales
107 ## Extra packages from which to install the cross tools.
108 CONFIG_VARS += CROSS_PACKAGES
109 CROSS_PACKAGES = bash coreutils dash findutils
110 CROSS_PACKAGES += gzip m4 mawk sed tar xz-utils
111 CROSS_PACKAGES += apt ccache eatmydata fakeroot make
112 CROSS_PACKAGES += qemu-user-static
113 CROSS_PACKAGES += $(foreach a,$(FOREIGN_GNUARCHS),\
114 gcc-$a g++-$a binutils-$a)
116 ## Native files to install in place of the foreign versions. `MULTI' here
117 ## stands for the donor's GNU multiarch name.
118 CONFIG_VARS += CROSS_PATHS
120 $(addprefix /usr/bin/, \
121 apt apt-cache apt-config apt-get apt-key apt-mark) \
122 $(addprefix /usr/lib/apt/, \
125 cat chgrp chown cp date dd df dir echo false ln ls mkdir \
126 mknod mktemp mv pwd readlink rm rmdir sleep stty sync touch \
128 $(addprefix /usr/bin/, \
129 [ arch b2sum base32 base64 basename chcon cksum comm \
130 csplit cut dircolors dirname du env expand expr factor fmt \
131 fold groups head hostid id install join link logname md5sum \
132 mkfifo nice nl nohup nproc numfmt od paste pathchk pinky pr \
133 printenv printf ptx realpath runcon seq sha1sum sha224sum \
134 sha256sum sha384sum sha512sum shred shuf sort split stat \
135 stdbuf sum tac tail tee test timeout tr truncate tsort tty \
136 unexpand uniq unlink users wc who whoami yes) \
137 /usr/lib/MULTI/coreutils/ \
138 $(addprefix /lib/MULTI/, \
139 libnsl.so.* libnss_*.so.*) \
141 /usr/bin/qemu-*-static \
143 bash dash gzip sed tar) \
144 $(addprefix /usr/bin/, \
145 ccache find m4 make mawk xargs xz) \
146 $(addprefix /usr/lib/MULTI/, \
147 libeatmydata.so* libfakeroot/) \
148 $(addprefix /etc/ld.so.conf.d/, \
149 MULTI.conf fakeroot*.conf) \
150 $(foreach a,$(FOREIGN_GNUARCHS), \
151 $(addprefix /usr/bin/$a-, \
152 addr2line ar as c++filt dwp elfedit gprof ld ld.* \
153 nm objcopy objdump ranlib readelf size strings \
155 $(addprefix /usr/bin/$a-, \
156 cpp gcc g++ gcov gcov-dump gcov-tool gprof \
157 gcc-ar gcc-nm gcc-ranlib) \
158 /usr/lib/gcc-cross/$a/)
160 ## Local packages to be compiled and installed in chroots. Archives can be
162 CONFIG_VARS += LOCALPKGS $(foreach p,$(LOCALPKGS),$p_DEPS)
163 LOCALPKGS = mLib checkpath
165 checkpath_DEPS = mLib
167 ## Which host architecture to use for foreign architectures. It turns out
168 ## that it's best to use a Qemu with the same host bitness as the target
169 ## architecture; otherwise it has to do a difficult job of converting
170 ## arguments and results between kernel ABI flavours.
171 32BIT_QEMUHOST = $(or $(filter i386,$(NATIVE_ARCHS)),$(TOOLSARCH))
172 64BIT_QEMUHOST = $(or $(filter amd64,$(NATIVE_ARCHS)),$(TOOLSARCH))
174 CONFIG_VARS += $(foreach a,$(FOREIGN_ARCHS),$a_QEMUHOST)
175 armel_QEMUHOST = $(32BIT_QEMUHOST)
176 armhf_QEMUHOST = $(32BIT_QEMUHOST)
177 arm64_QEMUHOST = $(64BIT_QEMUHOST)
178 i386_QEMUHOST = $(32BIT_QEMUHOST)
179 amd64_QEMUHOST = $(64BIT_QEMUHOST)
181 ## Qemu architecture names. These tell us which Qemu binary to use for a
182 ## particular Debian architecture.
183 CONFIG_VARS += $(foreach a,$(FOREIGN_ARCHS),$a_QEMUARCH)
186 arm64_QEMUARCH = aarch64
188 amd64_QEMUARCH = x86_64
190 ## Alias mapping for chroots.
191 CONFIG_VARS += $(foreach d,$(DISTS),$d_ALIASES)
192 stretch_ALIASES = oldstable
193 buster_ALIASES = stable
194 bullseye_ALIASES = testing
195 sid_ALIASES = unstable
197 ## Which host architecture to use for commonly used tools in foreign chroots.
198 CONFIG_VARS += TOOLSARCH
199 TOOLSARCH = $(MYARCH)
201 ## A directory in which we can maintain private files and state.
205 ## A directory which will be spliced into chroots as `/usr/local.schroot/'.
206 ## This will be our primary point of contact with the chroot.
207 CONFIG_VARS += LOCAL ABSLOCAL
208 LOCAL = local.schroot
209 ABSLOCAL = $(abspath $(LOCAL))
211 ## How to run a command as a privileged user.
212 CONFIG_VARS += ROOTLY
215 ## Files to be copied into a chroot from the host.
216 SCHROOT_COPYFILES = /etc/resolv.conf
217 SCHROOT_NSSDATABASES = passwd shadow group gshadow
219 ## Local configuration hook.
223 CONFIG_VARS += ALL_ARCHS ALL_CHROOTS
224 ALL_ARCHS = $(NATIVE_ARCHS) $(FOREIGN_ARCHS)
225 ALL_CHROOTS = $(NATIVE_CHROOTS) $(FOREIGN_CHROOTS)
227 ## GNU names for foreign architectures.
228 CONFIG_VARS += FOREIGN_GNUARCHS
229 FOREIGN_GNUARCHS := $(foreach a,$(FOREIGN_ARCHS),\
230 $(shell dpkg-architecture -A$a \
231 -qDEB_TARGET_GNU_TYPE))
233 ###--------------------------------------------------------------------------
236 ## Hack to force rebuilding.
240 ## Hack to not delimit function arguments. (Ugh!)
243 ## Silent-rules machinery.
247 v_print = $(call v_print_$V,$1,$2)
248 v_print_0 = printf " %-8s %s\n" "$1" $(call squote,$2);
249 v_tag = $(V_AT)$(call v_print,$1,$@)
250 v_log = $(call v_log_$V,$1,$2)
251 v_log_ = $(call v_log_1,$1,$2)
252 v_log_0 = $2 >log/$1.log 2>&1
253 v_log_1 = $(call catchrc,$(call throwrc,$2) 2>&1 | tee log/$1.log)
254 v_echo = $(call v_echo_$V,$1)
256 v_echo_1 = printf "%s\n" $1
257 CLEANFILES += log/*.log
261 LVM_SUPPRESS_FD_WARNINGS=1; export LVM_SUPPRESS_FD_WARNINGS
263 ## $(call definedp,VAR)
265 ## Expand non-empty if and only if VAR is defined (but possibly empty).
266 definedp = $(filter-out undefined,$(origin $1))
268 ## $(call catchrc,...$(call throwrc,CMD)...)
270 ## Catch the exit status of some subpart of a complicated shell rune.
271 catchrc = (exec 3>&1; exit $$({ $1; } 4>&1 >&3 3>&-))
272 throwrc = { $1; echo $$? >&4; }
274 ## $(call squote,TXT)
277 squote = '$(subst ','\\'',$1)'
279 ## $(call chroot-dist,D-A) -> D
280 ## $(call chroot-arch,D-A) -> A
282 ## Parse chroot descriptions.
283 chroot-dist = $(patsubst %/,%,$(dir $(subst -,/,$1)))
284 chroot-arch = $(notdir $(subst -,/,$1))
286 ## $(call package-dir-name,P-V) -> P
287 ## $(call package-dir-version,P-V) -> V
289 ## Parse (source) package directory names.
290 package-dir-name = $(sort $(foreach p,$(LOCALPKGS),$(if $(filter $p-$($p_VERSION),$1),$p)))
291 package-dir-version = $($(call package-dir-name,$1)_VERSION)
293 ## $(call package-dir,P-V.A) -> P-V
294 ## $(call package-name,P-V.A) -> P
295 ## $(call package-version,P-V.A) -> V
296 ## $(call package-arch,P-V.A) -> A
298 ## Parse package stamp names.
299 package-dir = $(basename $1)
300 package-name = $(call package-dir-name,$(call package-dir,$1))
301 package-version = $(call package-dir-version,$(call package-dir,$1))
302 package-arch = $(patsubst .%,%,$(suffix $1))
304 ## $(call native-chroot-p,D-A) -> D | <empty>
306 ## Answer whether D-A is a native chroot.
307 native-chroot-p = $(filter $(call chroot-arch,$1),$(NATIVE_ARCHS))
309 ## $(call chroot-qemuhost,D-A) -> AA
311 ## Answer the apporopriate Qemu host architecture for foreign chroot D-A.
312 chroot-qemuhost = $($(call chroot-arch,$1)_QEMUHOST)
314 ## $(call chroot-deps,PRE,D-A) -> PREDD-AA ... | <empty>
316 ## Answer a list of additional dependencies for the chroot D-A: specifically,
317 ## if D-A is foreign then include PRE/DD-AA entries for the tools
318 ## architecture, and Qemu host architecture (if that's different).
319 chroot-deps = $(if $(call native-chroot-p,$2),, \
320 $(addprefix $1$(call chroot-dist,$2)-,\
321 $(sort $(TOOLSARCH) \
322 $(call chroot-qemuhost,$2))))
324 ## Substituting placeholders in files.
325 SUBSTITUTIONS := local=$(shell realpath $(LOCAL))
326 SUBSTITUTIONS += primary-dist=$(PRIMARY_DIST)
328 echo "$1 GENERATED by distorted-chroot: do not edit"; \
330 for v in $(SUBSTITUTIONS); do \
331 var=$${v%%=*} value=$${v\#*=}; \
332 substs="$$substs s
\a@$$var@
\a$$value
\ag;"; \
337 ### $(call symlink-ok-p,LINK,DEST)
339 ### Expand to `t' if LINK is a symbolic link to DEST, and empty otherwise.
340 symlink-ok-p = $(shell \
341 case $$(readlink 2>/dev/null $(patsubst %/,%,$1)) in ($2) echo t ;; esac)
343 ### $(call general-notify,SEV,COLOUR,PREFIX,MSG)
345 ### Report a message, highlighted in the right way, and maybe fail
347 echo "$$(tput bold; tput setaf $2)$3 "$4"$$(tput sgr0; tput op)"; \
348 if [ "$1" -le "$(NOTIFY_FATAL)" ]; then exit 2; fi; \
351 ### $(call report/SEV,MSG)
353 ### Report a notification of a particular severity.
354 notify/INFO = $(call general-notify,3,6,---,$1)
355 notify/WARN = $(call general-notify,2,5,???,$1)
356 notify/ERR = $(call general-notify,1,1,!!!,$1)
358 ## $(call check,SEV,MSG,UNLESS)
360 ## If UNLESS completes successfully, all is OK; otherwise print MSG to stderr
363 $(call v_echo,'check: '$(call squote,$3)''); \
364 if ! { $3; }; then $(call notify/$1,$2); fi; \
367 ## $(call check-executable,SEV,PATH)
369 ## Verify that PATH is an executable program.
370 check-executable = $(call check,$1,"\`$2' is not an executable", \
373 ## $(call check-mountpoint,SEV,DIR)
375 ## Verify that DIR is a mountpoint.
376 check-mountpoint = $(call check,$1,"\`$2' is not a mount point", \
379 ## $(call check-symlink,SEV,LINK,DEST)
381 ## Verify that LINK is a symbolic link pointing to DEST.
382 check-symlink = $(call check,$1,"\`$2' is not a link to \`$3'", \
383 [ -L "$2" ] && [ "$$(readlink "$2")" = "$3" ])
385 ###--------------------------------------------------------------------------
386 ### Python extensions.
389 CFLAGS = -O2 -g -Wall
394 c-source = $(foreach c,$1,src/$c)
395 c-object = $(foreach c,$1,$(STATE)/obj/$(basename $c).o)
397 PYEXT_PKGFLAGS := $(shell pkg-config --cflags python2)
398 PYEXT_CFLAGS = -fPIC -fno-strict-aliasing $(PYEXT_PKGFLAGS)
399 PYEXT_LDFLAGS = -shared
402 jobclient_SOURCES = jobclient.c
404 PYEXT_ALLSRC = $(foreach x,$(PYEXTS),\
405 $(call c-source,$($x_SOURCES)))
406 PYEXT_ALLOBJ = $(foreach x,$(PYEXTS),\
407 $(call c-object,$($x_SOURCES)))
408 $(PYEXT_ALLOBJ): $(STATE)/obj/%.o: src/%.c
409 $(V_AT)mkdir -p $(dir $@)
410 $(call v_tag,CC)$(CC) -c $(CFLAGS) $(PYEXT_CFLAGS) -o$@ $<
412 PYMODULES = $(foreach x,$(PYEXTS),$(STATE)/lib/python/$x.so)
414 $(PYMODULES): $(STATE)/lib/python/%.so: $$(call c-object,$$($$*_SOURCES))
415 $(V_AT)mkdir -p $(dir $@)
416 $(call v_tag,LD)$(LD) $(LDFLAGS) $(PYEXT_LDFLAGS) -o$@ $^
418 ###--------------------------------------------------------------------------
421 SCRIPTS += chroot-maint
422 SCRIPTS += mkchrootconf
424 SUBST_SCRIPTS = $(addprefix $(STATE)/bin/,$(SCRIPTS))
425 all:: $(SUBST_SCRIPTS)
426 $(SUBST_SCRIPTS): $(STATE)/bin/%: bin/% $(STATE)/config.sh
427 $(V_AT)mkdir -p $(dir $@)
428 $(call v_tag,SUBST){ \
430 -e '2i### GENERATED by distorted-chroot: do not edit' \
431 -e '/@@@config@@@/ {' \
432 -e 'r $(STATE)/config.sh' \
435 } >$@.new && chmod +x $@.new && mv $@.new $@
437 ###--------------------------------------------------------------------------
438 ### APT configuration.
440 ## In a chroot, `/etc/apt/sources.list' links to
441 ## `/usr/local.schroot/etc/apt/sources.$d' for the appropriate distribution.
442 APT_SOURCES = $(foreach d,$(DISTS),$(LOCAL)/etc/apt/sources.$d)
445 $(foreach d,$(DISTS),$(STATE)/etc/apt/aptsrc.$d): $(STATE)/etc/apt/aptsrc.%:
446 $(V_AT)mkdir -p $(dir $@)
448 echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \
450 echo " debian : $*"; \
451 } >$@.new && mv $@.new $@
453 $(APT_SOURCES): $(LOCAL)/etc/apt/sources.%: \
454 $$(APTSRC) $$($$*_APTSRC) $$(STATE)/etc/apt/aptsrc.$$*
455 $(V_AT)mkdir -p $(dir $@)
456 $(call v_tag,GEN)bin/mkaptsrc \
457 $(APTSRC) $($*_APTSRC) $(STATE)/etc/apt/aptsrc.$* \
458 >$@.new && mv $@.new $@
459 CLEANFILES += $(APT_SOURCES)
461 ## In a chroot, a link `/etc/apt/apt.conf.d/FOO' is created for each file in
462 ## `/usr/local.schroot/etc/apt/apt.conf.d/FOO'.
463 APT_CONFIGS = $(addprefix $(LOCAL)/etc/apt/apt.conf.d/,$(APTCONF))
465 $(APT_CONFIGS): $(LOCAL)/etc/apt/apt.conf.d/%: \
466 $$(or $$(_$$*_APTCONFSRC) etc/apt-conf.d/$$*)
467 $(V_AT)mkdir -p $(dir $@)
468 $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
469 clean::; rm -f $(APT_CONFIGS)
471 ###--------------------------------------------------------------------------
474 check::; $(call check-executable,ERR,/usr/bin/eatmydata)
476 EATMYDATA_HACKS += apt-get aptitude dpkg
477 SYMLINK_EATMYDATA_HACKS = $(addprefix $(LOCAL)/hacks/,$(EATMYDATA_HACKS))
478 all:: $(SYMLINK_EATMYDATA_HACKS)
479 $(SYMLINK_EATMYDATA_HACKS): $(LOCAL)/hacks/%: \
480 $$(if $$(call symlink-ok-p,$$@,/usr/bin/eatmydata),,_force)
481 $(V_AT)mkdir -p $(dir $@)
482 $(call v_tag,SYMLINK)ln -sf /usr/bin/eatmydata $@.new && mv $@.new $@
483 clean::; rm -f $(SYMLINK_EATMYDATA_HACKS)
485 SCRIPT_HACKS += buildwrap
486 COPY_SCRIPT_HACKS = $(addprefix $(LOCAL)/hacks/,$(SCRIPT_HACKS))
487 all:: $(COPY_SCRIPT_HACKS)
488 $(COPY_SCRIPT_HACKS): $(LOCAL)/hacks/%: bin/%
489 $(V_AT)mkdir -p $(dir $@)
490 $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
491 clean::; rm -f $(COPY_SCRIPT_HACKS)
493 ###--------------------------------------------------------------------------
494 ### `schroot' and `sbuild' configuration.
498 .PHONY: schroot-config
500 check::; $(call check-mountpoint,WARN,/var/lib/sbuild/build)
501 check::; $(call check-symlink,WARN,/build,/var/lib/sbuild/build)
502 check::; $(call check-symlink,ERR,/schroot,/run/schroot/mount)
505 echo "\#\#\# -*-sh-*- GENERATED by distorted-chroot: do not edit"; \
506 $(foreach v,$1,$(if $(call definedp,$v),\
507 echo $v=\'$(call squote,$($v))\';)) \
509 schroot-config_HASH := \
510 $(shell $(call %print-varlist,$(CONFIG_VARS)) | \
511 sha256sum | cut -c1-32)
512 schroot-config_FILE = $(STATE)/config.sh-$(schroot-config_HASH)
513 $(schroot-config_FILE):
514 $(V_AT)mkdir -p $(STATE)
515 $(V_AT)rm -f $(STATE)/config.sh-*
516 $(call v_tag,GEN)$(call %print-varlist,$(CONFIG_VARS)) \
517 >$@.new && mv $@.new $@
519 schroot-config:: $(STATE)/config.sh
520 $(STATE)/config.sh: $(schroot-config_FILE)
521 $(call v_tag,SYMLINK)ln -sf $(notdir $<) $@
523 schroot-config:: $(LOCAL)/etc/schroot/sbuild.schroot
524 $(LOCAL)/etc/schroot/sbuild.schroot: $(STATE)/bin/mkchrootconf
525 $(V_AT)mkdir -p $(dir $@)
526 $(call v_tag,GEN)$(STATE)/bin/mkchrootconf >$@.new && \
527 $(ROOTLY) chown root:root $@.new && mv $@.new $@
528 CLEANFILES += $(LOCAL)/etc/schroot/sbuild.schroot
529 check::; $(call check-symlink,WARN,/etc/schroot/chroot.d/sbuild,$(ABSLOCAL)/etc/schroot/sbuild.schroot)
531 schroot-config:: $(LOCAL)/etc/schroot/sbuild.profile/copyfiles
532 $(LOCAL)/etc/schroot/sbuild.profile/copyfiles: $(schroot-config_STAMP)
533 $(V_AT)mkdir -p $(dir $@)
535 echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \
536 for i in $(SCHROOT_COPYFILES); do echo "$$i"; done; \
537 } >$@.new && mv $@.new $@
538 CLEANFILES += $(LOCAL)/etc/schroot/sbuild.profile/copyfiles
540 schroot-config:: $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases
541 $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases: $(schroot-config_STAMP)
542 $(V_AT)mkdir -p $(dir $@)
544 echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \
545 for i in $(SCHROOT_NSSDATABASES); do echo "$$i"; done; \
546 } >$@.new && mv $@.new $@
547 CLEANFILES += $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases
549 schroot-config:: $(LOCAL)/etc/schroot/sbuild.profile/fstab
550 $(LOCAL)/etc/schroot/sbuild.profile/fstab: \
551 etc/sbuild.fstab.in $(schroot-config_STAMP)
552 $(V_AT)mkdir -p $(dir $@)
553 $(call v_tag,SUBST)$(call subst-file,### -*-conf-*-) \
554 <$< >$@.new && mv $@.new $@
555 CLEANFILES += $(LOCAL)/etc/schroot/sbuild.profile/fstab
557 check::; $(call check-symlink,WARN,/etc/schroot/sbuild,$(ABSLOCAL)/etc/schroot/sbuild.profile)
559 schroot-config:: $(LOCAL)/etc/sbuild.conf
560 $(LOCAL)/etc/sbuild.conf: etc/sbuild.conf.in $(schroot-config_STAMP)
561 $(V_AT)mkdir -p $(dir $@)
562 $(call v_tag,SUBST)$(call subst-file,### -*-perl-*-) \
563 <$< >$@.new && mv $@.new $@
564 CLEANFILES += $(LOCAL)/etc/sbuild.conf
565 check::; $(call check-symlink,WARN,/etc/sbuild/sbuild.conf,$(ABSLOCAL)/etc/sbuild.conf)
566 check::; $(call check-executable,WARN,/usr/local.schroot/hacks/apt-get)
568 SCHROOT_SCRIPTS += 11private
569 SCHROOT_SCRIPTS += 15binfmt
570 SCHROOT_SCRIPTS += 51chrootenv
571 COPY_SCHROOT_SCRIPTS = $(addprefix $(LOCAL)/etc/schroot/setup.d/,$(SCHROOT_SCRIPTS))
572 schroot-config:: $(COPY_SCHROOT_SCRIPTS)
573 $(COPY_SCHROOT_SCRIPTS): \
574 $(LOCAL)/etc/schroot/setup.d/%: etc/schroot-scripts/%
575 $(V_AT)mkdir -p $(dir $@)
576 $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
577 CLEANFILES += $(COPY_SCHROOT_SCRIPTS)
579 CHECK_SCHROOT_SCRIPTS = $(addprefix check-script/,$(SCHROOT_SCRIPTS))
580 check:: $(CHECK_SCHROOT_SCRIPTS)
581 $(CHECK_SCHROOT_SCRIPTS): check-script/%:
582 $(call check-symlink,WARN,/etc/schroot/setup.d/$*,$(ABSLOCAL)/etc/schroot/setup.d/$*)
583 .PHONY: $(addprefix check-script/,$(SCHROOT_SCRIPTS))
585 ###--------------------------------------------------------------------------
588 CCACHE_CONFIGS = $(foreach r,$(ALL_CHROOTS), \
589 /var/lib/sbuild/build/.ccache/$(LVPREFIX)$r/ccache.conf)
590 all:: $(CCACHE_CONFIGS)
591 $(CCACHE_CONFIGS): /var/lib/sbuild/build/.ccache/$(LVPREFIX)%/ccache.conf: \
593 $(V_AT)mkdir -p $(dir $@)
594 $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
596 ###--------------------------------------------------------------------------
597 ### `/usr/local/' structure.
599 LOCAL_COMMON_DIRS = share/ src/
600 LOCAL_EXTRA_DIRS = share/man/
601 all:: $(foreach d,$(LOCAL_COMMON_DIRS) $(LOCAL_EXTRA_DIRS),$(LOCAL)/$d)
602 $(foreach d,$(LOCAL_COMMON_DIRS) $(LOCAL_EXTRA_DIRS),$(LOCAL)/$d):
603 $(V_AT)mkdir -p $(dir $(patsubst %/,%,$@))
604 $(call v_tag,MKDIR)mkdir $@
606 LOCAL_ARCH_DIRS = bin/ etc/ games/ include/ lib/ libexec/ sbin/
607 LOCAL_ARCH_LINKS = man
608 man_LINKDEST = share/man
609 all:: $(foreach a,$(ALL_ARCHS),\
611 $(foreach d,$(LOCAL_ARCH_DIRS),$(LOCAL)/$a/$d) \
612 $(foreach d,$(LOCAL_ARCH_LINKS),$(LOCAL)/$a/$d) \
613 $(foreach d,$(LOCAL_COMMON_DIRS),$(LOCAL)/$a/$d))
615 $(foreach a,$(ALL_ARCHS),$(LOCAL)/$a/):
616 $(call v_tag,MKDIR)mkdir $@
617 $(foreach a,$(ALL_ARCHS),\
618 $(foreach d,$(LOCAL_ARCH_DIRS),$(LOCAL)/$a/$d)):
619 $(V_AT)mkdir -p $(dir $(patsubst %/,%,$@))
620 $(call v_tag,MKDIR)mkdir $@
621 $(foreach a,$(ALL_ARCHS),\
622 $(foreach d,$(LOCAL_ARCH_LINKS),$(LOCAL)/$a/$d)): \
623 $$(if $$(call symlink-ok-p,$$@,$$($$(notdir $$@)_LINKDEST)),,_force)
624 $(V_AT)mkdir -p $(notdir $@)
625 $(call v_tag,SYMLINK)ln -sf $($(notdir $@)_LINKDEST) $@
626 $(foreach a,$(ALL_ARCHS),\
627 $(foreach d,$(LOCAL_COMMON_DIRS),$(LOCAL)/$a/$d)): \
628 $$(if $$(call symlink-ok-p,$$@,../$$(notdir $$(patsubst %/,%,$$@))),,_force)
629 $(V_AT)mkdir -p $(dir $(patsubst %/,%,$@))
630 $(call v_tag,SYMLINK)ln -sf ../$(notdir $(patsubst %/,%,$@)) $(patsubst %/,%,$@)
632 ###--------------------------------------------------------------------------
633 ### Main chroot maintenance.
637 JOBS = chroot cross-tools pkg-build
641 MAINT = +$(call v_tag,RUN)\
642 PYTHONPATH=$(STATE)/lib/python $(STATE)/bin/chroot-maint \
646 $(MAINT) -f$(FRESH) $(JOBS)
649 ###--------------------------------------------------------------------------
650 ### Other maintenance targets.
661 ###----- That's all, folks --------------------------------------------------