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