Commit | Line | Data |
---|---|---|
e36b4f25 MW |
1 | ### -*-makefile-*- |
2 | ### | |
3 | ### Main maintenance script for chroots | |
4 | ### | |
5 | ### (c) 2018 Mark Wooding | |
6 | ### | |
7 | ||
8 | ###----- Licensing notice --------------------------------------------------- | |
9 | ### | |
10 | ### This file is part of the distorted.org.uk chroot maintenance tools. | |
11 | ### | |
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. | |
16 | ### | |
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. | |
21 | ### | |
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, | |
25 | ### USA. | |
26 | ||
27 | all:: | |
28 | clean:: | |
3e5b03e2 MW |
29 | check:: |
30 | .PHONY: all clean check | |
e36b4f25 MW |
31 | .SECONDEXPANSION: #sorry |
32 | ||
33 | ###-------------------------------------------------------------------------- | |
34 | ### Configuration. | |
35 | ||
36 | CONFIG_VARS = | |
37 | ||
3e5b03e2 MW |
38 | ## Level of pickiness to aspire to. |
39 | NOTIFY_FATAL = 1 | |
40 | ||
e36b4f25 MW |
41 | ## Volume group from which to allocate chroot volumes and snapshots. |
42 | CONFIG_VARS += VG LVPREFIX | |
afb5d051 | 43 | VG := vg-$(shell hostname) |
e36b4f25 MW |
44 | LVPREFIX = |
45 | ||
46 | ## Logical volume size, as an LVM option. | |
3e5b03e2 | 47 | CONFIG_VARS += LVSZ SNAPOPT |
e36b4f25 | 48 | LVSZ = -L8G |
3e5b03e2 | 49 | SNAPOPT = -L8G |
e36b4f25 MW |
50 | |
51 | ## Debian mirror. | |
52 | CONFIG_VARS += DEBMIRROR | |
53 | DEBMIRROR = http://deb.debian.org/debian/ | |
54 | ||
55 | ## APT sources configurations. (Also, $($d_APTSRC) for each $d in $(DISTS).) | |
56 | CONFIG_VARS += APTSRC | |
57 | APTSRC = etc/aptsrc.conf $(wildcard etc/aptsrc.local.conf) | |
58 | ||
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 | |
a98c9dba MW |
61 | ## place, set $(_$f_APTCONFSRC). |
62 | CONFIG_VARS += APTCONF $(foreach f,$(APTCONF),_$f_APTCONFSRC) | |
63 | APTCONF = $(notdir $(wildcard etc/apt-conf.d/[0-9]*[!~])) | |
e36b4f25 MW |
64 | |
65 | ## Proxy setting. | |
66 | CONFIG_VARS += PROXY | |
4d529157 | 67 | PROXY = $(shell \ |
a98c9dba | 68 | eval $$(apt-config $(foreach a,$(APTCONF),-cetc/apt-conf.d/$a) \ |
e36b4f25 MW |
69 | shell proxy Acquire::http::proxy); \ |
70 | case $${proxy+t} in (t) echo "$$proxy" ;; (*) echo nil ;; esac) | |
71 | ||
72 | ## Debian distributions to support. | |
73 | CONFIG_VARS += PRIMARY_DIST DISTS | |
74 | PRIMARY_DIST = stretch | |
75 | DISTS = $(PRIMARY_DIST) buster bullseye sid | |
76 | ||
77 | ## Host's native architecture(s). | |
78 | CONFIG_VARS += MYARCH NATIVE_ARCHS | |
afb5d051 MW |
79 | MYARCH := $(shell dpkg --print-architecture) |
80 | OTHERARCHS := $(shell dpkg --print-foreign-architectures) | |
e36b4f25 MW |
81 | NATIVE_ARCHS = $(MYARCH) $(OTHERARCHS) |
82 | ||
83 | ## Foreign (emulated) architectures to support. | |
84 | CONFIG_VARS += FOREIGN_ARCHS | |
85 | FOREIGN_ARCHS = | |
86 | ||
87 | ## Master lists of chroots to build and maintain. | |
a98c9dba | 88 | CONFIG_VARS += NATIVE_CHROOTS FOREIGN_CHROOTS |
e36b4f25 MW |
89 | NATIVE_CHROOTS = $(foreach a,$(NATIVE_ARCHS), \ |
90 | $(foreach d,$(or $($a_DISTS) $(DISTS)), \ | |
91 | $d-$a)) | |
92 | FOREIGN_CHROOTS = $(foreach a,$(FOREIGN_ARCHS), \ | |
93 | $(foreach d,$(or $($a_DISTS) $(DISTS)), \ | |
94 | $d-$a)) | |
95 | ||
a98c9dba MW |
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 | |
106 | ||
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) | |
115 | ||
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 | |
119 | CROSS_PATHS += \ | |
120 | $(addprefix /usr/bin/, \ | |
121 | apt apt-cache apt-config apt-get apt-key apt-mark) \ | |
122 | $(addprefix /usr/lib/apt/, \ | |
123 | methods/ solvers/) \ | |
124 | $(addprefix /bin/, \ | |
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 \ | |
127 | true uname vdir) \ | |
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.*) \ | |
140 | /usr/bin/gpgv \ | |
141 | /usr/bin/qemu-*-static \ | |
142 | $(addprefix /bin/, \ | |
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 \ | |
154 | strip) \ | |
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/) | |
3e5b03e2 MW |
159 | |
160 | ## Local packages to be compiled and installed in chroots. Archives can be | |
161 | ## found in `pkg/'. | |
a98c9dba | 162 | CONFIG_VARS += LOCALPKGS $(foreach p,$(LOCALPKGS),$p_DEPS) |
3e5b03e2 | 163 | LOCALPKGS = mLib checkpath |
a98c9dba MW |
164 | mLib_DEPS = |
165 | checkpath_DEPS = mLib | |
3e5b03e2 | 166 | |
e36b4f25 MW |
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)) | |
173 | ||
a98c9dba | 174 | CONFIG_VARS += $(foreach a,$(FOREIGN_ARCHS),$a_QEMUHOST) |
e36b4f25 MW |
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) | |
180 | ||
181 | ## Qemu architecture names. These tell us which Qemu binary to use for a | |
182 | ## particular Debian architecture. | |
a98c9dba | 183 | CONFIG_VARS += $(foreach a,$(FOREIGN_ARCHS),$a_QEMUARCH) |
e36b4f25 MW |
184 | armel_QEMUARCH = arm |
185 | armhf_QEMUARCH = arm | |
186 | arm64_QEMUARCH = aarch64 | |
187 | i386_QEMUARCH = i386 | |
188 | amd64_QEMUARCH = x86_64 | |
189 | ||
190 | ## Alias mapping for chroots. | |
a98c9dba | 191 | CONFIG_VARS += $(foreach d,$(DISTS),$d_ALIASES) |
e36b4f25 MW |
192 | stretch_ALIASES = oldstable |
193 | buster_ALIASES = stable | |
a98c9dba | 194 | bullseye_ALIASES = testing |
e36b4f25 MW |
195 | sid_ALIASES = unstable |
196 | ||
197 | ## Which host architecture to use for commonly used tools in foreign chroots. | |
198 | CONFIG_VARS += TOOLSARCH | |
199 | TOOLSARCH = $(MYARCH) | |
200 | ||
201 | ## A directory in which we can maintain private files and state. | |
202 | CONFIG_VARS += STATE | |
203 | STATE = state | |
204 | ||
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. | |
8918e451 | 207 | CONFIG_VARS += LOCAL ABSLOCAL |
e36b4f25 | 208 | LOCAL = local.schroot |
8918e451 | 209 | ABSLOCAL = $(abspath $(LOCAL)) |
e36b4f25 MW |
210 | |
211 | ## How to run a command as a privileged user. | |
a98c9dba | 212 | CONFIG_VARS += ROOTLY |
e36b4f25 MW |
213 | ROOTLY = sudo |
214 | ||
215 | ## Files to be copied into a chroot from the host. | |
216 | SCHROOT_COPYFILES = /etc/resolv.conf | |
217 | SCHROOT_NSSDATABASES = passwd shadow group gshadow | |
218 | ||
219 | ## Local configuration hook. | |
220 | -include local.mk | |
221 | ||
222 | ## All chroot names. | |
3e5b03e2 MW |
223 | CONFIG_VARS += ALL_ARCHS ALL_CHROOTS |
224 | ALL_ARCHS = $(NATIVE_ARCHS) $(FOREIGN_ARCHS) | |
e36b4f25 MW |
225 | ALL_CHROOTS = $(NATIVE_CHROOTS) $(FOREIGN_CHROOTS) |
226 | ||
a98c9dba MW |
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)) | |
232 | ||
e36b4f25 MW |
233 | ###-------------------------------------------------------------------------- |
234 | ### Utilities. | |
235 | ||
3e5b03e2 MW |
236 | ## Hack to force rebuilding. |
237 | _force: | |
238 | .PHONY: _force | |
239 | ||
240 | ## Hack to not delimit function arguments. (Ugh!) | |
241 | comma = , | |
242 | ||
243 | ## Silent-rules machinery. | |
244 | V = 0 | |
245 | V_AT = $(V_AT_$V) | |
246 | V_AT_0 = @ | |
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) | |
255 | v_echo_0 = : | |
256 | v_echo_1 = printf "%s\n" $1 | |
257 | CLEANFILES += log/*.log | |
258 | ||
259 | ## Oh, shut up. | |
260 | SILENCE_LVM = \ | |
261 | LVM_SUPPRESS_FD_WARNINGS=1; export LVM_SUPPRESS_FD_WARNINGS | |
262 | ||
a98c9dba MW |
263 | ## $(call definedp,VAR) |
264 | ## | |
265 | ## Expand non-empty if and only if VAR is defined (but possibly empty). | |
266 | definedp = $(filter-out undefined,$(origin $1)) | |
267 | ||
3e5b03e2 MW |
268 | ## $(call catchrc,...$(call throwrc,CMD)...) |
269 | ## | |
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; } | |
273 | ||
274 | ## $(call squote,TXT) | |
275 | ## | |
276 | ## Single-quote TXT. | |
277 | squote = '$(subst ','\\'',$1)' | |
278 | ||
e36b4f25 MW |
279 | ## $(call chroot-dist,D-A) -> D |
280 | ## $(call chroot-arch,D-A) -> A | |
281 | ## | |
282 | ## Parse chroot descriptions. | |
283 | chroot-dist = $(patsubst %/,%,$(dir $(subst -,/,$1))) | |
284 | chroot-arch = $(notdir $(subst -,/,$1)) | |
285 | ||
3e5b03e2 MW |
286 | ## $(call package-dir-name,P-V) -> P |
287 | ## $(call package-dir-version,P-V) -> V | |
288 | ## | |
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) | |
292 | ||
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 | |
297 | ## | |
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)) | |
303 | ||
e36b4f25 MW |
304 | ## $(call native-chroot-p,D-A) -> D | <empty> |
305 | ## | |
306 | ## Answer whether D-A is a native chroot. | |
3e5b03e2 | 307 | native-chroot-p = $(filter $(call chroot-arch,$1),$(NATIVE_ARCHS)) |
e36b4f25 MW |
308 | |
309 | ## $(call chroot-qemuhost,D-A) -> AA | |
310 | ## | |
311 | ## Answer the apporopriate Qemu host architecture for foreign chroot D-A. | |
312 | chroot-qemuhost = $($(call chroot-arch,$1)_QEMUHOST) | |
313 | ||
3e5b03e2 | 314 | ## $(call chroot-deps,PRE,D-A) -> PREDD-AA ... | <empty> |
e36b4f25 MW |
315 | ## |
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),, \ | |
3e5b03e2 MW |
320 | $(addprefix $1$(call chroot-dist,$2)-,\ |
321 | $(sort $(TOOLSARCH) \ | |
e36b4f25 MW |
322 | $(call chroot-qemuhost,$2)))) |
323 | ||
324 | ## Substituting placeholders in files. | |
325 | SUBSTITUTIONS := local=$(shell realpath $(LOCAL)) | |
326 | SUBSTITUTIONS += primary-dist=$(PRIMARY_DIST) | |
327 | subst-file = { \ | |
328 | echo "$1 GENERATED by distorted-chroot: do not edit"; \ | |
329 | substs=""; \ | |
330 | for v in $(SUBSTITUTIONS); do \ | |
331 | var=$${v%%=*} value=$${v\#*=}; \ | |
332 | substs="$$substs s\a@$$var@\a$$value\ag;"; \ | |
333 | done; \ | |
334 | sed "$$substs"; \ | |
335 | } | |
336 | ||
3e5b03e2 MW |
337 | ### $(call symlink-ok-p,LINK,DEST) |
338 | ### | |
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) | |
342 | ||
343 | ### $(call general-notify,SEV,COLOUR,PREFIX,MSG) | |
344 | ### | |
345 | ### Report a message, highlighted in the right way, and maybe fail | |
346 | general-notify = { \ | |
347 | echo "$$(tput bold; tput setaf $2)$3 "$4"$$(tput sgr0; tput op)"; \ | |
348 | if [ "$1" -le "$(NOTIFY_FATAL)" ]; then exit 2; fi; \ | |
349 | } | |
350 | ||
351 | ### $(call report/SEV,MSG) | |
352 | ### | |
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) | |
357 | ||
358 | ## $(call check,SEV,MSG,UNLESS) | |
359 | ## | |
360 | ## If UNLESS completes successfully, all is OK; otherwise print MSG to stderr | |
361 | ## and fail. | |
362 | check = @{ \ | |
363 | $(call v_echo,'check: '$(call squote,$3)''); \ | |
364 | if ! { $3; }; then $(call notify/$1,$2); fi; \ | |
365 | } | |
366 | ||
367 | ## $(call check-executable,SEV,PATH) | |
368 | ## | |
369 | ## Verify that PATH is an executable program. | |
370 | check-executable = $(call check,$1,"\`$2' is not an executable", \ | |
371 | [ -x "$2" ]) | |
372 | ||
373 | ## $(call check-mountpoint,SEV,DIR) | |
374 | ## | |
375 | ## Verify that DIR is a mountpoint. | |
376 | check-mountpoint = $(call check,$1,"\`$2' is not a mount point", \ | |
377 | mountpoint -q "$2") | |
378 | ||
379 | ## $(call check-symlink,SEV,LINK,DEST) | |
380 | ## | |
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" ]) | |
384 | ||
a4c5d71a MW |
385 | ###-------------------------------------------------------------------------- |
386 | ### Python extensions. | |
387 | ||
388 | CC = gcc | |
389 | CFLAGS = -O2 -g -Wall | |
390 | ||
391 | LD = $(CC) | |
392 | LDFLAGS = | |
393 | ||
394 | c-source = $(foreach c,$1,src/$c) | |
395 | c-object = $(foreach c,$1,$(STATE)/obj/$(basename $c).o) | |
396 | ||
397 | PYEXT_PKGFLAGS := $(shell pkg-config --cflags python2) | |
398 | PYEXT_CFLAGS = -fPIC -fno-strict-aliasing $(PYEXT_PKGFLAGS) | |
399 | PYEXT_LDFLAGS = -shared | |
400 | ||
401 | PYEXTS += jobclient | |
402 | jobclient_SOURCES = jobclient.c | |
403 | ||
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$@ $< | |
411 | ||
412 | PYMODULES = $(foreach x,$(PYEXTS),$(STATE)/lib/python/$x.so) | |
413 | all:: $(PYMODULES) | |
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$@ $^ | |
417 | ||
3e5b03e2 MW |
418 | ###-------------------------------------------------------------------------- |
419 | ### Scripts. | |
420 | ||
a98c9dba | 421 | SCRIPTS += chroot-maint |
3e5b03e2 | 422 | SCRIPTS += mkchrootconf |
3e5b03e2 MW |
423 | |
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){ \ | |
429 | sed \ | |
430 | -e '2i### GENERATED by distorted-chroot: do not edit' \ | |
431 | -e '/@@@config@@@/ {' \ | |
432 | -e 'r $(STATE)/config.sh' \ | |
433 | -e 'd'\ | |
434 | -e '}' $<; \ | |
435 | } >$@.new && chmod +x $@.new && mv $@.new $@ | |
e36b4f25 MW |
436 | |
437 | ###-------------------------------------------------------------------------- | |
438 | ### APT configuration. | |
439 | ||
440 | ## In a chroot, `/etc/apt/sources.list' links to | |
441 | ## `/usr/local.schroot/etc/apt/sources.$d' for the appropriate distribution. | |
4004ed52 | 442 | APT_SOURCES = $(foreach d,$(DISTS),$(LOCAL)/etc/apt/sources.$d) |
e36b4f25 MW |
443 | all:: $(APT_SOURCES) |
444 | ||
4004ed52 | 445 | $(foreach d,$(DISTS),$(STATE)/etc/apt/aptsrc.$d): $(STATE)/etc/apt/aptsrc.%: |
e36b4f25 MW |
446 | $(V_AT)mkdir -p $(dir $@) |
447 | $(call v_tag,GEN){ \ | |
448 | echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \ | |
449 | echo "subscribe"; \ | |
450 | echo " debian : $*"; \ | |
451 | } >$@.new && mv $@.new $@ | |
452 | ||
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 $@ | |
0539140c | 459 | CLEANFILES += $(APT_SOURCES) |
e36b4f25 MW |
460 | |
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)) | |
464 | all:: $(APT_CONFIGS) | |
465 | $(APT_CONFIGS): $(LOCAL)/etc/apt/apt.conf.d/%: \ | |
a98c9dba | 466 | $$(or $$(_$$*_APTCONFSRC) etc/apt-conf.d/$$*) |
e36b4f25 MW |
467 | $(V_AT)mkdir -p $(dir $@) |
468 | $(call v_tag,COPY)cp $< $@.new && mv $@.new $@ | |
3e5b03e2 MW |
469 | clean::; rm -f $(APT_CONFIGS) |
470 | ||
471 | ###-------------------------------------------------------------------------- | |
472 | ### Build hacks. | |
473 | ||
474 | check::; $(call check-executable,ERR,/usr/bin/eatmydata) | |
475 | ||
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) | |
484 | ||
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) | |
e36b4f25 MW |
492 | |
493 | ###-------------------------------------------------------------------------- | |
494 | ### `schroot' and `sbuild' configuration. | |
495 | ||
496 | all:: schroot-config | |
497 | schroot-config:: | |
498 | .PHONY: schroot-config | |
499 | ||
3e5b03e2 MW |
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) | |
503 | ||
e36b4f25 MW |
504 | %print-varlist = { \ |
505 | echo "\#\#\# -*-sh-*- GENERATED by distorted-chroot: do not edit"; \ | |
a98c9dba MW |
506 | $(foreach v,$1,$(if $(call definedp,$v),\ |
507 | echo $v=\'$(call squote,$($v))\';)) \ | |
fb28f2a8 | 508 | } |
e36b4f25 MW |
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-* | |
6ccac28c | 516 | $(call v_tag,GEN)$(call %print-varlist,$(CONFIG_VARS)) \ |
e36b4f25 MW |
517 | >$@.new && mv $@.new $@ |
518 | ||
519 | schroot-config:: $(STATE)/config.sh | |
520 | $(STATE)/config.sh: $(schroot-config_FILE) | |
521 | $(call v_tag,SYMLINK)ln -sf $(notdir $<) $@ | |
522 | ||
67a8479c MW |
523 | schroot-config:: $(LOCAL)/etc/schroot/sbuild.schroot |
524 | $(LOCAL)/etc/schroot/sbuild.schroot: $(STATE)/bin/mkchrootconf | |
e36b4f25 | 525 | $(V_AT)mkdir -p $(dir $@) |
3e5b03e2 MW |
526 | $(call v_tag,GEN)$(STATE)/bin/mkchrootconf >$@.new && \ |
527 | $(ROOTLY) chown root:root $@.new && mv $@.new $@ | |
67a8479c | 528 | CLEANFILES += $(LOCAL)/etc/schroot/sbuild.schroot |
8918e451 | 529 | check::; $(call check-symlink,WARN,/etc/schroot/chroot.d/sbuild,$(ABSLOCAL)/etc/schroot/sbuild.schroot) |
e36b4f25 | 530 | |
67a8479c MW |
531 | schroot-config:: $(LOCAL)/etc/schroot/sbuild.profile/copyfiles |
532 | $(LOCAL)/etc/schroot/sbuild.profile/copyfiles: $(schroot-config_STAMP) | |
e36b4f25 MW |
533 | $(V_AT)mkdir -p $(dir $@) |
534 | $(call v_tag,GEN){ \ | |
535 | echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \ | |
536 | for i in $(SCHROOT_COPYFILES); do echo "$$i"; done; \ | |
537 | } >$@.new && mv $@.new $@ | |
67a8479c | 538 | CLEANFILES += $(LOCAL)/etc/schroot/sbuild.profile/copyfiles |
e36b4f25 | 539 | |
67a8479c MW |
540 | schroot-config:: $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases |
541 | $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases: $(schroot-config_STAMP) | |
e36b4f25 MW |
542 | $(V_AT)mkdir -p $(dir $@) |
543 | $(call v_tag,GEN){ \ | |
544 | echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \ | |
545 | for i in $(SCHROOT_NSSDATABASES); do echo "$$i"; done; \ | |
546 | } >$@.new && mv $@.new $@ | |
67a8479c | 547 | CLEANFILES += $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases |
e36b4f25 | 548 | |
67a8479c MW |
549 | schroot-config:: $(LOCAL)/etc/schroot/sbuild.profile/fstab |
550 | $(LOCAL)/etc/schroot/sbuild.profile/fstab: \ | |
e36b4f25 MW |
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 $@ | |
67a8479c | 555 | CLEANFILES += $(LOCAL)/etc/schroot/sbuild.profile/fstab |
e36b4f25 | 556 | |
8918e451 | 557 | check::; $(call check-symlink,WARN,/etc/schroot/sbuild,$(ABSLOCAL)/etc/schroot/sbuild.profile) |
3e5b03e2 | 558 | |
67a8479c MW |
559 | schroot-config:: $(LOCAL)/etc/sbuild.conf |
560 | $(LOCAL)/etc/sbuild.conf: etc/sbuild.conf.in $(schroot-config_STAMP) | |
e36b4f25 MW |
561 | $(V_AT)mkdir -p $(dir $@) |
562 | $(call v_tag,SUBST)$(call subst-file,### -*-perl-*-) \ | |
563 | <$< >$@.new && mv $@.new $@ | |
67a8479c | 564 | CLEANFILES += $(LOCAL)/etc/sbuild.conf |
8918e451 | 565 | check::; $(call check-symlink,WARN,/etc/sbuild/sbuild.conf,$(ABSLOCAL)/etc/sbuild.conf) |
d56d9258 | 566 | check::; $(call check-executable,WARN,/usr/local.schroot/hacks/apt-get) |
e36b4f25 | 567 | |
3e5b03e2 MW |
568 | SCHROOT_SCRIPTS += 11private |
569 | SCHROOT_SCRIPTS += 15binfmt | |
570 | SCHROOT_SCRIPTS += 51chrootenv | |
67a8479c | 571 | COPY_SCHROOT_SCRIPTS = $(addprefix $(LOCAL)/etc/schroot/setup.d/,$(SCHROOT_SCRIPTS)) |
3e5b03e2 MW |
572 | schroot-config:: $(COPY_SCHROOT_SCRIPTS) |
573 | $(COPY_SCHROOT_SCRIPTS): \ | |
67a8479c | 574 | $(LOCAL)/etc/schroot/setup.d/%: etc/schroot-scripts/% |
3e5b03e2 MW |
575 | $(V_AT)mkdir -p $(dir $@) |
576 | $(call v_tag,COPY)cp $< $@.new && mv $@.new $@ | |
67a8479c | 577 | CLEANFILES += $(COPY_SCHROOT_SCRIPTS) |
3e5b03e2 MW |
578 | |
579 | CHECK_SCHROOT_SCRIPTS = $(addprefix check-script/,$(SCHROOT_SCRIPTS)) | |
580 | check:: $(CHECK_SCHROOT_SCRIPTS) | |
581 | $(CHECK_SCHROOT_SCRIPTS): check-script/%: | |
8918e451 | 582 | $(call check-symlink,WARN,/etc/schroot/setup.d/$*,$(ABSLOCAL)/etc/schroot/setup.d/$*) |
3e5b03e2 MW |
583 | .PHONY: $(addprefix check-script/,$(SCHROOT_SCRIPTS)) |
584 | ||
585 | ###-------------------------------------------------------------------------- | |
0a9fcbbc MW |
586 | ### Ccache setup. |
587 | ||
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: \ | |
592 | etc/ccache.conf | |
593 | $(V_AT)mkdir -p $(dir $@) | |
594 | $(call v_tag,COPY)cp $< $@.new && mv $@.new $@ | |
595 | ||
596 | ###-------------------------------------------------------------------------- | |
3e5b03e2 MW |
597 | ### `/usr/local/' structure. |
598 | ||
599 | LOCAL_COMMON_DIRS = share/ src/ | |
27922408 MW |
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): | |
3e5b03e2 MW |
603 | $(V_AT)mkdir -p $(dir $(patsubst %/,%,$@)) |
604 | $(call v_tag,MKDIR)mkdir $@ | |
605 | ||
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),\ | |
610 | $(LOCAL)/$a/ \ | |
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)) | |
614 | ||
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 %/,%,$@) | |
631 | ||
e36b4f25 | 632 | ###-------------------------------------------------------------------------- |
a98c9dba | 633 | ### Main chroot maintenance. |
e36b4f25 | 634 | |
a98c9dba MW |
635 | OPTS = |
636 | FRESH = create | |
637 | JOBS = chroot cross-tools pkg-build | |
638 | ||
639 | MAINTQ_ = -q | |
640 | MAINTQ_0 = -q | |
641 | MAINT = +$(call v_tag,RUN)\ | |
642 | PYTHONPATH=$(STATE)/lib/python $(STATE)/bin/chroot-maint \ | |
643 | $(MAINTQ_$V) $(OPTS) | |
644 | ||
645 | maint: all check | |
646 | $(MAINT) -f$(FRESH) $(JOBS) | |
647 | .PHONY: maint | |
e36b4f25 MW |
648 | |
649 | ###-------------------------------------------------------------------------- | |
650 | ### Other maintenance targets. | |
651 | ||
652 | show:; : $x | |
653 | ||
654 | clean:: | |
655 | rm -f $(CLEANFILES) | |
656 | rm -rf $(STATE) | |
657 | ||
658 | realclean:: clean | |
659 | rm -rf $(LOCAL) | |
660 | ||
661 | ###----- That's all, folks -------------------------------------------------- |