Makefile.i386 revision 60001
155682Smarkm# Makefile.i386 -- with config changes.
255682Smarkm# Copyright 1990 W. Jolitz
355682Smarkm#	from: @(#)Makefile.i386	7.1 5/10/91
455682Smarkm# $FreeBSD: head/sys/conf/Makefile.i386 60001 2000-05-04 21:12:28Z obrien $
555682Smarkm#
655682Smarkm# Makefile for FreeBSD
755682Smarkm#
855682Smarkm# This makefile is constructed from a machine description:
955682Smarkm#	config machineid
1055682Smarkm# Most changes should be made in the machine description
1155682Smarkm#	/sys/i386/conf/``machineid''
1255682Smarkm# after which you should do
1355682Smarkm#	 config machineid
1455682Smarkm# Generic makefile changes should be made in
1555682Smarkm#	/sys/i386/conf/Makefile.i386
1655682Smarkm# after which config should be rerun for all machines.
1755682Smarkm#
1855682Smarkm
1955682Smarkm# Which version of config(8) is required.
2055682Smarkm%VERSREQ=	400018
2155682Smarkm
2255682Smarkm# Can be overridden by makeoptions or /etc/make.conf
2355682SmarkmKERNEL?=	kernel
2455682SmarkmSTD8X16FONT?=	iso
2555682Smarkm
2655682Smarkm.if !defined(S)
2755682Smarkm.if exists(./@/.)
2855682SmarkmS=	./@
2955682Smarkm.else
3055682SmarkmS=	../..
3155682Smarkm.endif
3255682Smarkm.endif
3355682SmarkmM=	${MACHINE_ARCH}
3455682Smarkm
3555682SmarkmSIZE?=	size
3655682Smarkm
3755682SmarkmCOPTFLAGS?=-O
3855682SmarkmINCLUDES= -nostdinc -I- -I. -I$S
3990926Snectar# This hack is to allow kernel compiles to succeed on machines w/out srcdist
4055682Smarkm.if exists($S/../include)
4155682SmarkmINCLUDES+= -I$S/../include
4255682Smarkm.else
4355682SmarkmINCLUDES+= -I/usr/include
4455682Smarkm.endif
4555682SmarkmCOPTS=	${INCLUDES} ${IDENT} -D_KERNEL -include opt_global.h
4655682SmarkmCFLAGS=	${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
4755682Smarkm
4855682Smarkm# XXX LOCORE means "don't declare C stuff" not "for locore.s".
4955682SmarkmASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${CFLAGS}
5055682Smarkm
5155682Smarkm# Select the correct set of tools. Can't set OBJFORMAT here because it
5255682Smarkm# doesn't get exported into the environment, and if it were exported
5355682Smarkm# then it might break building of utilities.
5455682SmarkmFMT=		-elf
5555682SmarkmCFLAGS+=	${FMT}
5655682Smarkm
5755682SmarkmDEFINED_PROF=	${PROF}
5855682Smarkm.if defined(PROF)
5955682SmarkmCFLAGS+=	-malign-functions=4
6055682Smarkm.if ${PROFLEVEL} >= 2
6155682SmarkmIDENT+=	-DGPROF4 -DGUPROF
6255682SmarkmPROF+=	-mprofiler-epilogue
6355682Smarkm.endif
6455682Smarkm.endif
6555682Smarkm
6655682Smarkm# Put configuration-specific C flags last (except for ${PROF}) so that they
6755682Smarkm# can override the others.
6855682SmarkmCFLAGS+=	${CONF_CFLAGS}
6955682Smarkm
7055682SmarkmNORMAL_C= ${CC} -c ${CFLAGS} ${PROF} ${.IMPSRC}
7155682SmarkmNORMAL_C_C= ${CC} -c ${CFLAGS} ${PROF} ${.IMPSRC}
7255682SmarkmNORMAL_S= ${CC} -c ${ASM_CFLAGS} ${.IMPSRC}
7355682SmarkmPROFILE_C= ${CC} -c ${CFLAGS} ${.IMPSRC}
7455682Smarkm
7555682SmarkmNORMAL_M= perl5 $S/kern/makeobjops.pl -c $<; \
7655682Smarkm	  ${CC} -c ${CFLAGS} ${PROF} ${.PREFIX}.c
7755682Smarkm
7855682SmarkmGEN_CFILES= $S/$M/$M/genassym.c
7955682Smarkm# setdef0.c and setdef1.c are intentionally
8055682Smarkm# omitted from SYSTEM_CFILES.  They include setdefs.h, a header which
8155682Smarkm# is generated from all of ${OBJS}.  We don't want to have to compile
8255682Smarkm# everything just to do a make depend.
8355682SmarkmSYSTEM_CFILES= ioconf.c param.c vnode_if.c config.c
8478527SassarSYSTEM_SFILES= $S/$M/$M/locore.s
8555682SmarkmSYSTEM_DEP= Makefile ${SYSTEM_OBJS}
8655682SmarkmSYSTEM_OBJS= locore.o setdef0.o vnode_if.o ${OBJS} ioconf.o param.o config.o \
8755682Smarkm	setdef1.o hack.So
8855682SmarkmSYSTEM_LD= @${LD} ${FMT} -Bdynamic -T $S/conf/ldscript.$M \
8955682Smarkm	-export-dynamic -dynamic-linker /red/herring \
9055682Smarkm	-o ${.TARGET} -X ${SYSTEM_OBJS} vers.o
9155682SmarkmSYSTEM_LD_TAIL= @${SIZE} ${FMT} ${.TARGET} ; chmod 755 ${.TARGET}
9255682SmarkmSYSTEM_DEP+= $S/conf/ldscript.$M
9355682Smarkm
9455682Smarkm%BEFORE_DEPEND
9555682Smarkm
9655682Smarkm%OBJS
9755682Smarkm
9855682Smarkm%CFILES
9955682Smarkm
10055682Smarkm%SFILES
10155682Smarkm
10255682Smarkm%MFILES
10355682Smarkm
10455682Smarkm%CLEAN
10578527Sassar
10678527Sassarall: ${KERNEL}
10778527Sassar
10878527Sassar.if !defined(DEBUG)
10978527SassarFULLKERNEL=	${KERNEL}
11078527Sassar.else
11178527SassarFULLKERNEL=	${KERNEL}.debug
11278527Sassar${KERNEL}: ${FULLKERNEL}
11378527Sassar	objcopy --strip-debug ${FULLKERNEL} ${KERNEL}
11478527Sassar.endif
11578527Sassar
11678527Sassar${FULLKERNEL}: ${SYSTEM_DEP} vers.o
11778527Sassar	@rm -f ${.TARGET}
11878527Sassar	@echo linking ${.TARGET}
11978527Sassar	${SYSTEM_LD}
12078527Sassar	${SYSTEM_LD_TAIL}
12155682Smarkm.if !defined(NO_MODULES) && exists(${.CURDIR}/../../modules)
12255682Smarkm	@mkdir -p ${.CURDIR}/modules
12355682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} obj
12455682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} all
12555682Smarkm.endif
12655682Smarkm
12755682Smarkm.if !exists(.depend)
12855682Smarkm${SYSTEM_OBJS}: vnode_if.h ${BEFORE_DEPEND:M*.h} ${MFILES:T:S/.m$/.h/}
12955682Smarkm.endif
13055682Smarkm
13155682Smarkm.for mfile in ${MFILES}
13255682Smarkm${mfile:T:S/.m$/.h/}: ${mfile}
13355682Smarkm	perl5 $S/kern/makeobjops.pl -h ${mfile}
13455682Smarkm.endfor
13555682Smarkm
13655682Smarkmclean:
13755682Smarkm	rm -f *.o *.so *.So *.ko *.s eddep errs genassym \
13855682Smarkm	      ${FULLKERNEL} ${KERNEL} linterrs makelinks param.c \
13955682Smarkm	      setdef[01].c setdefs.h tags \
14055682Smarkm	      vers.c vnode_if.c vnode_if.h \
14155682Smarkm	      ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \
14255682Smarkm	      ${CLEAN}
14355682Smarkm.if !defined(NO_MODULES) && exists(${.CURDIR}/../../modules)
14455682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} clean
14590926Snectar.endif
14655682Smarkm
14755682Smarkm#lint: /tmp param.c
14855682Smarkm#	@lint -hbxn -DGENERIC -Dvolatile= ${COPTS} \
14955682Smarkm#	  $S/$M/$M/Locore.c ${CFILES} ioconf.c param.c | \
15055682Smarkm#	    grep -v 'struct/union .* never defined' | \
15155682Smarkm#	    grep -v 'possible pointer alignment problem'
15255682Smarkm
15355682Smarkmlocore.o: $S/$M/$M/locore.s assym.s
15455682Smarkm	${NORMAL_S}
15555682Smarkm
15655682Smarkm# This is a hack.  BFD "optimizes" away dynamic mode if there are no
15755682Smarkm# dynamic references.  We could probably do a '-Bforcedynamic' mode like
15855682Smarkm# in the a.out ld.  For now, this works.
15955682Smarkmhack.So: Makefile
16055682Smarkm	touch hack.c
16155682Smarkm	${CC} ${FMT} -shared -nostdlib hack.c -o hack.So
16255682Smarkm	rm -f hack.c
16355682Smarkm
16455682Smarkm.ORDER: setdefs.h setdef0.c setdef1.c
16555682Smarkm
16655682Smarkmsetdef0.o: setdef0.c setdefs.h
16755682Smarkm	${NORMAL_C}
16855682Smarkm
16955682Smarkmsetdef1.o: setdef1.c setdefs.h
17055682Smarkm	${NORMAL_C}
17155682Smarkm
17255682Smarkmsetdef0.c setdef1.c setdefs.h: ${OBJS} param.o
17355682Smarkm	@gensetdefs ${OBJS} param.o
17455682Smarkm
17555682Smarkm# this rule stops ./assym.s in .depend from causing problems
17655682Smarkm./assym.s: assym.s
17755682Smarkm
17855682Smarkmassym.s: genassym.o
17955682Smarkm	genassym genassym.o >assym.s
18055682Smarkm
18155682Smarkmgenassym.o: $S/$M/$M/genassym.c
18255682Smarkm	${CC} -c ${CFLAGS} $S/$M/$M/genassym.c
18355682Smarkm
18455682Smarkm${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
18555682Smarkm
18655682Smarkmdepend: assym.s param.c vnode_if.h ${BEFORE_DEPEND} \
18755682Smarkm	    ${CFILES} ${SYSTEM_CFILES} ${GEN_CFILES} ${SFILES} \
18855682Smarkm	    ${SYSTEM_SFILES} ${MFILES:T:S/.m$/.h/}
18955682Smarkm	rm -f .newdep
19055682Smarkm	mkdep -a -f .newdep ${CFLAGS} ${CFILES} ${SYSTEM_CFILES} ${GEN_CFILES}
19155682Smarkm	env MKDEP_CPP="${CC} -E" \
19255682Smarkm	    mkdep -a -f .newdep ${ASM_CFLAGS} ${SFILES} ${SYSTEM_SFILES}
19355682Smarkm	rm -f .depend
19455682Smarkm	mv -f .newdep .depend
19555682Smarkm.if !defined(NO_MODULES) && exists(${.CURDIR}/../../modules)
19655682Smarkm	@mkdir -p ${.CURDIR}/modules
19755682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} obj
19855682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} depend
19955682Smarkm.endif
20055682Smarkm
20155682Smarkmcleandepend:
20255682Smarkm	rm -f .depend
20355682Smarkm.if !defined(NO_MODULES) && exists(${.CURDIR}/../../modules)
20455682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} cleandepend
20555682Smarkm.endif
20655682Smarkm
20755682Smarkmlinks:
20855682Smarkm	egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
20955682Smarkm	  sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
21055682Smarkm	echo ${CFILES} | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
21155682Smarkm	  sort -u | comm -23 - dontlink | \
21255682Smarkm	  sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
21355682Smarkm	sh makelinks && rm -f dontlink
21455682Smarkm
21555682Smarkmtags:
21655682Smarkm	@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
21755682Smarkm	sh $S/conf/systags.sh
21855682Smarkm	rm -f tags1
21955682Smarkm	sed -e 's,      ../,    ,' tags > tags1
22055682Smarkm
22155682Smarkminstall install.debug:
22255682Smarkm	@if [ ! -f ${KERNEL}${.TARGET:S/install//} ] ; then \
22355682Smarkm		echo "You must build a kernel first." ; \
22455682Smarkm		exit 1 ; \
22555682Smarkm	fi
22655682Smarkm.if exists(${DESTDIR}/${KERNEL})
22755682Smarkm	-chflags noschg ${DESTDIR}/${KERNEL}
22855682Smarkm	mv ${DESTDIR}/${KERNEL} ${DESTDIR}/${KERNEL}.old
22955682Smarkm.endif
23055682Smarkm	install -c -m 555 -o root -g wheel -fschg \
23155682Smarkm		${KERNEL}${.TARGET:S/install//} ${DESTDIR}/${KERNEL}
23255682Smarkm.if !defined(NO_MODULES) && exists(${.CURDIR}/../../modules)
23355682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} install
23455682Smarkm.endif
23555682Smarkm
23655682Smarkmreinstall reinstall.debug:
23755682Smarkm	install -c -m 555 -o root -g wheel -fschg \
23855682Smarkm		${KERNEL}${.TARGET:S/reinstall//} ${DESTDIR}/${KERNEL}
23955682Smarkm.if !defined(NO_MODULES) && exists(${.CURDIR}/../../modules)
24055682Smarkm	cd ${.CURDIR}/../../modules && env MAKEOBJDIRPREFIX=${.CURDIR}/modules ${MAKE} install
24155682Smarkm.endif
24255682Smarkm
24355682Smarkmconfig.o:
24455682Smarkm	${NORMAL_C}
24555682Smarkm
24655682Smarkmioconf.o:
24755682Smarkm	${NORMAL_C}
24855682Smarkm
24955682Smarkmparam.c: $S/conf/param.c
25055682Smarkm	-rm -f param.c
25155682Smarkm	cp $S/conf/param.c .
25255682Smarkm
25355682Smarkmparam.o:
25455682Smarkm	${NORMAL_C}
25555682Smarkm
25655682Smarkmvers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
25755682Smarkm	sh $S/conf/newvers.sh ${KERN_IDENT} ${IDENT}
25855682Smarkm
25955682Smarkm# XXX strictly, everything depends on Makefile because changes to ${PROF}
26055682Smarkm# only appear there, but we don't handle that.
26155682Smarkmvers.o:
26255682Smarkm	${NORMAL_C}
26355682Smarkm
26455682Smarkmvnode_if.c: $S/kern/vnode_if.pl $S/kern/vnode_if.src
26555682Smarkm	perl5 $S/kern/vnode_if.pl -c $S/kern/vnode_if.src
26655682Smarkm
26755682Smarkmvnode_if.h: $S/kern/vnode_if.pl $S/kern/vnode_if.src
26855682Smarkm	perl5 $S/kern/vnode_if.pl -h $S/kern/vnode_if.src
26955682Smarkm
27055682Smarkmvnode_if.o:
27155682Smarkm	${NORMAL_C}
27255682Smarkm
27355682Smarkm# Commented out for now pending a better solution.
27455682Smarkm# How do we pick up compiler version specific flags??
27555682Smarkm#.if exists($S/../share/mk)
27655682Smarkm#.include "$S/../share/mk/bsd.kern.mk"
27755682Smarkm#.else
27855682Smarkm.include <bsd.kern.mk>
27955682Smarkm#.endif
28055682Smarkm
28155682Smarkm%RULES
28255682Smarkm
28355682Smarkm# DO NOT DELETE THIS LINE -- make depend uses it
28455682Smarkm