kern.post.mk revision 206082
138494Sobrien# $FreeBSD: head/sys/conf/kern.post.mk 206082 2010-04-02 06:55:31Z netchild $ 2174313Sobrien 338494Sobrien# Part of a unified Makefile for building kernels. This part includes all 438494Sobrien# the definitions that need to be after all the % directives except %RULES 538494Sobrien# and ones that act like they are part of %RULES. 638494Sobrien# 738494Sobrien# Most make variables should not be defined in this file. Instead, they 838494Sobrien# should be defined in the kern.pre.mk so that port makefiles can 938494Sobrien# override or augment them. 1038494Sobrien 1138494Sobrien# In case the config had a makeoptions DESTDIR... 1238494Sobrien.if defined(DESTDIR) 1338494SobrienMKMODULESENV+= DESTDIR="${DESTDIR}" 1438494Sobrien.endif 1538494SobrienSYSDIR?= ${S:C;^[^/];${.CURDIR}/&;} 1638494SobrienMKMODULESENV+= KERNBUILDDIR="${.CURDIR}" SYSDIR="${SYSDIR}" 1738494Sobrien 1838494Sobrien.if defined(CONF_CFLAGS) 1938494SobrienMKMODULESENV+= CONF_CFLAGS="${CONF_CFLAGS}" 2042633Sobrien.endif 2138494Sobrien 2238494Sobrien.if defined(WITH_CTF) 2338494SobrienMKMODULESENV+= WITH_CTF="${WITH_CTF}" 2438494Sobrien.endif 2538494Sobrien 2638494Sobrien.MAIN: all 2738494Sobrien 2838494Sobrien.for target in all clean cleandepend cleandir clobber depend install \ 2938494Sobrien obj reinstall tags 3038494Sobrien${target}: kernel-${target} 3138494Sobrien.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules) 3238494Sobrien${target}: modules-${target} 3338494Sobrienmodules-${target}: 3438494Sobrien cd $S/modules; ${MKMODULESENV} ${MAKE} \ 3538494Sobrien ${target:S/^reinstall$/install/:S/^clobber$/cleandir/} 3638494Sobrien.endif 3738494Sobrien.endfor 3838494Sobrien 3938494Sobrien# Handle out of tree ports 40174313Sobrien.if !defined(NO_MODULES) && defined(PORTS_MODULES) 4138494SobrienPORTSMODULESENV=SYSDIR=${SYSDIR} 4238494Sobrien.for __target in all install reinstall clean 4338494Sobrien${__target}: ports-${__target} 4438494Sobrienports-${__target}: 4538494Sobrien.for __i in ${PORTS_MODULES} 4638494Sobrien cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B ${__target:C/install/deinstall reinstall/:C/reinstall/deinstall reinstall/} 4738494Sobrien.endfor 4838494Sobrien.endfor 4938494Sobrien.endif 5038494Sobrien 5138494Sobrien.ORDER: kernel-install modules-install 5238494Sobrien 5338494Sobrienkernel-all: ${KERNEL_KO} ${KERNEL_EXTRA} 5438494Sobrien 5538494Sobrienkernel-cleandir: kernel-clean kernel-cleandepend 5638494Sobrien 5738494Sobrienkernel-clobber: 5838494Sobrien find . -maxdepth 1 ! -type d ! -name version -delete 5938494Sobrien 6038494Sobrienkernel-obj: 6138494Sobrien 6238494Sobrien.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules) 6338494Sobrienmodules: modules-all 6438494Sobrien 6538494Sobrien.if !defined(NO_MODULES_OBJ) 6638494Sobrienmodules-all modules-depend: modules-obj 6738494Sobrien.endif 6838494Sobrien.endif 6938494Sobrien 7038494Sobrien.if !defined(DEBUG) 7138494SobrienFULLKERNEL= ${KERNEL_KO} 7238494Sobrien.else 7338494SobrienFULLKERNEL= ${KERNEL_KO}.debug 7438494Sobrien${KERNEL_KO}: ${FULLKERNEL} ${KERNEL_KO}.symbols 7538494Sobrien ${OBJCOPY} --strip-debug --add-gnu-debuglink=${KERNEL_KO}.symbols\ 7638494Sobrien ${FULLKERNEL} ${.TARGET} 7738494Sobrien${KERNEL_KO}.symbols: ${FULLKERNEL} 7838494Sobrien ${OBJCOPY} --only-keep-debug ${FULLKERNEL} ${.TARGET} 7938494Sobrieninstall.debug reinstall.debug: gdbinit 8038494Sobrien cd ${.CURDIR}; ${MAKE} ${.TARGET:R} 8138494Sobrien 8238494Sobrien# Install gdbinit files for kernel debugging. 8338494Sobriengdbinit: 8438494Sobrien grep -v '# XXX' ${S}/../tools/debugscripts/dot.gdbinit | \ 8538494Sobrien sed "s:MODPATH:${.OBJDIR}/modules:" > .gdbinit 8638500Sobrien cp ${S}/../tools/debugscripts/gdbinit.kernel ${.CURDIR} 87174313Sobrien.if exists(${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH}) 8838494Sobrien cp ${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH} \ 8938494Sobrien ${.CURDIR}/gdbinit.machine 9038494Sobrien.endif 9142633Sobrien.endif 9238494Sobrien 9338494Sobrien${FULLKERNEL}: ${SYSTEM_DEP} vers.o 9438494Sobrien @rm -f ${.TARGET} 9538494Sobrien @echo linking ${.TARGET} 9638494Sobrien ${SYSTEM_LD} 9782804Sobrien @${SYSTEM_CTFMERGE} 9838494Sobrien.if !defined(DEBUG) 9982804Sobrien ${OBJCOPY} --strip-debug ${.TARGET} 10038494Sobrien.endif 10182804Sobrien ${SYSTEM_LD_TAIL} 10238494Sobrien.if defined(MFS_IMAGE) 10338494Sobrien @sh ${S}/tools/embed_mfs.sh ${FULLKERNEL} ${MFS_IMAGE} 10438494Sobrien.endif 10538494Sobrien 10638494Sobrien.if !exists(${.OBJDIR}/.depend) 10738494Sobrien${SYSTEM_OBJS}: assym.s vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/} 10838494Sobrien.endif 10938494Sobrien 11038494SobrienLNFILES= ${CFILES:T:S/.c$/.ln/} 11138494Sobrien 11242633Sobrien.for mfile in ${MFILES} 11338494Sobrien# XXX the low quality .m.o rules gnerated by config are normally used 11438494Sobrien# instead of the .m.c rules here. 11538494Sobrien${mfile:T:S/.m$/.c/}: ${mfile} 11638494Sobrien ${AWK} -f $S/tools/makeobjops.awk ${mfile} -c 11738494Sobrien${mfile:T:S/.m$/.h/}: ${mfile} 11838494Sobrien ${AWK} -f $S/tools/makeobjops.awk ${mfile} -h 11938494Sobrien.endfor 12038494Sobrien 12138494Sobrienkernel-clean: 12238494Sobrien rm -f *.o *.so *.So *.ko *.s eddep errs \ 123174313Sobrien ${FULLKERNEL} ${KERNEL_KO} ${KERNEL_KO}.symbols \ 124174313Sobrien linterrs makelinks tags vers.c \ 125174313Sobrien vnode_if.c vnode_if.h vnode_if_newproto.h vnode_if_typedef.h \ 126174313Sobrien ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \ 127174313Sobrien ${CLEAN} 128174313Sobrien 129174313Sobrienlint: ${LNFILES} 130174313Sobrien ${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC} 2>&1 | \ 131174313Sobrien tee -a linterrs 132174313Sobrien 133174313Sobrien# This is a hack. BFD "optimizes" away dynamic mode if there are no 13438494Sobrien# dynamic references. We could probably do a '-Bforcedynamic' mode like 13538494Sobrien# in the a.out ld. For now, this works. 13638494SobrienHACK_EXTRA_FLAGS?= -shared 13738494Sobrienhack.So: Makefile 13838494Sobrien :> hack.c 13938494Sobrien ${CC} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So 14038494Sobrien rm -f hack.c 14138494Sobrien 14242633Sobrien# This rule stops ./assym.s in .depend from causing problems. 14338494Sobrien./assym.s: assym.s 14438494Sobrien 14538494Sobrienassym.s: $S/kern/genassym.sh genassym.o 14638494Sobrien NM='${NM}' sh $S/kern/genassym.sh genassym.o > ${.TARGET} 14738494Sobrien 14838494Sobriengenassym.o: $S/$M/$M/genassym.c 14938494Sobrien ${CC} -c ${CFLAGS:N-fno-common} $S/$M/$M/genassym.c 15038494Sobrien 15138494Sobrien${SYSTEM_OBJS} genassym.o vers.o: opt_global.h 15238494Sobrien 15338494Sobrienkernel-depend: .depend 15438494Sobrien# The argument list can be very long, so use make -V and xargs to 15538494Sobrien# pass it to mkdep. 15638494SobrienSRCS= assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \ 15738494Sobrien ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \ 15838494Sobrien ${MFILES:T:S/.m$/.h/} 15938494Sobrien.depend: .PRECIOUS ${SRCS} 16038494Sobrien rm -f .newdep 16138494Sobrien ${MAKE} -V CFILES -V SYSTEM_CFILES -V GEN_CFILES | \ 16238494Sobrien MKDEP_CPP="${CC} -E" CC="${CC}" xargs mkdep -a -f .newdep ${CFLAGS} 16338494Sobrien ${MAKE} -V SFILES | \ 16438494Sobrien MKDEP_CPP="${CC} -E" xargs mkdep -a -f .newdep ${ASM_CFLAGS} 16538494Sobrien rm -f .depend 16638494Sobrien mv .newdep .depend 16738494Sobrien 16838494Sobrien_ILINKS= machine 16938494Sobrien.if ${MACHINE} != ${MACHINE_ARCH} 17038494Sobrien_ILINKS+= ${MACHINE_ARCH} 17138494Sobrien.endif 17238494Sobrien 17338494Sobrien# Ensure that the link exists without depending on it when it exists. 17438494Sobrien.for _link in ${_ILINKS} 17538494Sobrien.if !exists(${.OBJDIR}/${_link}) 17638494Sobrien${SRCS}: ${_link} 17742633Sobrien.endif 17838494Sobrien.endfor 17942633Sobrien 18038494Sobrien${_ILINKS}: 18138494Sobrien @case ${.TARGET} in \ 18238494Sobrien machine) \ 18338494Sobrien path=${S}/${MACHINE}/include ;; \ 18438494Sobrien ${MACHINE_ARCH}) \ 18542633Sobrien path=${S}/${MACHINE_ARCH}/include ;; \ 18638494Sobrien esac ; \ 18738494Sobrien ${ECHO} ${.TARGET} "->" $$path ; \ 18838494Sobrien ln -s $$path ${.TARGET} 18938494Sobrien 19038494Sobrien# .depend needs include links so we remove them only together. 19138494Sobrienkernel-cleandepend: 19238494Sobrien rm -f .depend ${_ILINKS} 19338494Sobrien 19442633Sobrienlinks: 19538494Sobrien egrep '#if' ${CFILES} | sed -f $S/conf/defines | \ 19638494Sobrien sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink 19738494Sobrien ${MAKE} -V CFILES | tr -s ' ' '\12' | sed 's/\.c/.o/' | \ 19838494Sobrien sort -u | comm -23 - dontlink | \ 19938494Sobrien sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks 20038494Sobrien sh makelinks; rm -f dontlink 20138494Sobrien 20238494Sobrienkernel-tags: 20338494Sobrien @[ -f .depend ] || { echo "you must make depend first"; exit 1; } 20438494Sobrien sh $S/conf/systags.sh 20538494Sobrien 20638494Sobrienkernel-install: 20738494Sobrien @if [ ! -f ${KERNEL_KO} ] ; then \ 20838494Sobrien echo "You must build a kernel first." ; \ 20938494Sobrien exit 1 ; \ 21038494Sobrien fi 21138494Sobrien.if exists(${DESTDIR}${KODIR}) 21238494Sobrien -thiskernel=`sysctl -n kern.bootfile` ; \ 21338494Sobrien if [ ! "`dirname "$$thiskernel"`" -ef ${DESTDIR}${KODIR} ] ; then \ 21438494Sobrien chflags -R noschg ${DESTDIR}${KODIR} ; \ 21542633Sobrien rm -rf ${DESTDIR}${KODIR} ; \ 21638494Sobrien else \ 21738494Sobrien if [ -d ${DESTDIR}${KODIR}.old ] ; then \ 21838494Sobrien chflags -R noschg ${DESTDIR}${KODIR}.old ; \ 21938494Sobrien rm -rf ${DESTDIR}${KODIR}.old ; \ 22038494Sobrien fi ; \ 22138494Sobrien mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \ 22238494Sobrien sysctl kern.bootfile=${DESTDIR}${KODIR}.old/"`basename "$$thiskernel"`" ; \ 22338494Sobrien fi 22438494Sobrien.endif 22538494Sobrien mkdir -p ${DESTDIR}${KODIR} 22638494Sobrien ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO} ${DESTDIR}${KODIR} 22738494Sobrien.if defined(DEBUG) && !defined(INSTALL_NODEBUG) 22838494Sobrien ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO}.symbols ${DESTDIR}${KODIR} 22938494Sobrien.endif 23038494Sobrien.if defined(KERNEL_EXTRA_INSTALL) 23138494Sobrien ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_EXTRA_INSTALL} ${DESTDIR}${KODIR} 23238494Sobrien.endif 23338494Sobrien 23438494Sobrien 23538494Sobrien 23638494Sobrienkernel-reinstall: 23738494Sobrien @-chflags -R noschg ${DESTDIR}${KODIR} 23838494Sobrien ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO} ${DESTDIR}${KODIR} 23938494Sobrien.if defined(DEBUG) && !defined(INSTALL_NODEBUG) 24038494Sobrien ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO}.symbols ${DESTDIR}${KODIR} 24138494Sobrien.endif 24238494Sobrien 24338494Sobrienconfig.o env.o hints.o vers.o vnode_if.o: 24438494Sobrien ${NORMAL_C} 24538494Sobrien @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 24638494Sobrien 24738494Sobrienconfig.ln env.ln hints.ln vers.ln vnode_if.ln: 24838494Sobrien ${NORMAL_LINT} 24938494Sobrien 25038494Sobrienvers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP} 25138494Sobrien MAKE=${MAKE} sh $S/conf/newvers.sh ${KERN_IDENT} 25238494Sobrien 25338494Sobrienvnode_if.c: $S/tools/vnode_if.awk $S/kern/vnode_if.src 25442633Sobrien ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -c 25538494Sobrien 25638494Sobrienvnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \ 25738494Sobrien $S/kern/vnode_if.src 25838494Sobrienvnode_if.h: vnode_if_newproto.h vnode_if_typedef.h 25938494Sobrien ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h 26038494Sobrienvnode_if_newproto.h: 26138494Sobrien ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p 26238494Sobrienvnode_if_typedef.h: 26338494Sobrien ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q 26438494Sobrien 26538494Sobrien# XXX strictly, everything depends on Makefile because changes to ${PROF} 26638494Sobrien# only appear there, but we don't handle that. 26742633Sobrien 26838494Sobrien.include "kern.mk" 26938494Sobrien