kern.post.mk revision 85909
1# kern.post.mk
2#
3# Unified Makefile for building kenrels.  This includes all the definitions
4# that need to be included after all the % directives, except %RULES and
5# things that act like they are part of %RULES
6#
7# $FreeBSD: head/sys/conf/kern.post.mk 85909 2001-11-02 21:34:20Z imp $
8#
9
10.PHONY:	all modules
11
12all: ${KERNEL_KO}
13
14depend: kernel-depend
15clean:  kernel-clean
16cleandepend:  kernel-cleandepend
17clobber: kernel-clobber
18tags:  kernel-tags
19install: kernel-install
20install.debug: kernel-install.debug
21reinstall: kernel-reinstall
22reinstall.debug: kernel-reinstall.debug
23
24.if !defined(DEBUG)
25FULLKERNEL=	${KERNEL_KO}
26.else
27FULLKERNEL=	${KERNEL_KO}.debug
28${KERNEL_KO}: ${FULLKERNEL}
29	${OBJCOPY} --strip-debug ${FULLKERNEL} ${KERNEL_KO}
30.endif
31
32${FULLKERNEL}: ${SYSTEM_DEP} vers.o
33	@rm -f ${.TARGET}
34	@echo linking ${.TARGET}
35	${SYSTEM_LD}
36	${SYSTEM_LD_TAIL}
37
38.if !exists(.depend)
39${SYSTEM_OBJS}: vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/}
40.endif
41
42.for mfile in ${MFILES}
43${mfile:T:S/.m$/.h/}: ${mfile}
44	perl5 $S/kern/makeobjops.pl -h ${mfile}
45.endfor
46
47kernel-clean:
48	rm -f *.o *.so *.So *.ko *.s eddep errs \
49	      ${FULLKERNEL} ${KERNEL_KO} linterrs makelinks \
50	      setdef[01].c setdefs.h tags \
51	      vers.c vnode_if.c vnode_if.h \
52	      ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \
53	      ${CLEAN}
54
55kernel-clobber:
56	find . -type f ! -name version -delete
57
58locore.o: $S/$M/$M/locore.s assym.s
59	${NORMAL_S}
60
61# This is a hack.  BFD "optimizes" away dynamic mode if there are no
62# dynamic references.  We could probably do a '-Bforcedynamic' mode like
63# in the a.out ld.  For now, this works.
64HACK_EXTRA_FLAGS?= -shared
65hack.So: Makefile
66	touch hack.c
67	${CC} ${FMT} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So
68	rm -f hack.c
69
70# this rule stops ./assym.s in .depend from causing problems
71./assym.s: assym.s
72
73assym.s: $S/kern/genassym.sh genassym.o
74	NM=${NM} OBJFORMAT=elf sh $S/kern/genassym.sh genassym.o > ${.TARGET}
75
76genassym.o: $S/$M/$M/genassym.c
77	${CC} -c ${CFLAGS} $S/$M/$M/genassym.c
78
79${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
80
81kernel-depend:
82	rm -f .olddep
83	if [ -f .depend ]; then mv .depend .olddep; fi
84	${MAKE} _kernel-depend
85
86_kernel-depend: assym.s vnode_if.h ${BEFORE_DEPEND} \
87	    ${CFILES} ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
88	    ${SYSTEM_SFILES} ${MFILES:T:S/.m$/.h/}
89	if [ -f .olddep ]; then mv .olddep .depend; fi
90	rm -f .newdep
91	env MKDEP_CPP="${CC} -E" CC="${CC}" \
92	    mkdep -a -f .newdep ${CFLAGS} ${CFILES} ${SYSTEM_CFILES} ${GEN_CFILES}
93	env MKDEP_CPP="${CC} -E" \
94	    mkdep -a -f .newdep ${ASM_CFLAGS} ${SFILES} ${SYSTEM_SFILES}
95	rm -f .depend
96	mv .newdep .depend
97
98kernel-cleandepend:
99	rm -f .depend
100
101links:
102	egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
103	  sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
104	echo ${CFILES} | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
105	  sort -u | comm -23 - dontlink | \
106	  sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
107	sh makelinks; rm -f dontlink
108
109kernel-tags:
110	@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
111	sh $S/conf/systags.sh
112	rm -f tags1
113	sed -e 's,      ../,    ,' tags > tags1
114
115kernel-install kernel-install.debug:
116.if exists(${DESTDIR}/boot)
117	@if [ ! -f ${DESTDIR}/boot/device.hints ] ; then \
118		echo "You must set up a ${DESTDIR}/boot/device.hints file first." ; \
119		exit 1 ; \
120	fi
121	@if [ x"`grep device.hints ${DESTDIR}/boot/defaults/loader.conf ${DESTDIR}/boot/loader.conf`" = "x" ]; then \
122		echo "You must activate /boot/device.hints in loader.conf." ; \
123		exit 1 ; \
124	fi
125.endif
126	@if [ ! -f ${KERNEL_KO}${.TARGET:S/kernel-install//} ] ; then \
127		echo "You must build a kernel first." ; \
128		exit 1 ; \
129	fi
130.if exists(${DESTDIR}${KODIR})
131	-thiskernel=`sysctl -n kern.bootfile` ; \
132	if [ "$$thiskernel" = ${DESTDIR}${KODIR}.old/${KERNEL_KO} ] ; then \
133		chflags -R noschg ${DESTDIR}${KODIR} ; \
134		rm -rf ${DESTDIR}${KODIR} ; \
135	else \
136		if [ -d ${DESTDIR}${KODIR}.old ] ; then \
137			chflags -R noschg ${DESTDIR}${KODIR}.old ; \
138			rm -rf ${DESTDIR}${KODIR}.old ; \
139		fi ; \
140		mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \
141		if [ "$$thiskernel" = ${DESTDIR}${KODIR}/${KERNEL_KO} ] ; then \
142			sysctl -w kern.bootfile=${DESTDIR}${KODIR}.old/${KERNEL_KO} ; \
143		fi; \
144	fi
145.endif
146	mkdir -p ${DESTDIR}${KODIR}
147	install -c -m 555 -o root -g wheel \
148		${KERNEL_KO}${.TARGET:S/kernel-install//} ${DESTDIR}${KODIR}
149
150kernel-reinstall kernel-reinstall.debug:
151	@-chflags -R noschg ${DESTDIR}${KODIR}
152	install -c -m 555 -o root -g wheel \
153		${KERNEL_KO}${.TARGET:S/kernel-reinstall//} ${DESTDIR}${KODIR}
154
155.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
156all:	modules
157depend: modules-depend
158clean:  modules-clean
159cleandepend:  modules-cleandepend
160cleandir:  modules-cleandir
161clobber:  modules-clobber
162tags:  modules-tags
163install: modules-install
164install.debug: modules-install.debug
165reinstall: modules-reinstall
166reinstall.debug: modules-reinstall.debug
167.endif
168
169MKMODULESENV=	MAKEOBJDIRPREFIX=${.OBJDIR}/modules KMODDIR=${KODIR}
170.if defined(MODULES_OVERRIDE)
171MKMODULESENV+=	MODULES_OVERRIDE="${MODULES_OVERRIDE}"
172.endif
173.if defined(DEBUG)
174MKMODULESENV+=	DEBUG="${DEBUG}" DEBUG_FLAGS="${DEBUG}"
175.endif
176
177modules:
178	@mkdir -p ${.OBJDIR}/modules
179	cd $S/modules ; env ${MKMODULESENV} ${MAKE} obj ; \
180	    env ${MKMODULESENV} ${MAKE} all
181
182modules-depend:
183	@mkdir -p ${.OBJDIR}/modules
184	cd $S/modules ; env ${MKMODULESENV} ${MAKE} obj ; \
185	    env ${MKMODULESENV} ${MAKE} depend
186
187modules-clean:
188	cd $S/modules ; env ${MKMODULESENV} ${MAKE} clean
189
190modules-cleandepend:
191	cd $S/modules ; env ${MKMODULESENV} ${MAKE} cleandepend
192
193modules-clobber:	modules-clean
194	rm -rf ${MKMODULESENV}
195
196modules-cleandir:
197	cd $S/modules ; env ${MKMODULESENV} ${MAKE} cleandir
198
199modules-tags:
200	cd $S/modules ; env ${MKMODULESENV} ${MAKE} tags
201
202modules-install modules-reinstall:
203	cd $S/modules ; env ${MKMODULESENV} ${MAKE} install
204
205modules-install.debug modules-reinstall.debug:
206	cd $S/modules ; env ${MKMODULESENV} ${MAKE} install.debug
207
208config.o:
209	${NORMAL_C}
210
211vers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
212	sh $S/conf/newvers.sh ${KERN_IDENT} ${IDENT}
213
214# XXX strictly, everything depends on Makefile because changes to ${PROF}
215# only appear there, but we don't handle that.
216vers.o:
217	${NORMAL_C}
218
219hints.o:	hints.c
220	${NORMAL_C}
221
222env.o:	env.c
223	${NORMAL_C}
224
225vnode_if.c: $S/kern/vnode_if.pl $S/kern/vnode_if.src
226	perl5 $S/kern/vnode_if.pl -c $S/kern/vnode_if.src
227
228vnode_if.h: $S/kern/vnode_if.pl $S/kern/vnode_if.src
229	perl5 $S/kern/vnode_if.pl -h $S/kern/vnode_if.src
230
231vnode_if.o:
232	${NORMAL_C}
233
234# Commented out for now pending a better solution.
235# How do we pick up compiler version specific flags??
236#.if exists($S/../share/mk)
237#.include "$S/../share/mk/bsd.kern.mk"
238#.else
239.include <bsd.kern.mk>
240#.endif
241