kern.post.mk revision 85914
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 85914 2001-11-02 21:50:15Z 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.if defined(EXTRA_GENASSYM)
78	${EXTRA_GENASSYM}
79.endif
80	${CC} -c ${CFLAGS} $S/$M/$M/genassym.c
81
82${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
83
84kernel-depend:
85	rm -f .olddep
86	if [ -f .depend ]; then mv .depend .olddep; fi
87	${MAKE} _kernel-depend
88
89_kernel-depend: assym.s vnode_if.h ${BEFORE_DEPEND} \
90	    ${CFILES} ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
91	    ${SYSTEM_SFILES} ${MFILES:T:S/.m$/.h/}
92	if [ -f .olddep ]; then mv .olddep .depend; fi
93	rm -f .newdep
94	env MKDEP_CPP="${CC} -E" CC="${CC}" \
95	    mkdep -a -f .newdep ${CFLAGS} ${CFILES} ${SYSTEM_CFILES} ${GEN_CFILES}
96	env MKDEP_CPP="${CC} -E" \
97	    mkdep -a -f .newdep ${ASM_CFLAGS} ${SFILES} ${SYSTEM_SFILES}
98	rm -f .depend
99	mv .newdep .depend
100
101kernel-cleandepend:
102	rm -f .depend
103
104links:
105	egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
106	  sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
107	echo ${CFILES} | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
108	  sort -u | comm -23 - dontlink | \
109	  sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
110	sh makelinks; rm -f dontlink
111
112kernel-tags:
113	@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
114	sh $S/conf/systags.sh
115	rm -f tags1
116	sed -e 's,      ../,    ,' tags > tags1
117
118kernel-install kernel-install.debug:
119.if exists(${DESTDIR}/boot)
120	@if [ ! -f ${DESTDIR}/boot/device.hints ] ; then \
121		echo "You must set up a ${DESTDIR}/boot/device.hints file first." ; \
122		exit 1 ; \
123	fi
124	@if [ x"`grep device.hints ${DESTDIR}/boot/defaults/loader.conf ${DESTDIR}/boot/loader.conf`" = "x" ]; then \
125		echo "You must activate /boot/device.hints in loader.conf." ; \
126		exit 1 ; \
127	fi
128.endif
129	@if [ ! -f ${KERNEL_KO}${.TARGET:S/kernel-install//} ] ; then \
130		echo "You must build a kernel first." ; \
131		exit 1 ; \
132	fi
133.if exists(${DESTDIR}${KODIR})
134	-thiskernel=`sysctl -n kern.bootfile` ; \
135	if [ "$$thiskernel" = ${DESTDIR}${KODIR}.old/${KERNEL_KO} ] ; then \
136		chflags -R noschg ${DESTDIR}${KODIR} ; \
137		rm -rf ${DESTDIR}${KODIR} ; \
138	else \
139		if [ -d ${DESTDIR}${KODIR}.old ] ; then \
140			chflags -R noschg ${DESTDIR}${KODIR}.old ; \
141			rm -rf ${DESTDIR}${KODIR}.old ; \
142		fi ; \
143		mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \
144		if [ "$$thiskernel" = ${DESTDIR}${KODIR}/${KERNEL_KO} ] ; then \
145			sysctl -w kern.bootfile=${DESTDIR}${KODIR}.old/${KERNEL_KO} ; \
146		fi; \
147	fi
148.endif
149	mkdir -p ${DESTDIR}${KODIR}
150	install -c -m 555 -o root -g wheel \
151		${KERNEL_KO}${.TARGET:S/kernel-install//} ${DESTDIR}${KODIR}
152
153kernel-reinstall kernel-reinstall.debug:
154	@-chflags -R noschg ${DESTDIR}${KODIR}
155	install -c -m 555 -o root -g wheel \
156		${KERNEL_KO}${.TARGET:S/kernel-reinstall//} ${DESTDIR}${KODIR}
157
158.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
159all:	modules
160depend: modules-depend
161clean:  modules-clean
162cleandepend:  modules-cleandepend
163cleandir:  modules-cleandir
164clobber:  modules-clobber
165tags:  modules-tags
166install: modules-install
167install.debug: modules-install.debug
168reinstall: modules-reinstall
169reinstall.debug: modules-reinstall.debug
170.endif
171
172MKMODULESENV=	MAKEOBJDIRPREFIX=${.OBJDIR}/modules KMODDIR=${KODIR}
173.if defined(MODULES_OVERRIDE)
174MKMODULESENV+=	MODULES_OVERRIDE="${MODULES_OVERRIDE}"
175.endif
176.if defined(DEBUG)
177MKMODULESENV+=	DEBUG="${DEBUG}" DEBUG_FLAGS="${DEBUG}"
178.endif
179
180modules:
181	@mkdir -p ${.OBJDIR}/modules
182	cd $S/modules ; env ${MKMODULESENV} ${MAKE} obj ; \
183	    env ${MKMODULESENV} ${MAKE} all
184
185modules-depend:
186	@mkdir -p ${.OBJDIR}/modules
187	cd $S/modules ; env ${MKMODULESENV} ${MAKE} obj ; \
188	    env ${MKMODULESENV} ${MAKE} depend
189
190modules-clean:
191	cd $S/modules ; env ${MKMODULESENV} ${MAKE} clean
192
193modules-cleandepend:
194	cd $S/modules ; env ${MKMODULESENV} ${MAKE} cleandepend
195
196modules-clobber:	modules-clean
197	rm -rf ${MKMODULESENV}
198
199modules-cleandir:
200	cd $S/modules ; env ${MKMODULESENV} ${MAKE} cleandir
201
202modules-tags:
203	cd $S/modules ; env ${MKMODULESENV} ${MAKE} tags
204
205modules-install modules-reinstall:
206	cd $S/modules ; env ${MKMODULESENV} ${MAKE} install
207
208modules-install.debug modules-reinstall.debug:
209	cd $S/modules ; env ${MKMODULESENV} ${MAKE} install.debug
210
211config.o:
212	${NORMAL_C}
213
214vers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
215	sh $S/conf/newvers.sh ${KERN_IDENT} ${IDENT}
216
217# XXX strictly, everything depends on Makefile because changes to ${PROF}
218# only appear there, but we don't handle that.
219vers.o:
220	${NORMAL_C}
221
222hints.o:	hints.c
223	${NORMAL_C}
224
225env.o:	env.c
226	${NORMAL_C}
227
228vnode_if.c: $S/kern/vnode_if.pl $S/kern/vnode_if.src
229	perl5 $S/kern/vnode_if.pl -c $S/kern/vnode_if.src
230
231vnode_if.h: $S/kern/vnode_if.pl $S/kern/vnode_if.src
232	perl5 $S/kern/vnode_if.pl -h $S/kern/vnode_if.src
233
234vnode_if.o:
235	${NORMAL_C}
236
237# Commented out for now pending a better solution.
238# How do we pick up compiler version specific flags??
239#.if exists($S/../share/mk)
240#.include "$S/../share/mk/bsd.kern.mk"
241#.else
242.include <bsd.kern.mk>
243#.endif
244