xref: /openbsd-src/distrib/syspatch/bsd.syspatch.mk (revision bbda8d7c110a09da1631f6dc786d33c2dfb3d500)
1*bbda8d7cStb#	$OpenBSD: bsd.syspatch.mk,v 1.26 2020/05/24 16:48:35 tb Exp $
2deb47695Srobert#
32b986ce7Srobert# Copyright (c) 2016-2017 Robert Nagy <robert@openbsd.org>
4deb47695Srobert#
5deb47695Srobert# Permission to use, copy, modify, and distribute this software for any
6deb47695Srobert# purpose with or without fee is hereby granted, provided that the above
7deb47695Srobert# copyright notice and this permission notice appear in all copies.
8deb47695Srobert#
9deb47695Srobert# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10deb47695Srobert# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11deb47695Srobert# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12deb47695Srobert# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13deb47695Srobert# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14deb47695Srobert# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15deb47695Srobert# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16deb47695Srobert
17deb47695Srobert.include <bsd.own.mk>
18deb47695Srobert
19deb47695SrobertERRATA?=
202b986ce7SrobertECURR=${ERRATA:C/_.*//}
212b986ce7SrobertEPREV!=echo ${ECURR} | awk '{printf "%03d\n", $$1 - 1;}'
22b79db08bSrobertEPREV_PATH!=echo ${FAKEROOT}/syspatch/${OSrev}-${EPREV}*
23deb47695Srobert
2464d740adSrobert# use the base and xenocara build user
2564d740adSrobertBUILDUSER?=	build
2664d740adSrobert
27deb47695Srobert# binaries used by this makefile
28deb47695SrobertFETCH=		/usr/bin/ftp -Vm
29deb47695Srobert
30deb47695Srobert# make sure to only use the original OpenBSD mirror
3104cdf172SajacoutotMIRROR=		https://ftp.openbsd.org/pub/OpenBSD/patches/${OSREV}/common
32deb47695Srobert
33438d51ccSrobert# build type defaults to src
34438d51ccSrobertBUILD?=		src
35438d51ccSrobert
36438d51ccSrobertSYSPATCH_BASE=	syspatch${OSrev}-${ERRATA}
37438d51ccSrobertSYSPATCH_SHRT=	${OSrev}-${ERRATA}
38438d51ccSrobert
39deb47695Srobert# the final name of the syspatch tarball
40438d51ccSrobertSYSPATCH=	${SYSPATCH_BASE}.tgz
41deb47695Srobert
42deb47695Srobert# arguments used by different tools
43deb47695SrobertMTREE_FILES=	/etc/mtree/4.4BSD.dist
44deb47695SrobertMTREE_ARGS=	-qdep ${FAKE} -U
45168c54d8SrobertSIGNIFY_KEY=	/etc/signify/openbsd-${OSrev}-base.pub
46deb47695SrobertPATCH_STRIP?=	-p0
47deb47695SrobertPATCH_ARGS=	-d ${SRCDIR} -z .orig --forward --quiet -E ${PATCH_STRIP}
48deb47695Srobert
49deb47695Srobert# miscellaneous variables
50438d51ccSrobertSYSPATCH_DIR=	${FAKE}/var/syspatch/${SYSPATCH_SHRT}
51438d51ccSrobertFAKE=		${FAKEROOT}/syspatch/${SYSPATCH_SHRT}
52d7830648SajacoutotKERNEL=		$$(sysctl -n kern.osversion | cut -d '\#' -f 1)
53deb47695Srobert
54deb47695Srobert_PATCH_COOKIE=	${ERRATA}/.patch_done
55deb47695Srobert_BUILD_COOKIE=	${ERRATA}/.build_done
56deb47695Srobert_FAKE_COOKIE=	${ERRATA}/.fake_done
57deb47695Srobert
58f0110f5bSajacoutot.if ${BUILD:L:Msrc} || ${BUILD:L:Mkernel}
59deb47695SrobertSRCDIR=		${BSDSRCDIR}
60deb47695Srobert.elif ${BUILD:L:Mxenocara}
61900125ccSajacoutotXSRCDIR?=	/usr/xenocara
62f0110f5bSajacoutotSRCDIR=		${XSRCDIR}
63deb47695SrobertMTREE_FILES+=	/etc/mtree/BSD.x11.dist
64deb47695Srobert.endif
65deb47695Srobert
66deb47695Srobert.MAIN: all
67aa478f6cSrobertall: ${_BUILD_COOKIE}
68deb47695Srobert
69deb47695Srobert.if !target(clean)
70deb47695Srobertclean:
71d96a07ceSnaddy	rm -rf ${ERRATA} ${SYSPATCH}
72deb47695Srobert.endif
73deb47695Srobert
742b986ce7Srobertdepend:
752b986ce7Srobert
76deb47695Srobertcleandir: clean
77deb47695Srobert
78438d51ccSrobert${_FAKE_COOKIE}:
79*bbda8d7cStb.if !empty(ERRATA:C/[[:digit:]]{3}_[[:alnum:]_-]+//)
809564001fSrobert	@{ echo "***>   invalid errata format: ${ERRATA}"; \
819564001fSrobert	exit 1; };
829564001fSrobert.endif
83438d51ccSrobert.ifndef FAKEROOT
84438d51ccSrobert	@{ echo "***>   setenv FAKEROOT before doing that!"; \
85438d51ccSrobert	exit 1; };
86438d51ccSrobert.else
87cfa8871bSrobert	@if [[ `id -u` -ne 0 ]]; then \
88cfa8871bSrobert		{ echo "***>   $@ must be called by root"; \
89cfa8871bSrobert		exit 1; }; \
90cfa8871bSrobert	fi
91438d51ccSrobert	@destmp=`df -P ${FAKEROOT} | awk 'END { print $$6 }'`; \
92cfa8871bSrobert	if ! mount | grep -q " $${destmp} .*noperm"; then \
93438d51ccSrobert		echo ${FAKEROOT} must be on a noperm filesystem >&2; \
94cfa8871bSrobert		false; \
95cfa8871bSrobert	fi; \
96cfa8871bSrobert	if [[ `stat -f '%Su %Lp' $${destmp}` != '${BUILDUSER} 700' ]]; then \
97cfa8871bSrobert		echo $${destmp} must have owner BUILDUSER and mode 700 >&2; \
98cfa8871bSrobert		false; \
99cfa8871bSrobert	fi
100b79db08bSrobert	@test -f ${EPREV_PATH}/usr/lib/crt0.o || \
1012b986ce7Srobert		{ echo "***>   previous (${EPREV}) syspatch build is missing"; \
1022b986ce7Srobert		exit 1; }; \
1032b986ce7Srobert	echo '>> Copying previous syspatch fakeroot to ${FAKE}'; \
1042b986ce7Srobert	${INSTALL} -d -m 755 ${SYSPATCH_DIR}; \
105b79db08bSrobert	cd ${EPREV_PATH} && tar cf - . | \
1062b986ce7Srobert		(cd ${FAKE} && tar xpf - )
1072b986ce7Srobert	@${INSTALL} ${INSTALL_COPY} -o ${SHAREOWN} -g ${SHAREGRP} -m ${SHAREMODE} \
108cfa8871bSrobert		${ERRATA}/${ERRATA}.patch.sig ${SYSPATCH_DIR}
109cfa8871bSrobert
110deb47695Srobert.for _m in ${MTREE_FILES}
111cfa8871bSrobert	@su ${BUILDUSER} -c '/usr/sbin/mtree ${MTREE_ARGS} -f ${_m}' >/dev/null
112deb47695Srobert.endfor
113cfa8871bSrobert	@su ${BUILDUSER} -c 'touch $@'
114cfa8871bSrobert.endif
115deb47695Srobert
116417cbef9Stb${ERRATA}/${ERRATA}.patch.sig:
117cfa8871bSrobert	@su ${BUILDUSER} -c '${INSTALL} -d -m 755 ${ERRATA}' && \
118417cbef9Stb	echo '>> Fetching & Verifying ${MIRROR}/${.TARGET:T}'; \
119417cbef9Stb	su ${BUILDUSER} -c '${FETCH} -o ${ERRATA}/${.TARGET:T} \
120417cbef9Stb		${MIRROR}/${.TARGET:T}'
121417cbef9Stb
122417cbef9Stb${ERRATA}/${ERRATA}.patch: ${ERRATA}/${ERRATA}.patch.sig
123417cbef9Stb	@su ${BUILDUSER} -c '/usr/bin/signify -Vep ${SIGNIFY_KEY} -x \
124417cbef9Stb		${ERRATA}/${.TARGET:T}.sig -m ${.TARGET}'
125deb47695Srobert
126deb47695Srobert${_PATCH_COOKIE}: ${ERRATA}/${ERRATA}.patch
1272b986ce7Srobert	@echo '>> Applying ${ERRATA}.patch'; \
128eb56a81aSajacoutot	/usr/bin/patch ${PATCH_ARGS} < ${ERRATA}/${ERRATA}.patch || \
129deb47695Srobert		{ echo "***>   ${ERRATA}.patch did not apply cleanly"; \
130deb47695Srobert		exit 1; };
131cfa8871bSrobert	@su ${BUILDUSER} -c 'touch $@'
132deb47695Srobert
133438d51ccSrobert.ifdef DESTDIR
134438d51ccSrobert${_BUILD_COOKIE}: ${_PATCH_COOKIE} ${_FAKE_COOKIE}
135438d51ccSrobert	@{ echo "***>   cannot set DESTDIR here!"; \
136438d51ccSrobert	exit 1; };
137438d51ccSrobert.elif !defined(FAKEROOT)
138438d51ccSrobert${_BUILD_COOKIE}: ${_PATCH_COOKIE} ${_FAKE_COOKIE}
139438d51ccSrobert	@{ echo "***>   setenv FAKEROOT before doing that!"; \
140438d51ccSrobert	exit 1; };
141438d51ccSrobert.else
142438d51ccSrobert${_BUILD_COOKIE}: ${_PATCH_COOKIE} ${_FAKE_COOKIE}
1432b986ce7Srobert	@echo '>> Building syspatch for ${ERRATA}'
1442b986ce7Srobert.if ${BUILD:L:Msrc}
1452b986ce7Srobert. for _t in clean obj build
146b79db08bSrobert	@cd ${SRCDIR} && /usr/bin/make SYSPATCH_PATH=${EPREV_PATH} ${_t}
147aa478f6cSrobert. endfor
148b79db08bSrobert	@su ${BUILDUSER} -c "cd ${SRCDIR} && make SYSPATCH_PATH=${EPREV_PATH} DESTDIR=${FAKE} install"
1492b986ce7Srobert.elif ${BUILD:L:Mxenocara}
1502b986ce7Srobert. for _t in clean bootstrap obj build
151b79db08bSrobert	@cd ${SRCDIR} && /usr/bin/make SYSPATCH_PATH=${EPREV_PATH} ${_t}
1522b986ce7Srobert. endfor
153b79db08bSrobert	@su ${BUILDUSER} -c "cd ${SRCDIR} && make SYSPATCH_PATH=${EPREV_PATH} DESTDIR=${FAKE} install"
154aa478f6cSrobert.elif ${BUILD:L:Mkernel}
155b79db08bSrobert. for _t in clean obj
156b79db08bSrobert	@cd ${SRCDIR} && /usr/bin/make SYSPATCH_PATH=${EPREV_PATH} ${_t}
157bc74588bSrobert. endfor
158b79db08bSrobert	@cd ${SRCDIR} && make SYSPATCH_PATH=${EPREV_PATH} DESTDIR=${FAKE} includes
159aa478f6cSrobert.  for _kern in GENERIC GENERIC.MP
160e0dae1d9Sajacoutot	@if cd ${SRCDIR}/sys/arch/${MACHINE}/conf; then \
161438d51ccSrobert		if config ${_kern}; then \
162bc74588bSrobert			if cd ../compile/${_kern} && make clean && make ; then \
163438d51ccSrobert				exit 0; \
164438d51ccSrobert			fi; exit 1; \
165438d51ccSrobert		fi; exit 1; \
166438d51ccSrobert	fi;
167aa478f6cSrobert	@if [ ${_kern} = "GENERIC" ]; then \
1685f578a56Sajacoutot		su ${BUILDUSER} -c 'umask ${WOBJUMASK} && \
169e0dae1d9Sajacoutot		cd ${SRCDIR}/sys/arch/${MACHINE}/compile/GENERIC/obj && \
1705f578a56Sajacoutot		cp -p *.o Makefile ld.script makegap.sh \
1715ff18317Srobert		${FAKE}/usr/share/relink/kernel/GENERIC/' || \
1725f578a56Sajacoutot		{ echo "***>   failed to install ${_kern} object files"; \
173aa478f6cSrobert		exit 1; }; \
174aa478f6cSrobert	elif [ ${_kern} = "GENERIC.MP" ]; then \
1755f578a56Sajacoutot		su ${BUILDUSER} -c 'umask ${WOBJUMASK} && \
176e0dae1d9Sajacoutot		cd ${SRCDIR}/sys/arch/${MACHINE}/compile/GENERIC.MP/obj && \
1775f578a56Sajacoutot		cp -p *.o Makefile ld.script makegap.sh \
1785ff18317Srobert		${FAKE}/usr/share/relink/kernel/GENERIC.MP/' || \
1795f578a56Sajacoutot		{ echo "***>   failed to install ${_kern} object files"; \
180aa478f6cSrobert		exit 1; }; \
181aa478f6cSrobert	fi; exit 0
182aa478f6cSrobert.  endfor
183d7830648Sajacoutot# install newly built kernel on the build machine
184e0dae1d9Sajacoutot	@cd ${SRCDIR}/sys/arch/${MACHINE}/compile/${KERNEL} && \
185d7830648Sajacoutot		make install
186aa478f6cSrobert.endif
187cfa8871bSrobert	@su ${BUILDUSER} -c 'touch $@'
188cfa8871bSrobert.endif
189deb47695Srobert
190aa478f6cSrobertsyspatch: ${SYSPATCH}
191aa478f6cSrobert
192deb47695Srobert${SYSPATCH}: ${ERRATA}/.plist
193deb47695Srobert.for _m in ${MTREE_FILES}
194cfa8871bSrobert	@su ${BUILDUSER} -c '/usr/sbin/mtree ${MTREE_ARGS} -f ${_m}' >/dev/null
195deb47695Srobert.endfor
196cfa8871bSrobert	@su ${BUILDUSER} -c 'tar -Pczf ${.TARGET} -C ${FAKE} -I ${ERRATA}/.plist' || \
197deb47695Srobert		{ echo "***>   unable to create ${.TARGET}"; \
198deb47695Srobert		exit 1; };
199438d51ccSrobert	@echo ">> Created ${SYSPATCH}";
200deb47695Srobert
2012b986ce7Srobert${ERRATA}/.plist: ${_BUILD_COOKIE}
2022b986ce7Srobert	@echo ">> Creating the list of files to be included in ${SYSPATCH}"
203b79db08bSrobert	@su ${BUILDUSER} -c \
204b79db08bSrobert	'${.CURDIR}/diff.sh ${EPREV_PATH} ${FAKE} \
2052b986ce7Srobert		done > ${.TARGET}' || \
206deb47695Srobert		{ echo "***>   unable to create list of files";	\
207deb47695Srobert		exit 1; };
208ce65acf5Srobert	@su ${BUILDUSER} -c 'sed -i "s,^${FAKEROOT}/syspatch/${OSrev}-[^/]*/,,g" ${.TARGET}'
209deb47695Srobert
210deb47695Srobert.include <bsd.obj.mk>
211