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