kern.post.mk revision 144293
1138568Ssam# $FreeBSD: head/sys/conf/kern.post.mk 144293 2005-03-29 11:23:25Z phk $
2139530Ssam
3138568Ssam# Part of a unified Makefile for building kernels.  This part includes all
4138568Ssam# the definitions that need to be after all the % directives except %RULES
5138568Ssam# and ones that act like they are part of %RULES.
6138568Ssam#
7138568Ssam# Most make variables should not be defined in this file.  Instead, they
8138568Ssam# should be defined in the kern.pre.mk so that port makefiles can
9138568Ssam# override or augment them.
10138568Ssam
11138568Ssam# In case the config had a makeoptions DESTDIR...
12138568Ssam.if defined(DESTDIR)
13138568SsamMKMODULESENV+=	DESTDIR="${DESTDIR}"
14138568Ssam.endif
15138568SsamMKMODULESENV+=	KERNBUILDDIR="${.CURDIR}"
16138568Ssam
17138568Ssam.MAIN: all
18138568Ssam
19138568Ssam.for target in all clean cleandepend cleandir clobber depend install \
20138568Ssam    obj reinstall tags
21138568Ssam${target}: kernel-${target}
22138568Ssam.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
23138568Ssam${target}: modules-${target}
24138568Ssammodules-${target}:
25138568Ssam	cd $S/modules; ${MKMODULESENV} ${MAKE} \
26138568Ssam	    ${target:S/^reinstall$/install/:S/^clobber$/cleandir/}
27138568Ssam.endif
28138568Ssam.endfor
29138568Ssam
30138568Ssam# Handle out of tree ports 
31138568Ssam.if defined(PORTS_MODULES)
32138568Ssam.for _dir in ${.CURDIR}/../../..
33138568Ssam.if !defined(SYSDIR) && exists(${_dir}/kern/)
34138568SsamSYSDIR=	${_dir}
35138568Ssam.endif
36138568Ssam.endfor
37138568SsamPORTSMODULESENV=SYSDIR=${SYSDIR}
38138568Ssam.for __target in all install clean
39138568Ssam${__target}: ports-${__target}
40138568Ssamports-${__target}:
41138568Ssam.for __i in ${PORTS_MODULES}
42138568Ssam	cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B ${__target:C/install/deinstall reinstall/}
43138568Ssam.endfor
44138568Ssam.endfor
45138568Ssam.endif
46138568Ssam
47138568Ssam.ORDER: kernel-install modules-install
48138568Ssam
49138568Ssamkernel-all: ${KERNEL_KO}
50138568Ssam
51138568Ssamkernel-cleandir: kernel-clean
52138568Ssam
53138568Ssamkernel-clobber:
54138568Ssam	find . -maxdepth 1 ! -type d ! -name version -delete
55138568Ssam
56138568Ssamkernel-obj:
57138568Ssam
58138568Ssam.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
59138568Ssammodules: modules-all
60138568Ssam
61138568Ssam.if !defined(NO_MODULES_OBJ)
62138568Ssammodules-all modules-depend: modules-obj
63138568Ssam.endif
64138568Ssam.endif
65138568Ssam
66138568Ssam.if !defined(DEBUG)
67138568SsamFULLKERNEL=	${KERNEL_KO}
68138568Ssam.else
69138568SsamFULLKERNEL=	${KERNEL_KO}.debug
70138568Ssam${KERNEL_KO}: ${FULLKERNEL}
71138568Ssam	${OBJCOPY} --strip-debug ${FULLKERNEL} ${KERNEL_KO}
72138568Ssaminstall.debug reinstall.debug: gdbinit
73138568Ssam	cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG ${.TARGET:R}
74138568Ssam
75138568Ssam# Install gdbinit files for kernel debugging.
76138568Ssamgdbinit:
77138568Ssam	grep -v '# XXX' ${S}/../tools/debugscripts/dot.gdbinit | \
78138568Ssam	    sed "s:MODPATH:${.OBJDIR}/modules:" > .gdbinit
79138568Ssam	cp ${S}/../tools/debugscripts/gdbinit.kernel ${.CURDIR}
80138568Ssam.if exists(${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH})
81138568Ssam	cp ${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH} \
82138568Ssam	    ${.CURDIR}/gdbinit.machine
83138568Ssam.endif
84138568Ssam.endif
85138568Ssam
86138568Ssam${FULLKERNEL}: ${SYSTEM_DEP} vers.o
87138568Ssam	@rm -f ${.TARGET}
88138568Ssam	@echo linking ${.TARGET}
89138568Ssam	${SYSTEM_LD}
90138568Ssam.if !defined(DEBUG)
91138568Ssam	${OBJCOPY} --strip-debug ${.TARGET}
92138568Ssam.endif
93138568Ssam	${SYSTEM_LD_TAIL}
94138568Ssam
95138568Ssam.if !exists(${.OBJDIR}/.depend)
96138568Ssam${SYSTEM_OBJS}: assym.s vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/}
97138568Ssam.endif
98138568Ssam
99138568SsamLNFILES=	${CFILES:T:S/.c$/.ln/}
100138568Ssam
101138568Ssam.for mfile in ${MFILES}
102138568Ssam# XXX the low quality .m.o rules gnerated by config are normally used
103138568Ssam# instead of the .m.c rules here.
104138568Ssam${mfile:T:S/.m$/.c/}: ${mfile}
105138568Ssam	${AWK} -f $S/tools/makeobjops.awk ${mfile} -c
106138568Ssam${mfile:T:S/.m$/.h/}: ${mfile}
107138568Ssam	${AWK} -f $S/tools/makeobjops.awk ${mfile} -h
108138568Ssam.endfor
109138568Ssam
110138568Ssamkernel-clean:
111140633Ssam	rm -f *.o *.so *.So *.ko *.s eddep errs \
112138568Ssam	    ${FULLKERNEL} ${KERNEL_KO} linterrs makelinks tags \
113138568Ssam	    vers.c vnode_if.c vnode_if.h \
114138568Ssam	    ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \
115138568Ssam	    ${CLEAN}
116138568Ssam
117138568Ssamlint: ${LNFILES}
118138568Ssam	${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC} 2>&1 | \
119138568Ssam	    tee -a linterrs
120138568Ssam
121138568Ssam# This is a hack.  BFD "optimizes" away dynamic mode if there are no
122138568Ssam# dynamic references.  We could probably do a '-Bforcedynamic' mode like
123138568Ssam# in the a.out ld.  For now, this works.
124138568SsamHACK_EXTRA_FLAGS?= -shared
125138568Ssamhack.So: Makefile
126139512Ssam	touch hack.c
127139512Ssam	${CC} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So
128139512Ssam	rm -f hack.c
129153349Ssam
130153349Ssam# This rule stops ./assym.s in .depend from causing problems.
131153349Ssam./assym.s: assym.s
132138568Ssam
133138568Ssamassym.s: $S/kern/genassym.sh genassym.o
134138568Ssam	NM='${NM}' sh $S/kern/genassym.sh genassym.o > ${.TARGET}
135138568Ssam
136138568Ssamgenassym.o: $S/$M/$M/genassym.c
137138568Ssam	${CC} -c ${CFLAGS:N-fno-common} $S/$M/$M/genassym.c
138138568Ssam
139138568Ssam${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
140138568Ssam
141138568Ssamkernel-depend:
142138568Ssam.if defined(EXTRA_KERNELDEP)
143138568Ssam	${EXTRA_KERNELDEP}
144138568Ssam.endif
145138568Ssam	rm -f .olddep
146138568Ssam	if [ -f .depend ]; then mv .depend .olddep; fi
147138568Ssam	${MAKE} _kernel-depend
148138568Ssam
149138568Ssam# The argument list can be very long, so use make -V and xargs to
150138568Ssam# pass it to mkdep.
151138568Ssam_kernel-depend: assym.s vnode_if.h ${BEFORE_DEPEND} ${CFILES} \
152138568Ssam	    ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
153138568Ssam	    ${MFILES:T:S/.m$/.h/}
154138568Ssam	if [ -f .olddep ]; then mv .olddep .depend; fi
155138568Ssam	rm -f .newdep
156138568Ssam	${MAKE} -V CFILES -V SYSTEM_CFILES -V GEN_CFILES | \
157138568Ssam	    MKDEP_CPP="${CC} -E" CC="${CC}" xargs mkdep -a -f .newdep ${CFLAGS}
158138568Ssam	${MAKE} -V SFILES | \
159138568Ssam	    MKDEP_CPP="${CC} -E" xargs mkdep -a -f .newdep ${ASM_CFLAGS}
160138568Ssam	rm -f .depend
161138568Ssam	mv .newdep .depend
162138568Ssam
163138568Ssamkernel-cleandepend:
164138568Ssam	rm -f .depend
165138568Ssam
166138568Ssamlinks:
167138568Ssam	egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
168138568Ssam	    sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
169138568Ssam	${MAKE} -V CFILES | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
170138568Ssam	    sort -u | comm -23 - dontlink | \
171138568Ssam	    sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
172138568Ssam	sh makelinks; rm -f dontlink
173138568Ssam
174138568Ssamkernel-tags:
175138568Ssam	@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
176151967Sandre	sh $S/conf/systags.sh
177138568Ssam	rm -f tags1
178138568Ssam	sed -e 's,      ../,    ,' tags > tags1
179138568Ssam
180138568Ssam.if ${MACHINE_ARCH} != "ia64"
181138568Ssam.if exists(${DESTDIR}/boot)
182138568Ssamkernel-install-check:
183138568Ssam	@if [ ! -f ${DESTDIR}/boot/device.hints ] ; then \
184138568Ssam		echo "You must set up a ${DESTDIR}/boot/device.hints file first." ; \
185138568Ssam		exit 1 ; \
186151967Sandre	fi
187138568Ssam	@if [ x"`grep device.hints ${DESTDIR}/boot/defaults/loader.conf ${DESTDIR}/boot/loader.conf`" = "x" ]; then \
188138568Ssam		echo "You must activate /boot/device.hints in loader.conf." ; \
189138568Ssam		exit 1 ; \
190138568Ssam	fi
191138568Ssam
192138568Ssamkernel-install: kernel-install-check
193138568Ssam.endif
194138568Ssam.endif
195138568Ssam
196138568Ssamkernel-install:
197138568Ssam	@if [ ! -f ${FULLKERNEL} ] ; then \
198138568Ssam		echo "You must build a kernel first." ; \
199138568Ssam		exit 1 ; \
200138568Ssam	fi
201138568Ssam.if exists(${DESTDIR}${KODIR})
202138568Ssam	-thiskernel=`sysctl -n kern.bootfile` ; \
203138568Ssam	if [ "`dirname "$$thiskernel"`" != ${DESTDIR}${KODIR} ] ; then \
204138568Ssam		chflags -R noschg ${DESTDIR}${KODIR} ; \
205138568Ssam		rm -rf ${DESTDIR}${KODIR} ; \
206138568Ssam	else \
207138568Ssam		if [ -d ${DESTDIR}${KODIR}.old ] ; then \
208138568Ssam			chflags -R noschg ${DESTDIR}${KODIR}.old ; \
209138568Ssam			rm -rf ${DESTDIR}${KODIR}.old ; \
210138568Ssam		fi ; \
211138568Ssam		mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \
212138568Ssam		sysctl kern.bootfile=${DESTDIR}${KODIR}.old/"`basename "$$thiskernel"`" ; \
213138568Ssam	fi
214138568Ssam.endif
215144302Ssam	mkdir -p ${DESTDIR}${KODIR}
216138568Ssam.if defined(DEBUG) && defined(INSTALL_DEBUG)
217138568Ssam	${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
218138568Ssam.else
219138568Ssam	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
220138568Ssam.endif
221138568Ssam
222144302Ssamkernel-reinstall:
223138568Ssam	@-chflags -R noschg ${DESTDIR}${KODIR}
224144302Ssam.if defined(DEBUG) && defined(INSTALL_DEBUG)
225144302Ssam	${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
226144302Ssam.else
227138568Ssam	${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
228138568Ssam.endif
229138568Ssam
230138568Ssamconfig.o env.o hints.o vers.o vnode_if.o:
231138568Ssam	${NORMAL_C}
232138568Ssam
233138568Ssamconfig.ln env.ln hints.ln vers.ln vnode_if.ln:
234138568Ssam	${NORMAL_LINT}
235138568Ssam
236138568Ssamvers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
237138568Ssam	MAKE=${MAKE} sh $S/conf/newvers.sh ${KERN_IDENT}
238138568Ssam
239138568Ssamvnode_if.c: $S/tools/vnode_if.awk $S/kern/vnode_if.src
240138568Ssam	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -c
241138568Ssam
242138568Ssamvnode_if.h: $S/tools/vnode_if.awk $S/kern/vnode_if.src
243138568Ssam	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
244138568Ssam	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
245138568Ssam	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
246138568Ssam
247138568Ssam# XXX strictly, everything depends on Makefile because changes to ${PROF}
248138568Ssam# only appear there, but we don't handle that.
249138568Ssam
250138568Ssam.include "kern.mk"
251138568Ssam