Makefile.i386 revision 43994
123353Sdfr# Makefile.i386 -- with config changes.
223353Sdfr# Copyright 1990 W. Jolitz
323353Sdfr#	from: @(#)Makefile.i386	7.1 5/10/91
4213983Skib#	$Id: Makefile.i386,v 1.138 1999/01/26 02:49:51 julian Exp $
523353Sdfr#
623353Sdfr# Makefile for FreeBSD
723353Sdfr#
823353Sdfr# This makefile is constructed from a machine description:
923353Sdfr#	config machineid
1023353Sdfr# Most changes should be made in the machine description
1123353Sdfr#	/sys/i386/conf/``machineid''
1223353Sdfr# after which you should do
1323353Sdfr#	 config machineid
1423353Sdfr# Generic makefile changes should be made in
1523353Sdfr#	/sys/i386/conf/Makefile.i386
1623353Sdfr# after which config should be rerun for all machines.
1723353Sdfr#
1823353Sdfr
1923353Sdfr# Which version of config(8) is required.
2023353Sdfr%VERSREQ=	300009
2123353Sdfr
2223353SdfrKERNFORMAT?=	elf
2323353Sdfr
2423353SdfrSTD8X16FONT?=	iso
2523353Sdfr
2623353Sdfr.if exists(./@/.)
2723353SdfrS=	./@
2823353Sdfr.else
2923353SdfrS=	../..
3050476Speter.endif
3123353SdfrI386=	${S}/i386
32296001Skib
33206622SuqsCOPTFLAGS?=-O
3423353SdfrINCLUDES= -nostdinc -I- -I. -I$S
3523353Sdfr# This hack is to allow kernel compiles to succeed on machines w/out srcdist
36213983Skib.if exists($S/../include)
37213983SkibINCLUDES+= -I$S/../include
38213983Skib.else
3923353SdfrINCLUDES+= -I/usr/include
4023353Sdfr.endif
4184306SruCOPTS=	${INCLUDES} ${IDENT} -DKERNEL -DVM_STACK -include opt_global.h 
4284306SruCFLAGS=	${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
4324890Sbde
44213983Skib# XXX LOCORE means "don't declare C stuff" not "for locore.s".
45213983SkibASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${CFLAGS}
4623353Sdfr
47213983Skib# Use the default object format for genassym, etc.
48213983SkibGEN_CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
4923353Sdfr
5023353Sdfr# Select the correct set of tools. Can't set OBJFORMAT here because it
51115440Shmp# doesn't get exported into the environment, and if it were exported
5223353Sdfr# then it might break building of genassym, etc.
5368857Sru.if ${KERNFORMAT} == "elf"
54115440ShmpCFLAGS+=	-elf
5523353Sdfr.else
5623353SdfrCFLAGS+=	-aout
5723353Sdfr.endif
58213983Skib
59108257SruLOAD_ADDRESS?=	F0100000
60213983SkibDEFINED_PROF=	${PROF}
61213983Skib.if defined(PROF)
62214061SuqsCFLAGS+=	-malign-functions=4
63213983Skib.if ${PROFLEVEL} >= 2
64213983SkibIDENT+=	-DGPROF4 -DGUPROF
65213983SkibPROF+=	-mprofiler-epilogue
66213983Skib.endif
67213983Skib.endif
68213983Skib
69213983SkibNORMAL_C= ${CC} -c ${CFLAGS} ${PROF} $<
70213983SkibNORMAL_C_C= ${CC} -c ${CFLAGS} ${PROF} $<
71213983SkibNORMAL_S= ${CC} -c ${ASM_CFLAGS} $<
72213983SkibDRIVER_C= ${CC} -c ${CFLAGS} ${PROF} $<
73213983SkibDRIVER_C_C= ${CC} -c ${CFLAGS} ${PROF} $<
74213983SkibDRIVER_S= ${CC} -c -x ${ASM_CFLAGS} $<
75213983SkibPROFILE_C= ${CC} -c ${CFLAGS} $<
76213983Skib
77213983SkibGEN_CFILES= ${I386}/i386/genassym.c
78213983Skib# setdef0.c and setdef1.c are intentionally
79213983Skib# omitted from SYSTEM_CFILES.  They include setdefs.h, a header which
8023353Sdfr# is generated from all of ${OBJS}.  We don't want to have to compile
81115440Shmp# everything just to do a make depend.
82213983SkibSYSTEM_CFILES= ioconf.c param.c vnode_if.c config.c
83213983SkibSYSTEM_SFILES= ${I386}/i386/locore.s
84213983SkibSYSTEM_DEP= Makefile symbols.exclude symbols.sort ${SYSTEM_OBJS}
85295998Skib.if ${CFLAGS:M-g} == ""
86295998SkibSYMORDER_EXCLUDE=-x symbols.exclude
87295998Skib.endif
88295998SkibSYSTEM_LD_HEAD= @echo loading ${.TARGET}; rm -f ${.TARGET}
89295998Skib.if ${KERNFORMAT} == aout || ${KERNFORMAT} == aoutkld
90213983SkibSYSTEM_OBJS= locore.o vnode_if.o ${OBJS} ioconf.o param.o config.o
91213983SkibSYSTEM_LD= @${LD} -aout -Bforcedynamic -Z -T ${LOAD_ADDRESS} -o ${.TARGET} -X ${SYSTEM_OBJS} vers.o
92213983SkibSYSTEM_LD_TAIL= @echo rearranging symbols; \
93213983Skib	symorder -m ${SYMORDER_EXCLUDE} symbols.sort ${.TARGET}; \
9423353Sdfr	size -aout ${.TARGET} ; chmod 755 ${.TARGET}
9529966Swosch.endif
9623353Sdfr.if ${KERNFORMAT} == elf
97176605SdavidcSYSTEM_OBJS= locore.o setdef0.o vnode_if.o ${OBJS} ioconf.o param.o config.o \
98176605Sdavidc	setdef1.o hack.So
9923353SdfrSYSTEM_LD= @${LD} -elf -Bdynamic -T $S/i386/conf/kernel.script \
100147647Shmp	-export-dynamic -dynamic-linker /red/herring \
101213983Skib	-o ${.TARGET} -X ${SYSTEM_OBJS} vers.o
102213983SkibSYSTEM_LD_TAIL= @size -elf ${.TARGET} ; chmod 755 ${.TARGET}
103213983SkibSYSTEM_DEP+= $S/i386/conf/kernel.script
104.endif
105
106%BEFORE_DEPEND
107
108%OBJS
109
110%CFILES
111
112%SFILES
113
114%MFILES
115
116%LOAD
117
118%CLEAN
119
120.if !exists(.depend)
121${SYSTEM_OBJS}: ${BEFORE_DEPEND:M*.h}
122.endif
123
124clean:
125	rm -f *.o *.so *.So *.ko *.s eddep errs genassym gensetdefs \
126	      kernel linterrs makelinks param.c setdef[01].c setdefs.h \
127	      symbols.exclude symbols.sort tags \
128	      vers.c vnode_if.c vnode_if.h ${CLEAN}
129
130#lint: /tmp param.c
131#	@lint -hbxn -DGENERIC -Dvolatile= ${COPTS} \
132#	  ${I386}/i386/Locore.c ${CFILES} ioconf.c param.c | \
133#	    grep -v 'struct/union .* never defined' | \
134#	    grep -v 'possible pointer alignment problem'
135
136symbols.exclude:
137	echo "gcc2_compiled." >symbols.exclude
138	echo "___gnu_compiled_c" >>symbols.exclude
139
140symbols.sort: ${I386}/i386/symbols.raw
141	grep -v '^#' ${I386}/i386/symbols.raw \
142	    | sed 's/^	//' | sort -u > symbols.sort
143
144locore.o: ${I386}/i386/locore.s assym.s
145	${NORMAL_S}
146
147.if ${KERNFORMAT} == elf
148# This is a hack.  BFD "optimizes" away dynamic mode if there are no
149# dynamic references.  We could probably do a '-Bforcedynamic' mode like
150# in the a.out ld.  For now, this works.
151hack.So: Makefile
152	touch hack.c
153	${CC} -elf -shared -nostdlib hack.c -o hack.So
154	rm -f hack.c
155.endif
156
157.ORDER: setdefs.h setdef0.c setdef1.c
158
159setdef0.o: setdef0.c setdefs.h
160	${NORMAL_C}
161
162setdef1.o: setdef1.c setdefs.h
163	${NORMAL_C}
164
165setdef0.c setdef1.c setdefs.h: ${OBJS}
166	@echo generating linker set emulation glue for ELF
167	@gensetdefs ${OBJS}
168
169# this rule stops ./assym.s in .depend from causing problems
170./assym.s: assym.s
171
172assym.s: genassym
173	./genassym >assym.s
174
175genassym.o: ${I386}/i386/genassym.c
176	${CC} -c ${GEN_CFLAGS} ${I386}/i386/genassym.c
177
178genassym: genassym.o
179	${CC} ${GEN_CFLAGS} genassym.o -o ${.TARGET}
180
181${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
182
183# XXX this assumes that the options for NORMAL_C* and DRIVER_C* are identical.
184depend: assym.s param.c vnode_if.h ${BEFORE_DEPEND}
185	rm -f .newdep
186	mkdep -a -f .newdep ${CFLAGS} ${CFILES} ${SYSTEM_CFILES}
187	mkdep -a -f .newdep ${GEN_CFLAGS} ${GEN_CFILES}
188	env MKDEP_CPP="${CC} -E" \
189	    mkdep -a -f .newdep ${ASM_CFLAGS} ${SFILES} ${SYSTEM_SFILES}
190	rm -f .depend
191	mv -f .newdep .depend
192
193cleandepend:
194	rm -f .depend
195
196links:
197	egrep '#if' ${CFILES:Nswapkernel.c} | sed -f $S/conf/defines | \
198	  sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
199	echo ${CFILES:Nswapkernel.c} | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
200	  sort -u | comm -23 - dontlink | \
201	  sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
202	sh makelinks && rm -f dontlink
203
204tags:
205	@echo "see $S/kern/Makefile for tags"
206
207install:
208	@if [ ! -f kernel ] ; then \
209		echo "You must first build your kernel before trying to install." ; \
210		exit 1 ; \
211	fi
212.if ${KERNFORMAT} == "elf" && !defined(FORCE)
213	@if [ -f /kernel -a "`file /kernel 2>/dev/null | grep ELF`" = "" ]; then \
214		echo "WARNING: You are about to install an ELF kernel for the first time!" ; \
215		echo "Please be sure you have upgraded your bootblocks and/or /boot/loader so" ; \
216		echo "that you can boot it.  Old bootblocks WILL NOT WORK!  Please read:" ; \
217		echo "http://www.freebsd.org/~peter/elfday.html for information." ; \
218		echo "If you are satisfied you can boot an ELF kernel, type:  make -DFORCE install" ; \
219		exit 1 ; \
220	fi
221.endif
222.if exists(${DESTDIR}/kernel)
223	-chflags noschg ${DESTDIR}/kernel
224	mv ${DESTDIR}/kernel ${DESTDIR}/kernel.old
225.endif
226	PATH=$${PATH}:/sbin:/usr/sbin; \
227	if [ `sysctl -n kern.bootfile` = ${DESTDIR}/kernel ] ; then \
228		sysctl -w kern.bootfile=${DESTDIR}/kernel.old ; \
229		if [ -f /var/db/kvm_kernel.db ] ; then \
230			mv -f /var/db/kvm_kernel.db /var/db/kvm_kernel.old.db ; \
231		fi \
232	fi
233	install -c -m 555 -o root -g wheel -fschg kernel ${DESTDIR}/
234
235config.o:
236	${NORMAL_C}
237
238ioconf.o:
239	${NORMAL_C}
240
241param.c: $S/conf/param.c
242	-rm -f param.c
243	cp $S/conf/param.c .
244
245param.o:
246	${NORMAL_C}
247
248vers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
249	sh $S/conf/newvers.sh ${KERN_IDENT} ${IDENT}
250
251# XXX strictly, everything depends on Makefile because changes to ${PROF}
252# only appear there, but we don't handle that.
253vers.o:
254	${NORMAL_C}
255
256.ORDER: vnode_if.c vnode_if.h
257vnode_if.c vnode_if.h: $S/kern/vnode_if.sh $S/kern/vnode_if.src
258	sh $S/kern/vnode_if.sh $S/kern/vnode_if.src
259
260vnode_if.o:
261	${NORMAL_C}
262
263.if exists($S/../share/mk)
264.include "$S/../share/mk/bsd.kern.mk"
265.else
266.include <bsd.kern.mk>
267.endif
268
269%RULES
270
271# DO NOT DELETE THIS LINE -- make depend uses it
272