kern.post.mk revision 145403
11541Srgrimes# $FreeBSD: head/sys/conf/kern.post.mk 145403 2005-04-22 17:36:25Z ru $
21541Srgrimes
31541Srgrimes# Part of a unified Makefile for building kernels.  This part includes all
41541Srgrimes# the definitions that need to be after all the % directives except %RULES
51541Srgrimes# and ones that act like they are part of %RULES.
61541Srgrimes#
71541Srgrimes# Most make variables should not be defined in this file.  Instead, they
81541Srgrimes# should be defined in the kern.pre.mk so that port makefiles can
91541Srgrimes# override or augment them.
101541Srgrimes
111541Srgrimes# In case the config had a makeoptions DESTDIR...
121541Srgrimes.if defined(DESTDIR)
131541SrgrimesMKMODULESENV+=	DESTDIR="${DESTDIR}"
141541Srgrimes.endif
151541SrgrimesMKMODULESENV+=	KERNBUILDDIR="${.CURDIR}"
161541Srgrimes
171541Srgrimes.MAIN: all
181541Srgrimes
191541Srgrimes.for target in all clean cleandepend cleandir clobber depend install \
201541Srgrimes    obj reinstall tags
211541Srgrimes${target}: kernel-${target}
221541Srgrimes.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
231541Srgrimes${target}: modules-${target}
241541Srgrimesmodules-${target}:
251541Srgrimes	cd $S/modules; ${MKMODULESENV} ${MAKE} \
261541Srgrimes	    ${target:S/^reinstall$/install/:S/^clobber$/cleandir/}
271541Srgrimes.endif
281541Srgrimes.endfor
291541Srgrimes
301541Srgrimes# Handle out of tree ports 
311541Srgrimes.if defined(PORTS_MODULES)
321541Srgrimes.for _dir in ${.CURDIR}/../../..
331541Srgrimes.if !defined(SYSDIR) && exists(${_dir}/kern/)
341541SrgrimesSYSDIR=	${_dir}
351541Srgrimes.endif
361541Srgrimes.endfor
371541SrgrimesPORTSMODULESENV=SYSDIR=${SYSDIR}
3814476Shsu.for __target in all install clean
3915582Sphk${__target}: ports-${__target}
401541Srgrimesports-${__target}:
411541Srgrimes.for __i in ${PORTS_MODULES}
421541Srgrimes	cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B ${__target:C/install/deinstall reinstall/}
431541Srgrimes.endfor
4415493Sbde.endfor
451541Srgrimes.endif
461541Srgrimes
471541Srgrimes.ORDER: kernel-install modules-install
481541Srgrimes
496549Sbdekernel-all: ${KERNEL_KO}
506549Sbde
516549Sbdekernel-cleandir: kernel-clean
526549Sbde
536549Sbdekernel-clobber:
546549Sbde	find . -maxdepth 1 ! -type d ! -name version -delete
556549Sbde
566549Sbdekernel-obj:
576549Sbde
586549Sbde.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
596549Sbdemodules: modules-all
606549Sbde
6112408Sdyson.if !defined(NO_MODULES_OBJ)
6212408Sdysonmodules-all modules-depend: modules-obj
631541Srgrimes.endif
641541Srgrimes.endif
651541Srgrimes
661541Srgrimes.if !defined(DEBUG)
671541SrgrimesFULLKERNEL=	${KERNEL_KO}
681541Srgrimes.else
691541SrgrimesFULLKERNEL=	${KERNEL_KO}.debug
7012408Sdyson${KERNEL_KO}: ${FULLKERNEL}
711541Srgrimes	${OBJCOPY} --strip-debug ${FULLKERNEL} ${KERNEL_KO}
7212767Sdysoninstall.debug reinstall.debug: gdbinit
7312767Sdyson	cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG ${.TARGET:R}
7412767Sdyson
751541Srgrimes# Install gdbinit files for kernel debugging.
761541Srgrimesgdbinit:
771541Srgrimes	grep -v '# XXX' ${S}/../tools/debugscripts/dot.gdbinit | \
781541Srgrimes	    sed "s:MODPATH:${.OBJDIR}/modules:" > .gdbinit
791541Srgrimes	cp ${S}/../tools/debugscripts/gdbinit.kernel ${.CURDIR}
801541Srgrimes.if exists(${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH})
811541Srgrimes	cp ${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH} \
821541Srgrimes	    ${.CURDIR}/gdbinit.machine
831541Srgrimes.endif
841541Srgrimes.endif
851541Srgrimes
861541Srgrimes${FULLKERNEL}: ${SYSTEM_DEP} vers.o
871541Srgrimes	@rm -f ${.TARGET}
886549Sbde	@echo linking ${.TARGET}
896549Sbde	${SYSTEM_LD}
901541Srgrimes.if !defined(DEBUG)
911541Srgrimes	${OBJCOPY} --strip-debug ${.TARGET}
921541Srgrimes.endif
931541Srgrimes	${SYSTEM_LD_TAIL}
941541Srgrimes
951541Srgrimes.if !exists(${.OBJDIR}/.depend)
961541Srgrimes${SYSTEM_OBJS}: assym.s vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/}
971549Srgrimes.endif
981549Srgrimes
991549SrgrimesLNFILES=	${CFILES:T:S/.c$/.ln/}
1001549Srgrimes
1011549Srgrimes.for mfile in ${MFILES}
10212404Sdyson# XXX the low quality .m.o rules gnerated by config are normally used
10312404Sdyson# instead of the .m.c rules here.
10412404Sdyson${mfile:T:S/.m$/.c/}: ${mfile}
10512404Sdyson	${AWK} -f $S/tools/makeobjops.awk ${mfile} -c
10615582Sphk${mfile:T:S/.m$/.h/}: ${mfile}
1073374Sdg	${AWK} -f $S/tools/makeobjops.awk ${mfile} -h
1081541Srgrimes.endfor
1091541Srgrimes
1101541Srgrimeskernel-clean:
1111541Srgrimes	rm -f *.o *.so *.So *.ko *.s eddep errs \
1121541Srgrimes	    ${FULLKERNEL} ${KERNEL_KO} linterrs makelinks tags \
1131541Srgrimes	    vers.c vnode_if.c vnode_if.h \
1141541Srgrimes	    ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \
1151541Srgrimes	    ${CLEAN}
1161541Srgrimes
1171541Srgrimeslint: ${LNFILES}
1181541Srgrimes	${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC} 2>&1 | \
1191541Srgrimes	    tee -a linterrs
1201541Srgrimes
12114476Shsu# This is a hack.  BFD "optimizes" away dynamic mode if there are no
1221541Srgrimes# dynamic references.  We could probably do a '-Bforcedynamic' mode like
1231541Srgrimes# in the a.out ld.  For now, this works.
1241541SrgrimesHACK_EXTRA_FLAGS?= -shared
1251541Srgrimeshack.So: Makefile
1261541Srgrimes	touch hack.c
1271541Srgrimes	${CC} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So
1281541Srgrimes	rm -f hack.c
1291541Srgrimes
1301541Srgrimes# This rule stops ./assym.s in .depend from causing problems.
1311541Srgrimes./assym.s: assym.s
1321541Srgrimes
1331541Srgrimesassym.s: $S/kern/genassym.sh genassym.o
1341541Srgrimes	NM='${NM}' sh $S/kern/genassym.sh genassym.o > ${.TARGET}
1351541Srgrimes
1365455Sdggenassym.o: $S/$M/$M/genassym.c
1375455Sdg	${CC} -c ${CFLAGS:N-fno-common} $S/$M/$M/genassym.c
1381541Srgrimes
1391541Srgrimes${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
1401541Srgrimes
1411541Srgrimeskernel-depend: .depend
1427695Sdg# The argument list can be very long, so use make -V and xargs to
1431541Srgrimes# pass it to mkdep.
1441541Srgrimes.depend: assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \
1451541Srgrimes	    ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
1461541Srgrimes	    ${MFILES:T:S/.m$/.h/}
1477935Sdg	rm -f .newdep
1483374Sdg	${MAKE} -V CFILES -V SYSTEM_CFILES -V GEN_CFILES | \
1491549Srgrimes	    MKDEP_CPP="${CC} -E" CC="${CC}" xargs mkdep -a -f .newdep ${CFLAGS}
1501549Srgrimes	${MAKE} -V SFILES | \
1511541Srgrimes	    MKDEP_CPP="${CC} -E" xargs mkdep -a -f .newdep ${ASM_CFLAGS}
1521541Srgrimes	rm -f .depend
1531564Sdg	mv .newdep .depend
1541564Sdg
1551564Sdgkernel-cleandepend:
1561564Sdg	rm -f .depend
1571541Srgrimes
1581564Sdglinks:
1591564Sdg	egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
1601564Sdg	    sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
16110226Sdg	${MAKE} -V CFILES | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
1621564Sdg	    sort -u | comm -23 - dontlink | \
1631564Sdg	    sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
1641564Sdg	sh makelinks; rm -f dontlink
1651564Sdg
1665455Sdgkernel-tags:
1671564Sdg	@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
1689759Sbde	sh $S/conf/systags.sh
1699759Sbde	rm -f tags1
1701564Sdg	sed -e 's,      ../,    ,' tags > tags1
1711564Sdg
1721564Sdg.if ${MACHINE_ARCH} != "ia64"
1731564Sdg.if exists(${DESTDIR}/boot)
1745455Sdgkernel-install-check:
1755455Sdg	@if [ ! -f ${DESTDIR}/boot/device.hints ] ; then \
1765455Sdg		echo "You must set up a ${DESTDIR}/boot/device.hints file first." ; \
1771564Sdg		exit 1 ; \
1781564Sdg	fi
1791541Srgrimes	@if [ x"`grep device.hints ${DESTDIR}/boot/defaults/loader.conf ${DESTDIR}/boot/loader.conf`" = "x" ]; then \
1801541Srgrimes		echo "You must activate /boot/device.hints in loader.conf." ; \
1811541Srgrimes		exit 1 ; \
18213086Sdg	fi
1831541Srgrimes
1841541Srgrimeskernel-install: kernel-install-check
1851541Srgrimes.endif
1861541Srgrimes.endif
1871541Srgrimes
1881541Srgrimeskernel-install:
1891541Srgrimes	@if [ ! -f ${FULLKERNEL} ] ; then \
1901541Srgrimes		echo "You must build a kernel first." ; \
1912112Swollman		exit 1 ; \
1922112Swollman	fi
1932112Swollman.if exists(${DESTDIR}${KODIR})
1942112Swollman	-thiskernel=`sysctl -n kern.bootfile` ; \
1952112Swollman	if [ "`dirname "$$thiskernel"`" != ${DESTDIR}${KODIR} ] ; then \
1962112Swollman		chflags -R noschg ${DESTDIR}${KODIR} ; \
1972112Swollman		rm -rf ${DESTDIR}${KODIR} ; \
1981541Srgrimes	else \
1993098Sphk		if [ -d ${DESTDIR}${KODIR}.old ] ; then \
2003098Sphk			chflags -R noschg ${DESTDIR}${KODIR}.old ; \
2011541Srgrimes			rm -rf ${DESTDIR}${KODIR}.old ; \
2021541Srgrimes		fi ; \
2031541Srgrimes		mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \
2041541Srgrimes		sysctl kern.bootfile=${DESTDIR}${KODIR}.old/"`basename "$$thiskernel"`" ; \
2053098Sphk	fi
2063098Sphk.endif
2073098Sphk	mkdir -p ${DESTDIR}${KODIR}
2081549Srgrimes.if defined(DEBUG) && defined(INSTALL_DEBUG)
20913490Sdyson	${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
21012767Sdyson.else
2113484Sphk	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
2123098Sphk.endif
21312767Sdyson
2147090Sbdekernel-reinstall:
2153098Sphk	@-chflags -R noschg ${DESTDIR}${KODIR}
2163098Sphk.if defined(DEBUG) && defined(INSTALL_DEBUG)
21714476Shsu	${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
2183098Sphk.else
2193098Sphk	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
2203098Sphk.endif
2211541Srgrimes
2221541Srgrimesconfig.o env.o hints.o vers.o vnode_if.o:
2231541Srgrimes	${NORMAL_C}
22412767Sdyson
2251541Srgrimesconfig.ln env.ln hints.ln vers.ln vnode_if.ln:
22612428Sphk	${NORMAL_LINT}
22712428Sphk
2283484Sphkvers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
2297695Sdg	MAKE=${MAKE} sh $S/conf/newvers.sh ${KERN_IDENT}
2307090Sbde
2317090Sbdevnode_if.c: $S/tools/vnode_if.awk $S/kern/vnode_if.src
2323484Sphk	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -c
2333484Sphk
2343484Sphkvnode_if.h: $S/tools/vnode_if.awk $S/kern/vnode_if.src
2353484Sphk	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
2363484Sphk	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
2373484Sphk	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
2387090Sbde
2397090Sbde# XXX strictly, everything depends on Makefile because changes to ${PROF}
2403484Sphk# only appear there, but we don't handle that.
2417090Sbde
2427430Sbde.include "kern.mk"
2437430Sbde