kern.post.mk revision 161283
1139823Simp# $FreeBSD: head/sys/conf/kern.post.mk 161283 2006-08-14 13:28:53Z des $
2189592Sbms
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(NO_MODULES) && defined(PORTS_MODULES)
321541SrgrimesSYSDIR?= ${S:C;^[^/];${.CURDIR}/&;}
331541SrgrimesPORTSMODULESENV=SYSDIR=${SYSDIR}
341541Srgrimes.for __target in all install reinstall clean
351541Srgrimes${__target}: ports-${__target}
361541Srgrimesports-${__target}:
372531Swollman.for __i in ${PORTS_MODULES}
382531Swollman	cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B ${__target:C/install/deinstall reinstall/:C/reinstall/deinstall reinstall/}
39189592Sbms.endfor
402531Swollman.endfor
412531Swollman.endif
422531Swollman
439209Swollman.ORDER: kernel-install modules-install
4414622Sfenner
45189592Sbmskernel-all: ${KERNEL_KO}
462531Swollman
4714622Sfennerkernel-cleandir: kernel-clean kernel-cleandepend
482531Swollman
491541Srgrimeskernel-clobber:
50172467Ssilby	find . -maxdepth 1 ! -type d ! -name version -delete
51172467Ssilby
52172467Ssilbykernel-obj:
531541Srgrimes
541549Srgrimes.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
55189592Sbmsmodules: modules-all
5629024Sbde
571541Srgrimes.if !defined(NO_MODULES_OBJ)
581541Srgrimesmodules-all modules-depend: modules-obj
591541Srgrimes.endif
6012296Sphk.endif
616472Swollman
62181803Sbz.if !defined(DEBUG)
63189592SbmsFULLKERNEL=	${KERNEL_KO}
64189592Sbms.else
651541SrgrimesFULLKERNEL=	${KERNEL_KO}.debug
661541Srgrimes${KERNEL_KO}: ${FULLKERNEL} ${KERNEL_KO}.symbols
67189592Sbms	${OBJCOPY} --strip-debug --add-gnu-debuglink=${KERNEL_KO}.symbols\
68185571Sbz	    ${FULLKERNEL} ${.TARGET}
691541Srgrimes${KERNEL_KO}.symbols: ${FULLKERNEL}
701541Srgrimes	${OBJCOPY} --only-keep-debug ${FULLKERNEL} ${.TARGET}
711541Srgrimesinstall.debug reinstall.debug: gdbinit
721541Srgrimes	cd ${.CURDIR}; ${MAKE} ${.TARGET:R}
731541Srgrimes
741541Srgrimes# Install gdbinit files for kernel debugging.
75152592Sandregdbinit:
761541Srgrimes	grep -v '# XXX' ${S}/../tools/debugscripts/dot.gdbinit | \
771541Srgrimes	    sed "s:MODPATH:${.OBJDIR}/modules:" > .gdbinit
781541Srgrimes	cp ${S}/../tools/debugscripts/gdbinit.kernel ${.CURDIR}
7960105Sjlemon.if exists(${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH})
8060105Sjlemon	cp ${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH} \
81163606Srwatson	    ${.CURDIR}/gdbinit.machine
82163606Srwatson.endif
83189592Sbms.endif
84191657Sbms
85189592Sbms${FULLKERNEL}: ${SYSTEM_DEP} vers.o
8630309Sphk	@rm -f ${.TARGET}
87189592Sbms	@echo linking ${.TARGET}
88189592Sbms	${SYSTEM_LD}
89189592Sbms.if !defined(DEBUG)
90189592Sbms	${OBJCOPY} --strip-debug ${.TARGET}
91189592Sbms.endif
92189592Sbms	${SYSTEM_LD_TAIL}
93189592Sbms.if defined(MFS_IMAGE)
94189592Sbms	@dd if="${MFS_IMAGE}" ibs=8192 of="${KERNEL_KO}"		\
95189592Sbms	   obs=`strings -at d "${KERNEL_KO}" |				\
96193231Sbms	         grep "MFS Filesystem goes here" | awk '{print $$1}'`	\
97193231Sbms	   oseek=1 conv=notrunc 2>/dev/null &&				\
98189592Sbms	 strings ${KERNEL_KO} |						\
99189592Sbms	 grep 'MFS Filesystem had better STOP here' > /dev/null ||	\
100189592Sbms	 (rm ${KERNEL_KO} && echo 'MFS image too large' && false)
101189592Sbms.endif
102189592Sbms
103189592Sbms.if !exists(${.OBJDIR}/.depend)
104189592Sbms${SYSTEM_OBJS}: assym.s vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/}
105189592Sbms.endif
106189592Sbms
107189592SbmsLNFILES=	${CFILES:T:S/.c$/.ln/}
108189592Sbms
109189592Sbms.for mfile in ${MFILES}
110189592Sbms# XXX the low quality .m.o rules gnerated by config are normally used
111189592Sbms# instead of the .m.c rules here.
112189592Sbms${mfile:T:S/.m$/.c/}: ${mfile}
113189592Sbms	${AWK} -f $S/tools/makeobjops.awk ${mfile} -c
114185088Szec${mfile:T:S/.m$/.h/}: ${mfile}
115189592Sbms	${AWK} -f $S/tools/makeobjops.awk ${mfile} -h
116189592Sbms.endfor
117189592Sbms
118189592Sbmskernel-clean:
119189592Sbms	rm -f *.o *.so *.So *.ko *.s eddep errs \
120189592Sbms	    ${FULLKERNEL} ${KERNEL_KO} ${KERNEL_KO}.symbols \
121189592Sbms	    linterrs makelinks tags vers.c \
122189592Sbms	    vnode_if.c vnode_if.h vnode_if_newproto.h vnode_if_typedef.h \
123189592Sbms	    ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \
124189592Sbms	    ${CLEAN} ${_ILINKS}
125189592Sbms
126189592Sbmslint: ${LNFILES}
127189592Sbms	${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC} 2>&1 | \
128189592Sbms	    tee -a linterrs
129189592Sbms
130189592Sbms# This is a hack.  BFD "optimizes" away dynamic mode if there are no
131189592Sbms# dynamic references.  We could probably do a '-Bforcedynamic' mode like
132189592Sbms# in the a.out ld.  For now, this works.
133189592SbmsHACK_EXTRA_FLAGS?= -shared
134189592Sbmshack.So: Makefile
135189592Sbms	:> hack.c
136189592Sbms	${CC} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So
137189592Sbms	rm -f hack.c
138189592Sbms
1392531Swollman# This rule stops ./assym.s in .depend from causing problems.
140189592Sbms./assym.s: assym.s
141189592Sbms
14212296Sphkassym.s: $S/kern/genassym.sh genassym.o
143193219Srwatson	NM='${NM}' sh $S/kern/genassym.sh genassym.o > ${.TARGET}
144193219Srwatson
145193219Srwatsongenassym.o: $S/$M/$M/genassym.c
146193219Srwatson	${CC} -c ${CFLAGS:N-fno-common} $S/$M/$M/genassym.c
147193219Srwatson
148193219Srwatson${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
149193219Srwatson
150130333Srwatsonkernel-depend: .depend
151189592Sbms# The argument list can be very long, so use make -V and xargs to
152189592Sbms# pass it to mkdep.
153189592SbmsSRCS=	assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \
154189592Sbms	${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
155189592Sbms	${MFILES:T:S/.m$/.h/}
156189592Sbms.depend: ${SRCS}
157189592Sbms	rm -f .newdep
158189592Sbms	${MAKE} -V CFILES -V SYSTEM_CFILES -V GEN_CFILES | \
159189592Sbms	    MKDEP_CPP="${CC} -E" CC="${CC}" xargs mkdep -a -f .newdep ${CFLAGS}
160189592Sbms	${MAKE} -V SFILES | \
161189592Sbms	    MKDEP_CPP="${CC} -E" xargs mkdep -a -f .newdep ${ASM_CFLAGS}
162191264Sbms	rm -f .depend
163191264Sbms	mv .newdep .depend
164189592Sbms
165189592Sbms_ILINKS= machine
166189592Sbms.if ${MACHINE} != ${MACHINE_ARCH}
167189592Sbms_ILINKS+= ${MACHINE_ARCH}
168189592Sbms.endif
169189592Sbms
170189592Sbms# Ensure that the link exists without depending on it when it exists.
171189592Sbms.for _link in ${_ILINKS}
172189592Sbms.if !exists(${.OBJDIR}/${_link})
173189592Sbms${SRCS}: ${_link}
174189592Sbms.endif
175189592Sbms.endfor
176189592Sbms
177189592Sbms${_ILINKS}:
178189592Sbms	@case ${.TARGET} in \
179189592Sbms	machine) \
180189592Sbms		path=${S}/${MACHINE}/include ;; \
181189592Sbms	${MACHINE_ARCH}) \
182189592Sbms		path=${S}/${MACHINE_ARCH}/include ;; \
183189592Sbms	esac ; \
184189931Sbms	${ECHO} ${.TARGET} "->" $$path ; \
185189931Sbms	ln -s $$path ${.TARGET}
186189931Sbms
187189931Sbmskernel-cleandepend:
188189931Sbms	rm -f .depend
189130333Srwatson
190189592Sbmslinks:
191189592Sbms	egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
192189592Sbms	    sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
193189592Sbms	${MAKE} -V CFILES | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
194189592Sbms	    sort -u | comm -23 - dontlink | \
195189592Sbms	    sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
196189592Sbms	sh makelinks; rm -f dontlink
197189592Sbms
198189592Sbmskernel-tags:
199189592Sbms	@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
200189592Sbms	sh $S/conf/systags.sh
201189592Sbms
202189592Sbmskernel-install:
203189592Sbms	@if [ ! -f ${KERNEL_KO} ] ; then \
204189592Sbms		echo "You must build a kernel first." ; \
205189592Sbms		exit 1 ; \
206189592Sbms	fi
207189592Sbms.if exists(${DESTDIR}${KODIR})
208189592Sbms	-thiskernel=`sysctl -n kern.bootfile` ; \
209189592Sbms	if [ ! "`dirname "$$thiskernel"`" -ef ${DESTDIR}${KODIR} ] ; then \
210189592Sbms		chflags -R noschg ${DESTDIR}${KODIR} ; \
211189592Sbms		rm -rf ${DESTDIR}${KODIR} ; \
212189592Sbms	else \
213189592Sbms		if [ -d ${DESTDIR}${KODIR}.old ] ; then \
214195699Srwatson			chflags -R noschg ${DESTDIR}${KODIR}.old ; \
215195699Srwatson			rm -rf ${DESTDIR}${KODIR}.old ; \
216195699Srwatson		fi ; \
217195699Srwatson		mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \
218195699Srwatson		sysctl kern.bootfile=${DESTDIR}${KODIR}.old/"`basename "$$thiskernel"`" ; \
219195699Srwatson	fi
220195699Srwatson.endif
221130333Srwatson	mkdir -p ${DESTDIR}${KODIR}
222195727Srwatson	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
223195727Srwatson.if defined(DEBUG) && !defined(INSTALL_NODEBUG)
224195727Srwatson	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO}.symbols ${DESTDIR}${KODIR}
225189592Sbms.endif
226195699Srwatson
227195699Srwatsonkernel-reinstall:
228195699Srwatson	@-chflags -R noschg ${DESTDIR}${KODIR}
229189592Sbms	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
230195727Srwatson.if defined(DEBUG) && !defined(INSTALL_NODEBUG)
231195727Srwatson	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO}.symbols ${DESTDIR}${KODIR}
232195727Srwatson.endif
233195699Srwatson
234195699Srwatsonconfig.o env.o hints.o vers.o vnode_if.o:
235195699Srwatson	${NORMAL_C}
236195699Srwatson
237195699Srwatsonconfig.ln env.ln hints.ln vers.ln vnode_if.ln:
238195699Srwatson	${NORMAL_LINT}
239195699Srwatson
240195699Srwatsonvers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
241195699Srwatson	MAKE=${MAKE} sh $S/conf/newvers.sh ${KERN_IDENT}
242195727Srwatson
243195727Srwatsonvnode_if.c: $S/tools/vnode_if.awk $S/kern/vnode_if.src
244195727Srwatson	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -c
245195727Srwatson
246195727Srwatsonvnode_if.h: $S/tools/vnode_if.awk $S/kern/vnode_if.src
247195727Srwatson	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
248195727Srwatson	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
249195699Srwatson	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
250130333Srwatson
251189592Sbms# XXX strictly, everything depends on Makefile because changes to ${PROF}
252130333Srwatson# only appear there, but we don't handle that.
253195699Srwatson
254195699Srwatson.include "kern.mk"
255195699Srwatson