19644b987SBruce Evans# $FreeBSD$ 29644b987SBruce Evans 39644b987SBruce Evans# Part of a unified Makefile for building kernels. This part includes all 49644b987SBruce Evans# the definitions that need to be after all the % directives except %RULES 59644b987SBruce Evans# and ones that act like they are part of %RULES. 641c8eb30SWarner Losh# 799fd86afSWarner Losh# Most make variables should not be defined in this file. Instead, they 899fd86afSWarner Losh# should be defined in the kern.pre.mk so that port makefiles can 9714b6aa6SWarner Losh# override or augment them. 1041c8eb30SWarner Losh 1189e50d0eSPoul-Henning Kamp# In case the config had a makeoptions DESTDIR... 1289e50d0eSPoul-Henning Kamp.if defined(DESTDIR) 1389e50d0eSPoul-Henning KampMKMODULESENV+= DESTDIR="${DESTDIR}" 1489e50d0eSPoul-Henning Kamp.endif 158859442eSJohn BaldwinSYSDIR?= ${S:C;^[^/];${.CURDIR}/&;} 168859442eSJohn BaldwinMKMODULESENV+= KERNBUILDDIR="${.CURDIR}" SYSDIR="${SYSDIR}" 1789e50d0eSPoul-Henning Kamp 1862769330SAlexander Leidinger.if defined(CONF_CFLAGS) 1962769330SAlexander LeidingerMKMODULESENV+= CONF_CFLAGS="${CONF_CFLAGS}" 2062769330SAlexander Leidinger.endif 2162769330SAlexander Leidinger 2221edb039SAlexander Leidinger.if defined(WITH_CTF) 2321edb039SAlexander LeidingerMKMODULESENV+= WITH_CTF="${WITH_CTF}" 2421edb039SAlexander Leidinger.endif 2521edb039SAlexander Leidinger 2673b893a7SRuslan Ermilov.MAIN: all 2741c8eb30SWarner Losh 28ab404da2SRuslan Ermilov.for target in all clean cleandepend cleandir clobber depend install \ 29ab404da2SRuslan Ermilov obj reinstall tags 3073b893a7SRuslan Ermilov${target}: kernel-${target} 3173b893a7SRuslan Ermilov.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules) 3273b893a7SRuslan Ermilov${target}: modules-${target} 3373b893a7SRuslan Ermilovmodules-${target}: 34ab404da2SRuslan Ermilov cd $S/modules; ${MKMODULESENV} ${MAKE} \ 35ab404da2SRuslan Ermilov ${target:S/^reinstall$/install/:S/^clobber$/cleandir/} 3673b893a7SRuslan Ermilov.endif 3773b893a7SRuslan Ermilov.endfor 3873b893a7SRuslan Ermilov 391fd4bb62SWarner Losh# Handle out of tree ports 409f74b222SWarner Losh.if !defined(NO_MODULES) && defined(PORTS_MODULES) 41f7479776SWarner LoshPORTSMODULESENV=SYSDIR=${SYSDIR} 425c25ebd5SMaxime Henrion.for __target in all install reinstall clean 43f7479776SWarner Losh${__target}: ports-${__target} 44c8f0f808SWarner Loshports-${__target}: 451fd4bb62SWarner Losh.for __i in ${PORTS_MODULES} 465c25ebd5SMaxime Henrion cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B ${__target:C/install/deinstall reinstall/:C/reinstall/deinstall reinstall/} 471fd4bb62SWarner Losh.endfor 481fd4bb62SWarner Losh.endfor 491fd4bb62SWarner Losh.endif 501fd4bb62SWarner Losh 5173b893a7SRuslan Ermilov.ORDER: kernel-install modules-install 5273b893a7SRuslan Ermilov 5392d0be02SWarner Loshkernel-all: ${KERNEL_KO} ${KERNEL_EXTRA} 5473b893a7SRuslan Ermilov 55ee439c43SRuslan Ermilovkernel-cleandir: kernel-clean kernel-cleandepend 56ab404da2SRuslan Ermilov 57ab404da2SRuslan Ermilovkernel-clobber: 5804b603e5SRuslan Ermilov find . -maxdepth 1 ! -type d ! -name version -delete 5904b603e5SRuslan Ermilov 6004b603e5SRuslan Ermilovkernel-obj: 6173b893a7SRuslan Ermilov 6273b893a7SRuslan Ermilov.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules) 6373b893a7SRuslan Ermilovmodules: modules-all 6473b893a7SRuslan Ermilov 6573b893a7SRuslan Ermilov.if !defined(NO_MODULES_OBJ) 6673b893a7SRuslan Ermilovmodules-all modules-depend: modules-obj 6773b893a7SRuslan Ermilov.endif 6873b893a7SRuslan Ermilov.endif 6941c8eb30SWarner Losh 70697ca17bSWarner Losh.if !defined(DEBUG) 71697ca17bSWarner LoshFULLKERNEL= ${KERNEL_KO} 72697ca17bSWarner Losh.else 73697ca17bSWarner LoshFULLKERNEL= ${KERNEL_KO}.debug 741558abf6SRuslan Ermilov${KERNEL_KO}: ${FULLKERNEL} ${KERNEL_KO}.symbols 751558abf6SRuslan Ermilov ${OBJCOPY} --strip-debug --add-gnu-debuglink=${KERNEL_KO}.symbols\ 7698b45a8fSRuslan Ermilov ${FULLKERNEL} ${.TARGET} 771558abf6SRuslan Ermilov${KERNEL_KO}.symbols: ${FULLKERNEL} 7898b45a8fSRuslan Ermilov ${OBJCOPY} --only-keep-debug ${FULLKERNEL} ${.TARGET} 79d24864f7SRuslan Ermilovinstall.debug reinstall.debug: gdbinit 80d24864f7SRuslan Ermilov cd ${.CURDIR}; ${MAKE} ${.TARGET:R} 81222aa33aSGreg Lehey 82c52c3a23SBruce Evans# Install gdbinit files for kernel debugging. 83222aa33aSGreg Leheygdbinit: 84c52c3a23SBruce Evans grep -v '# XXX' ${S}/../tools/debugscripts/dot.gdbinit | \ 85c52c3a23SBruce Evans sed "s:MODPATH:${.OBJDIR}/modules:" > .gdbinit 8608d0c00bSPoul-Henning Kamp cp ${S}/../tools/debugscripts/gdbinit.kernel ${.CURDIR} 8725faff34SWarner Losh.if exists(${S}/../tools/debugscripts/gdbinit.${MACHINE_CPUARCH}) 8825faff34SWarner Losh cp ${S}/../tools/debugscripts/gdbinit.${MACHINE_CPUARCH} \ 89222aa33aSGreg Lehey ${.CURDIR}/gdbinit.machine 9041c8eb30SWarner Losh.endif 91c7301f91SRuslan Ermilov.endif 9241c8eb30SWarner Losh 93697ca17bSWarner Losh${FULLKERNEL}: ${SYSTEM_DEP} vers.o 9441c8eb30SWarner Losh @rm -f ${.TARGET} 9541c8eb30SWarner Losh @echo linking ${.TARGET} 9641c8eb30SWarner Losh ${SYSTEM_LD} 9721edb039SAlexander Leidinger @${SYSTEM_CTFMERGE} 9841460aa5SRuslan Ermilov.if !defined(DEBUG) 9941460aa5SRuslan Ermilov ${OBJCOPY} --strip-debug ${.TARGET} 10041460aa5SRuslan Ermilov.endif 10141c8eb30SWarner Losh ${SYSTEM_LD_TAIL} 102de5f056aSOlivier Houchard.if defined(MFS_IMAGE) 103fcfdd827SRafal Jaworowski @sh ${S}/tools/embed_mfs.sh ${FULLKERNEL} ${MFS_IMAGE} 104de5f056aSOlivier Houchard.endif 10541c8eb30SWarner Losh 10646205431SRuslan Ermilov.if !exists(${.OBJDIR}/.depend) 107b53dd31aSWarner Losh${SYSTEM_OBJS}: assym.s vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/} 10841c8eb30SWarner Losh.endif 10941c8eb30SWarner Losh 1101d1f8d7cSMark MurrayLNFILES= ${CFILES:T:S/.c$/.ln/} 1111d1f8d7cSMark Murray 11241c8eb30SWarner Losh.for mfile in ${MFILES} 11349b2349bSBruce Evans# XXX the low quality .m.o rules gnerated by config are normally used 11449b2349bSBruce Evans# instead of the .m.c rules here. 11549b2349bSBruce Evans${mfile:T:S/.m$/.c/}: ${mfile} 11649b2349bSBruce Evans ${AWK} -f $S/tools/makeobjops.awk ${mfile} -c 11741c8eb30SWarner Losh${mfile:T:S/.m$/.h/}: ${mfile} 1189fa411aeSDavid E. O'Brien ${AWK} -f $S/tools/makeobjops.awk ${mfile} -h 11941c8eb30SWarner Losh.endfor 12041c8eb30SWarner Losh 12141c8eb30SWarner Loshkernel-clean: 12241c8eb30SWarner Losh rm -f *.o *.so *.So *.ko *.s eddep errs \ 1231558abf6SRuslan Ermilov ${FULLKERNEL} ${KERNEL_KO} ${KERNEL_KO}.symbols \ 12498b45a8fSRuslan Ermilov linterrs makelinks tags vers.c \ 1253365523eSRuslan Ermilov vnode_if.c vnode_if.h vnode_if_newproto.h vnode_if_typedef.h \ 12641c8eb30SWarner Losh ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \ 12774465532SRuslan Ermilov ${CLEAN} 12841c8eb30SWarner Losh 1291d1f8d7cSMark Murraylint: ${LNFILES} 130c52c3a23SBruce Evans ${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC} 2>&1 | \ 131c52c3a23SBruce Evans tee -a linterrs 132766f7d6eSMark Murray 13341c8eb30SWarner Losh# This is a hack. BFD "optimizes" away dynamic mode if there are no 13441c8eb30SWarner Losh# dynamic references. We could probably do a '-Bforcedynamic' mode like 13541c8eb30SWarner Losh# in the a.out ld. For now, this works. 13641c8eb30SWarner LoshHACK_EXTRA_FLAGS?= -shared 13741c8eb30SWarner Loshhack.So: Makefile 1388b3ae668SDag-Erling Smørgrav :> hack.c 139e1402a88SBruce Evans ${CC} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So 14041c8eb30SWarner Losh rm -f hack.c 14141c8eb30SWarner Losh 142c52c3a23SBruce Evans# This rule stops ./assym.s in .depend from causing problems. 14341c8eb30SWarner Losh./assym.s: assym.s 14441c8eb30SWarner Losh 14541c8eb30SWarner Loshassym.s: $S/kern/genassym.sh genassym.o 1467676d865SDavid E. O'Brien NM='${NM}' sh $S/kern/genassym.sh genassym.o > ${.TARGET} 14741c8eb30SWarner Losh 14841c8eb30SWarner Loshgenassym.o: $S/$M/$M/genassym.c 14977c854b0SBruce Evans ${CC} -c ${CFLAGS:N-fno-common} $S/$M/$M/genassym.c 15041c8eb30SWarner Losh 15141c8eb30SWarner Losh${SYSTEM_OBJS} genassym.o vers.o: opt_global.h 15241c8eb30SWarner Losh 153a13914f6SRuslan Ermilovkernel-depend: .depend 1540f64e446SBruce Evans# The argument list can be very long, so use make -V and xargs to 1554fbd95d6SJake Burkholder# pass it to mkdep. 156a90232e1SRuslan ErmilovSRCS= assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \ 1576324e649SWarner Losh ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \ 1586324e649SWarner Losh ${MFILES:T:S/.m$/.h/} 15974465532SRuslan Ermilov.depend: .PRECIOUS ${SRCS} 16041c8eb30SWarner Losh rm -f .newdep 1616324e649SWarner Losh ${MAKE} -V CFILES -V SYSTEM_CFILES -V GEN_CFILES | \ 1620f64e446SBruce Evans MKDEP_CPP="${CC} -E" CC="${CC}" xargs mkdep -a -f .newdep ${CFLAGS} 1635d1b6a85SRuslan Ermilov ${MAKE} -V SFILES | \ 1640f64e446SBruce Evans MKDEP_CPP="${CC} -E" xargs mkdep -a -f .newdep ${ASM_CFLAGS} 16541c8eb30SWarner Losh rm -f .depend 16641c8eb30SWarner Losh mv .newdep .depend 16741c8eb30SWarner Losh 168a90232e1SRuslan Ermilov_ILINKS= machine 169915b4b09SNathan Whitehorn.if ${MACHINE} != ${MACHINE_CPUARCH} 170915b4b09SNathan Whitehorn_ILINKS+= ${MACHINE_CPUARCH} 171a90232e1SRuslan Ermilov.endif 172*544de89dSJohn Baldwin.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" 173*544de89dSJohn Baldwin_ILINKS+= x86 174*544de89dSJohn Baldwin.endif 175a90232e1SRuslan Ermilov 176a90232e1SRuslan Ermilov# Ensure that the link exists without depending on it when it exists. 177a90232e1SRuslan Ermilov.for _link in ${_ILINKS} 178a90232e1SRuslan Ermilov.if !exists(${.OBJDIR}/${_link}) 179a90232e1SRuslan Ermilov${SRCS}: ${_link} 180a90232e1SRuslan Ermilov.endif 181a90232e1SRuslan Ermilov.endfor 182a90232e1SRuslan Ermilov 183a90232e1SRuslan Ermilov${_ILINKS}: 184a90232e1SRuslan Ermilov @case ${.TARGET} in \ 185a90232e1SRuslan Ermilov machine) \ 186a90232e1SRuslan Ermilov path=${S}/${MACHINE}/include ;; \ 187*544de89dSJohn Baldwin *) \ 188*544de89dSJohn Baldwin path=${S}/${.TARGET}/include ;; \ 189a90232e1SRuslan Ermilov esac ; \ 190a90232e1SRuslan Ermilov ${ECHO} ${.TARGET} "->" $$path ; \ 191a90232e1SRuslan Ermilov ln -s $$path ${.TARGET} 192a90232e1SRuslan Ermilov 19374465532SRuslan Ermilov# .depend needs include links so we remove them only together. 19441c8eb30SWarner Loshkernel-cleandepend: 19574465532SRuslan Ermilov rm -f .depend ${_ILINKS} 19641c8eb30SWarner Losh 19741c8eb30SWarner Loshlinks: 19841c8eb30SWarner Losh egrep '#if' ${CFILES} | sed -f $S/conf/defines | \ 19941c8eb30SWarner Losh sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink 200caa38512SLuigi Rizzo ${MAKE} -V CFILES | tr -s ' ' '\12' | sed 's/\.c/.o/' | \ 20141c8eb30SWarner Losh sort -u | comm -23 - dontlink | \ 20241c8eb30SWarner Losh sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks 20341c8eb30SWarner Losh sh makelinks; rm -f dontlink 20441c8eb30SWarner Losh 20541c8eb30SWarner Loshkernel-tags: 20641c8eb30SWarner Losh @[ -f .depend ] || { echo "you must make depend first"; exit 1; } 20741c8eb30SWarner Losh sh $S/conf/systags.sh 20841c8eb30SWarner Losh 2097b5ee339SMarcel Moolenaarkernel-install: 21098b45a8fSRuslan Ermilov @if [ ! -f ${KERNEL_KO} ] ; then \ 21141c8eb30SWarner Losh echo "You must build a kernel first." ; \ 21241c8eb30SWarner Losh exit 1 ; \ 21341c8eb30SWarner Losh fi 21441c8eb30SWarner Losh.if exists(${DESTDIR}${KODIR}) 21541c8eb30SWarner Losh -thiskernel=`sysctl -n kern.bootfile` ; \ 2161afc807bSRuslan Ermilov if [ ! "`dirname "$$thiskernel"`" -ef ${DESTDIR}${KODIR} ] ; then \ 21741c8eb30SWarner Losh chflags -R noschg ${DESTDIR}${KODIR} ; \ 21841c8eb30SWarner Losh rm -rf ${DESTDIR}${KODIR} ; \ 21941c8eb30SWarner Losh else \ 22041c8eb30SWarner Losh if [ -d ${DESTDIR}${KODIR}.old ] ; then \ 22141c8eb30SWarner Losh chflags -R noschg ${DESTDIR}${KODIR}.old ; \ 22241c8eb30SWarner Losh rm -rf ${DESTDIR}${KODIR}.old ; \ 22341c8eb30SWarner Losh fi ; \ 22441c8eb30SWarner Losh mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \ 22598a32cb1SRuslan Ermilov sysctl kern.bootfile=${DESTDIR}${KODIR}.old/"`basename "$$thiskernel"`" ; \ 22641c8eb30SWarner Losh fi 22741c8eb30SWarner Losh.endif 22841c8eb30SWarner Losh mkdir -p ${DESTDIR}${KODIR} 229b63fbf28SBjoern A. Zeeb ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO} ${DESTDIR}${KODIR} 23098b45a8fSRuslan Ermilov.if defined(DEBUG) && !defined(INSTALL_NODEBUG) 231b63fbf28SBjoern A. Zeeb ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO}.symbols ${DESTDIR}${KODIR} 232697ca17bSWarner Losh.endif 23392d0be02SWarner Losh.if defined(KERNEL_EXTRA_INSTALL) 234b63fbf28SBjoern A. Zeeb ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_EXTRA_INSTALL} ${DESTDIR}${KODIR} 23592d0be02SWarner Losh.endif 23692d0be02SWarner Losh 23792d0be02SWarner Losh 23841c8eb30SWarner Losh 2392cbc81ffSRuslan Ermilovkernel-reinstall: 24041c8eb30SWarner Losh @-chflags -R noschg ${DESTDIR}${KODIR} 241b63fbf28SBjoern A. Zeeb ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO} ${DESTDIR}${KODIR} 24298b45a8fSRuslan Ermilov.if defined(DEBUG) && !defined(INSTALL_NODEBUG) 243b63fbf28SBjoern A. Zeeb ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO}.symbols ${DESTDIR}${KODIR} 244697ca17bSWarner Losh.endif 24541c8eb30SWarner Losh 24692daf6f9SPoul-Henning Kampconfig.o env.o hints.o vers.o vnode_if.o: 24741c8eb30SWarner Losh ${NORMAL_C} 24821edb039SAlexander Leidinger @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 24941c8eb30SWarner Losh 25092daf6f9SPoul-Henning Kampconfig.ln env.ln hints.ln vers.ln vnode_if.ln: 2511d1f8d7cSMark Murray ${NORMAL_LINT} 2521d1f8d7cSMark Murray 25341c8eb30SWarner Loshvers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP} 254e8f7141eSRuslan Ermilov MAKE=${MAKE} sh $S/conf/newvers.sh ${KERN_IDENT} 25541c8eb30SWarner Losh 256b7bbb709SDavid E. O'Brienvnode_if.c: $S/tools/vnode_if.awk $S/kern/vnode_if.src 257b7bbb709SDavid E. O'Brien ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -c 25841c8eb30SWarner Losh 259a10892b0SRuslan Ermilovvnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \ 260a10892b0SRuslan Ermilov $S/kern/vnode_if.src 261a10892b0SRuslan Ermilovvnode_if.h: vnode_if_newproto.h vnode_if_typedef.h 262b7bbb709SDavid E. O'Brien ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h 263a10892b0SRuslan Ermilovvnode_if_newproto.h: 264aec0fb7bSPoul-Henning Kamp ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p 265a10892b0SRuslan Ermilovvnode_if_typedef.h: 266aec0fb7bSPoul-Henning Kamp ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q 26741c8eb30SWarner Losh 26846205431SRuslan Ermilov# XXX strictly, everything depends on Makefile because changes to ${PROF} 26946205431SRuslan Ermilov# only appear there, but we don't handle that. 2701d1f8d7cSMark Murray 271ddc474a8SRuslan Ermilov.include "kern.mk" 272