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