xref: /openbsd-src/distrib/syspatch/bsd.syspatch.mk (revision bbda8d7c110a09da1631f6dc786d33c2dfb3d500)
1#	$OpenBSD: bsd.syspatch.mk,v 1.26 2020/05/24 16:48:35 tb Exp $
2#
3# Copyright (c) 2016-2017 Robert Nagy <robert@openbsd.org>
4#
5# Permission to use, copy, modify, and distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17.include <bsd.own.mk>
18
19ERRATA?=
20ECURR=${ERRATA:C/_.*//}
21EPREV!=echo ${ECURR} | awk '{printf "%03d\n", $$1 - 1;}'
22EPREV_PATH!=echo ${FAKEROOT}/syspatch/${OSrev}-${EPREV}*
23
24# use the base and xenocara build user
25BUILDUSER?=	build
26
27# binaries used by this makefile
28FETCH=		/usr/bin/ftp -Vm
29
30# make sure to only use the original OpenBSD mirror
31MIRROR=		https://ftp.openbsd.org/pub/OpenBSD/patches/${OSREV}/common
32
33# build type defaults to src
34BUILD?=		src
35
36SYSPATCH_BASE=	syspatch${OSrev}-${ERRATA}
37SYSPATCH_SHRT=	${OSrev}-${ERRATA}
38
39# the final name of the syspatch tarball
40SYSPATCH=	${SYSPATCH_BASE}.tgz
41
42# arguments used by different tools
43MTREE_FILES=	/etc/mtree/4.4BSD.dist
44MTREE_ARGS=	-qdep ${FAKE} -U
45SIGNIFY_KEY=	/etc/signify/openbsd-${OSrev}-base.pub
46PATCH_STRIP?=	-p0
47PATCH_ARGS=	-d ${SRCDIR} -z .orig --forward --quiet -E ${PATCH_STRIP}
48
49# miscellaneous variables
50SYSPATCH_DIR=	${FAKE}/var/syspatch/${SYSPATCH_SHRT}
51FAKE=		${FAKEROOT}/syspatch/${SYSPATCH_SHRT}
52KERNEL=		$$(sysctl -n kern.osversion | cut -d '\#' -f 1)
53
54_PATCH_COOKIE=	${ERRATA}/.patch_done
55_BUILD_COOKIE=	${ERRATA}/.build_done
56_FAKE_COOKIE=	${ERRATA}/.fake_done
57
58.if ${BUILD:L:Msrc} || ${BUILD:L:Mkernel}
59SRCDIR=		${BSDSRCDIR}
60.elif ${BUILD:L:Mxenocara}
61XSRCDIR?=	/usr/xenocara
62SRCDIR=		${XSRCDIR}
63MTREE_FILES+=	/etc/mtree/BSD.x11.dist
64.endif
65
66.MAIN: all
67all: ${_BUILD_COOKIE}
68
69.if !target(clean)
70clean:
71	rm -rf ${ERRATA} ${SYSPATCH}
72.endif
73
74depend:
75
76cleandir: clean
77
78${_FAKE_COOKIE}:
79.if !empty(ERRATA:C/[[:digit:]]{3}_[[:alnum:]_-]+//)
80	@{ echo "***>   invalid errata format: ${ERRATA}"; \
81	exit 1; };
82.endif
83.ifndef FAKEROOT
84	@{ echo "***>   setenv FAKEROOT before doing that!"; \
85	exit 1; };
86.else
87	@if [[ `id -u` -ne 0 ]]; then \
88		{ echo "***>   $@ must be called by root"; \
89		exit 1; }; \
90	fi
91	@destmp=`df -P ${FAKEROOT} | awk 'END { print $$6 }'`; \
92	if ! mount | grep -q " $${destmp} .*noperm"; then \
93		echo ${FAKEROOT} must be on a noperm filesystem >&2; \
94		false; \
95	fi; \
96	if [[ `stat -f '%Su %Lp' $${destmp}` != '${BUILDUSER} 700' ]]; then \
97		echo $${destmp} must have owner BUILDUSER and mode 700 >&2; \
98		false; \
99	fi
100	@test -f ${EPREV_PATH}/usr/lib/crt0.o || \
101		{ echo "***>   previous (${EPREV}) syspatch build is missing"; \
102		exit 1; }; \
103	echo '>> Copying previous syspatch fakeroot to ${FAKE}'; \
104	${INSTALL} -d -m 755 ${SYSPATCH_DIR}; \
105	cd ${EPREV_PATH} && tar cf - . | \
106		(cd ${FAKE} && tar xpf - )
107	@${INSTALL} ${INSTALL_COPY} -o ${SHAREOWN} -g ${SHAREGRP} -m ${SHAREMODE} \
108		${ERRATA}/${ERRATA}.patch.sig ${SYSPATCH_DIR}
109
110.for _m in ${MTREE_FILES}
111	@su ${BUILDUSER} -c '/usr/sbin/mtree ${MTREE_ARGS} -f ${_m}' >/dev/null
112.endfor
113	@su ${BUILDUSER} -c 'touch $@'
114.endif
115
116${ERRATA}/${ERRATA}.patch.sig:
117	@su ${BUILDUSER} -c '${INSTALL} -d -m 755 ${ERRATA}' && \
118	echo '>> Fetching & Verifying ${MIRROR}/${.TARGET:T}'; \
119	su ${BUILDUSER} -c '${FETCH} -o ${ERRATA}/${.TARGET:T} \
120		${MIRROR}/${.TARGET:T}'
121
122${ERRATA}/${ERRATA}.patch: ${ERRATA}/${ERRATA}.patch.sig
123	@su ${BUILDUSER} -c '/usr/bin/signify -Vep ${SIGNIFY_KEY} -x \
124		${ERRATA}/${.TARGET:T}.sig -m ${.TARGET}'
125
126${_PATCH_COOKIE}: ${ERRATA}/${ERRATA}.patch
127	@echo '>> Applying ${ERRATA}.patch'; \
128	/usr/bin/patch ${PATCH_ARGS} < ${ERRATA}/${ERRATA}.patch || \
129		{ echo "***>   ${ERRATA}.patch did not apply cleanly"; \
130		exit 1; };
131	@su ${BUILDUSER} -c 'touch $@'
132
133.ifdef DESTDIR
134${_BUILD_COOKIE}: ${_PATCH_COOKIE} ${_FAKE_COOKIE}
135	@{ echo "***>   cannot set DESTDIR here!"; \
136	exit 1; };
137.elif !defined(FAKEROOT)
138${_BUILD_COOKIE}: ${_PATCH_COOKIE} ${_FAKE_COOKIE}
139	@{ echo "***>   setenv FAKEROOT before doing that!"; \
140	exit 1; };
141.else
142${_BUILD_COOKIE}: ${_PATCH_COOKIE} ${_FAKE_COOKIE}
143	@echo '>> Building syspatch for ${ERRATA}'
144.if ${BUILD:L:Msrc}
145. for _t in clean obj build
146	@cd ${SRCDIR} && /usr/bin/make SYSPATCH_PATH=${EPREV_PATH} ${_t}
147. endfor
148	@su ${BUILDUSER} -c "cd ${SRCDIR} && make SYSPATCH_PATH=${EPREV_PATH} DESTDIR=${FAKE} install"
149.elif ${BUILD:L:Mxenocara}
150. for _t in clean bootstrap obj build
151	@cd ${SRCDIR} && /usr/bin/make SYSPATCH_PATH=${EPREV_PATH} ${_t}
152. endfor
153	@su ${BUILDUSER} -c "cd ${SRCDIR} && make SYSPATCH_PATH=${EPREV_PATH} DESTDIR=${FAKE} install"
154.elif ${BUILD:L:Mkernel}
155. for _t in clean obj
156	@cd ${SRCDIR} && /usr/bin/make SYSPATCH_PATH=${EPREV_PATH} ${_t}
157. endfor
158	@cd ${SRCDIR} && make SYSPATCH_PATH=${EPREV_PATH} DESTDIR=${FAKE} includes
159.  for _kern in GENERIC GENERIC.MP
160	@if cd ${SRCDIR}/sys/arch/${MACHINE}/conf; then \
161		if config ${_kern}; then \
162			if cd ../compile/${_kern} && make clean && make ; then \
163				exit 0; \
164			fi; exit 1; \
165		fi; exit 1; \
166	fi;
167	@if [ ${_kern} = "GENERIC" ]; then \
168		su ${BUILDUSER} -c 'umask ${WOBJUMASK} && \
169		cd ${SRCDIR}/sys/arch/${MACHINE}/compile/GENERIC/obj && \
170		cp -p *.o Makefile ld.script makegap.sh \
171		${FAKE}/usr/share/relink/kernel/GENERIC/' || \
172		{ echo "***>   failed to install ${_kern} object files"; \
173		exit 1; }; \
174	elif [ ${_kern} = "GENERIC.MP" ]; then \
175		su ${BUILDUSER} -c 'umask ${WOBJUMASK} && \
176		cd ${SRCDIR}/sys/arch/${MACHINE}/compile/GENERIC.MP/obj && \
177		cp -p *.o Makefile ld.script makegap.sh \
178		${FAKE}/usr/share/relink/kernel/GENERIC.MP/' || \
179		{ echo "***>   failed to install ${_kern} object files"; \
180		exit 1; }; \
181	fi; exit 0
182.  endfor
183# install newly built kernel on the build machine
184	@cd ${SRCDIR}/sys/arch/${MACHINE}/compile/${KERNEL} && \
185		make install
186.endif
187	@su ${BUILDUSER} -c 'touch $@'
188.endif
189
190syspatch: ${SYSPATCH}
191
192${SYSPATCH}: ${ERRATA}/.plist
193.for _m in ${MTREE_FILES}
194	@su ${BUILDUSER} -c '/usr/sbin/mtree ${MTREE_ARGS} -f ${_m}' >/dev/null
195.endfor
196	@su ${BUILDUSER} -c 'tar -Pczf ${.TARGET} -C ${FAKE} -I ${ERRATA}/.plist' || \
197		{ echo "***>   unable to create ${.TARGET}"; \
198		exit 1; };
199	@echo ">> Created ${SYSPATCH}";
200
201${ERRATA}/.plist: ${_BUILD_COOKIE}
202	@echo ">> Creating the list of files to be included in ${SYSPATCH}"
203	@su ${BUILDUSER} -c \
204	'${.CURDIR}/diff.sh ${EPREV_PATH} ${FAKE} \
205		done > ${.TARGET}' || \
206		{ echo "***>   unable to create list of files";	\
207		exit 1; };
208	@su ${BUILDUSER} -c 'sed -i "s,^${FAKEROOT}/syspatch/${OSrev}-[^/]*/,,g" ${.TARGET}'
209
210.include <bsd.obj.mk>
211