kern.post.mk revision 147011
172445Sassar# $FreeBSD: head/sys/conf/kern.post.mk 147011 2005-06-05 18:34:16Z mux $
272445Sassar
372445Sassar# Part of a unified Makefile for building kernels.  This part includes all
472445Sassar# the definitions that need to be after all the % directives except %RULES
572445Sassar# and ones that act like they are part of %RULES.
672445Sassar#
772445Sassar# Most make variables should not be defined in this file.  Instead, they
872445Sassar# should be defined in the kern.pre.mk so that port makefiles can
972445Sassar# override or augment them.
1072445Sassar
1172445Sassar# In case the config had a makeoptions DESTDIR...
1272445Sassar.if defined(DESTDIR)
1372445SassarMKMODULESENV+=	DESTDIR="${DESTDIR}"
1472445Sassar.endif
1572445SassarMKMODULESENV+=	KERNBUILDDIR="${.CURDIR}"
1672445Sassar
1772445Sassar.MAIN: all
1872445Sassar
1972445Sassar.for target in all clean cleandepend cleandir clobber depend install \
2072445Sassar    obj reinstall tags
2172445Sassar${target}: kernel-${target}
2272445Sassar.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
2372445Sassar${target}: modules-${target}
2472445Sassarmodules-${target}:
2572445Sassar	cd $S/modules; ${MKMODULESENV} ${MAKE} \
2672445Sassar	    ${target:S/^reinstall$/install/:S/^clobber$/cleandir/}
2772445Sassar.endif
2872445Sassar.endfor
2972445Sassar
3072445Sassar# Handle out of tree ports 
3172445Sassar.if defined(PORTS_MODULES)
3272445Sassar.for _dir in ${.CURDIR}/../../..
3372445Sassar.if !defined(SYSDIR) && exists(${_dir}/kern/)
3472445SassarSYSDIR=	${_dir}
3572445Sassar.endif
3672445Sassar.endfor
3772445SassarPORTSMODULESENV=SYSDIR=${SYSDIR}
3872445Sassar.for __target in all install reinstall clean
3972445Sassar${__target}: ports-${__target}
4072445Sassarports-${__target}:
4172445Sassar.for __i in ${PORTS_MODULES}
4272445Sassar	cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B ${__target:C/install/deinstall reinstall/:C/reinstall/deinstall reinstall/}
4372445Sassar.endfor
4472445Sassar.endfor
4572445Sassar.endif
4672445Sassar
4772445Sassar.ORDER: kernel-install modules-install
4872445Sassar
4972445Sassarkernel-all: ${KERNEL_KO}
5072445Sassar
5172445Sassarkernel-cleandir: kernel-clean
5272445Sassar
5372445Sassarkernel-clobber:
5472445Sassar	find . -maxdepth 1 ! -type d ! -name version -delete
5572445Sassar
5672445Sassarkernel-obj:
5772445Sassar
5872445Sassar.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
5972445Sassarmodules: modules-all
6072445Sassar
6172445Sassar.if !defined(NO_MODULES_OBJ)
6272445Sassarmodules-all modules-depend: modules-obj
6372445Sassar.endif
6472445Sassar.endif
6572445Sassar
6672445Sassar.if !defined(DEBUG)
6772445SassarFULLKERNEL=	${KERNEL_KO}
6872445Sassar.else
6972445SassarFULLKERNEL=	${KERNEL_KO}.debug
7072445Sassar${KERNEL_KO}: ${FULLKERNEL}
7172445Sassar	${OBJCOPY} --strip-debug ${FULLKERNEL} ${KERNEL_KO}
7272445Sassarinstall.debug reinstall.debug: gdbinit
7372445Sassar	cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG ${.TARGET:R}
7472445Sassar
7572445Sassar# Install gdbinit files for kernel debugging.
7672445Sassargdbinit:
7772445Sassar	grep -v '# XXX' ${S}/../tools/debugscripts/dot.gdbinit | \
7872445Sassar	    sed "s:MODPATH:${.OBJDIR}/modules:" > .gdbinit
7972445Sassar	cp ${S}/../tools/debugscripts/gdbinit.kernel ${.CURDIR}
8072445Sassar.if exists(${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH})
8172445Sassar	cp ${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH} \
8272445Sassar	    ${.CURDIR}/gdbinit.machine
8372445Sassar.endif
8472445Sassar.endif
8572445Sassar
8672445Sassar${FULLKERNEL}: ${SYSTEM_DEP} vers.o
8772445Sassar	@rm -f ${.TARGET}
8872445Sassar	@echo linking ${.TARGET}
8972445Sassar	${SYSTEM_LD}
9072445Sassar.if !defined(DEBUG)
9172445Sassar	${OBJCOPY} --strip-debug ${.TARGET}
9272445Sassar.endif
9372445Sassar	${SYSTEM_LD_TAIL}
9472445Sassar
9572445Sassar.if !exists(${.OBJDIR}/.depend)
9672445Sassar${SYSTEM_OBJS}: assym.s vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/}
9772445Sassar.endif
9872445Sassar
9972445SassarLNFILES=	${CFILES:T:S/.c$/.ln/}
10072445Sassar
10172445Sassar.for mfile in ${MFILES}
10272445Sassar# XXX the low quality .m.o rules gnerated by config are normally used
10372445Sassar# instead of the .m.c rules here.
10472445Sassar${mfile:T:S/.m$/.c/}: ${mfile}
10572445Sassar	${AWK} -f $S/tools/makeobjops.awk ${mfile} -c
10672445Sassar${mfile:T:S/.m$/.h/}: ${mfile}
10772445Sassar	${AWK} -f $S/tools/makeobjops.awk ${mfile} -h
10872445Sassar.endfor
10972445Sassar
11072445Sassarkernel-clean:
11172445Sassar	rm -f *.o *.so *.So *.ko *.s eddep errs \
11272445Sassar	    ${FULLKERNEL} ${KERNEL_KO} linterrs makelinks tags vers.c \
11372445Sassar	    vnode_if.c vnode_if.h vnode_if_newproto.h vnode_if_typedef.h \
11472445Sassar	    ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \
11572445Sassar	    ${CLEAN}
11672445Sassar
11772445Sassarlint: ${LNFILES}
11872445Sassar	${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC} 2>&1 | \
11972445Sassar	    tee -a linterrs
12072445Sassar
12172445Sassar# This is a hack.  BFD "optimizes" away dynamic mode if there are no
12272445Sassar# dynamic references.  We could probably do a '-Bforcedynamic' mode like
12372445Sassar# in the a.out ld.  For now, this works.
12472445SassarHACK_EXTRA_FLAGS?= -shared
12572445Sassarhack.So: Makefile
12672445Sassar	touch hack.c
12772445Sassar	${CC} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So
12872445Sassar	rm -f hack.c
12972445Sassar
13072445Sassar# This rule stops ./assym.s in .depend from causing problems.
13172445Sassar./assym.s: assym.s
13272445Sassar
13372445Sassarassym.s: $S/kern/genassym.sh genassym.o
13472445Sassar	NM='${NM}' sh $S/kern/genassym.sh genassym.o > ${.TARGET}
13572445Sassar
13672445Sassargenassym.o: $S/$M/$M/genassym.c
13772445Sassar	${CC} -c ${CFLAGS:N-fno-common} $S/$M/$M/genassym.c
13872445Sassar
13972445Sassar${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
14072445Sassar
14172445Sassarkernel-depend: .depend
14272445Sassar# The argument list can be very long, so use make -V and xargs to
14372445Sassar# pass it to mkdep.
14472445Sassar.depend: assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \
14572445Sassar	    ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
14672445Sassar	    ${MFILES:T:S/.m$/.h/}
14772445Sassar	rm -f .newdep
14872445Sassar	${MAKE} -V CFILES -V SYSTEM_CFILES -V GEN_CFILES | \
14972445Sassar	    MKDEP_CPP="${CC} -E" CC="${CC}" xargs mkdep -a -f .newdep ${CFLAGS}
15072445Sassar	${MAKE} -V SFILES | \
15172445Sassar	    MKDEP_CPP="${CC} -E" xargs mkdep -a -f .newdep ${ASM_CFLAGS}
15272445Sassar	rm -f .depend
15372445Sassar	mv .newdep .depend
15472445Sassar
15572445Sassarkernel-cleandepend:
15672445Sassar	rm -f .depend
15772445Sassar
15872445Sassarlinks:
15972445Sassar	egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
16072445Sassar	    sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
16172445Sassar	${MAKE} -V CFILES | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
16272445Sassar	    sort -u | comm -23 - dontlink | \
16372445Sassar	    sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
16472445Sassar	sh makelinks; rm -f dontlink
16572445Sassar
16672445Sassarkernel-tags:
16772445Sassar	@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
16872445Sassar	sh $S/conf/systags.sh
16972445Sassar	rm -f tags1
17072445Sassar	sed -e 's,      ../,    ,' tags > tags1
17172445Sassar
17272445Sassar.if ${MACHINE_ARCH} != "ia64"
17372445Sassar.if exists(${DESTDIR}/boot)
17472445Sassarkernel-install-check:
17572445Sassar	@if [ ! -f ${DESTDIR}/boot/device.hints ] ; then \
17672445Sassar		echo "You must set up a ${DESTDIR}/boot/device.hints file first." ; \
17772445Sassar		exit 1 ; \
17872445Sassar	fi
17972445Sassar	@if [ x"`grep device.hints ${DESTDIR}/boot/defaults/loader.conf ${DESTDIR}/boot/loader.conf`" = "x" ]; then \
18072445Sassar		echo "You must activate /boot/device.hints in loader.conf." ; \
18172445Sassar		exit 1 ; \
18272445Sassar	fi
18372445Sassar
18472445Sassarkernel-install: kernel-install-check
18572445Sassar.endif
18672445Sassar.endif
18772445Sassar
18872445Sassarkernel-install:
18972445Sassar	@if [ ! -f ${FULLKERNEL} ] ; then \
19072445Sassar		echo "You must build a kernel first." ; \
19172445Sassar		exit 1 ; \
19272445Sassar	fi
19372445Sassar.if exists(${DESTDIR}${KODIR})
19472445Sassar	-thiskernel=`sysctl -n kern.bootfile` ; \
19572445Sassar	if [ ! "`dirname "$$thiskernel"`" -ef ${DESTDIR}${KODIR} ] ; then \
19672445Sassar		chflags -R noschg ${DESTDIR}${KODIR} ; \
19772445Sassar		rm -rf ${DESTDIR}${KODIR} ; \
19872445Sassar	else \
19972445Sassar		if [ -d ${DESTDIR}${KODIR}.old ] ; then \
20072445Sassar			chflags -R noschg ${DESTDIR}${KODIR}.old ; \
20172445Sassar			rm -rf ${DESTDIR}${KODIR}.old ; \
20272445Sassar		fi ; \
20372445Sassar		mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \
20472445Sassar		sysctl kern.bootfile=${DESTDIR}${KODIR}.old/"`basename "$$thiskernel"`" ; \
20572445Sassar	fi
20672445Sassar.endif
20772445Sassar	mkdir -p ${DESTDIR}${KODIR}
20872445Sassar.if defined(DEBUG) && defined(INSTALL_DEBUG)
20972445Sassar	${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
21072445Sassar.else
21172445Sassar	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
21272445Sassar.endif
21372445Sassar
21472445Sassarkernel-reinstall:
21572445Sassar	@-chflags -R noschg ${DESTDIR}${KODIR}
21672445Sassar.if defined(DEBUG) && defined(INSTALL_DEBUG)
21772445Sassar	${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
21872445Sassar.else
21972445Sassar	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
22072445Sassar.endif
22172445Sassar
22272445Sassarconfig.o env.o hints.o vers.o vnode_if.o:
22372445Sassar	${NORMAL_C}
22472445Sassar
22572445Sassarconfig.ln env.ln hints.ln vers.ln vnode_if.ln:
22672445Sassar	${NORMAL_LINT}
22772445Sassar
22872445Sassarvers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
22972445Sassar	MAKE=${MAKE} sh $S/conf/newvers.sh ${KERN_IDENT}
23072445Sassar
23172445Sassarvnode_if.c: $S/tools/vnode_if.awk $S/kern/vnode_if.src
23272445Sassar	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -c
23372445Sassar
23472445Sassarvnode_if.h: $S/tools/vnode_if.awk $S/kern/vnode_if.src
23572445Sassar	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
23672445Sassar	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
23772445Sassar	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
23872445Sassar
23972445Sassar# XXX strictly, everything depends on Makefile because changes to ${PROF}
24072445Sassar# only appear there, but we don't handle that.
24172445Sassar
24272445Sassar.include "kern.mk"
24372445Sassar