freebsd-dev/sys/conf/kern.post.mk
Warner Losh 54e1080557 Turns out that building modules with the kernel opt files is
uncovering some interesting problems.  Be conservative and effecitvely
disable this by default.  Interested parties may still define
KERNBUILDDIR by hand to achive the same effect.

I plan on referting this change after 5.2 is released, or sooner if
the issues with building releases are resolved and re@ approves.

Approved by: re@ (scottl, marcel)
2003-11-25 04:12:43 +00:00

229 lines
6.9 KiB
Makefile

# $FreeBSD$
# Part of a unified Makefile for building kernels. This part includes all
# the definitions that need to be after all the % directives except %RULES
# and ones that act like they are part of %RULES.
#
# Most make variables should not be defined in this file. Instead, they
# should be defined in the kern.pre.mk so that port makefiles can
# override or augment them.
# In case the config had a makeoptions DESTDIR...
.if defined(DESTDIR)
MKMODULESENV+= DESTDIR="${DESTDIR}"
.endif
.MAIN: all
.for target in all clean cleandepend cleandir clobber depend install \
obj reinstall tags
${target}: kernel-${target}
.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
${target}: modules-${target}
modules-${target}:
cd $S/modules; ${MKMODULESENV} ${MAKE} \
${target:S/^reinstall$/install/:S/^clobber$/cleandir/}
.endif
.endfor
.ORDER: kernel-install modules-install
kernel-all: ${KERNEL_KO}
kernel-cleandir: kernel-clean
kernel-clobber:
find . -maxdepth 1 ! -type d ! -name version -delete
kernel-obj:
.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists($S/modules)
modules: modules-all
.if !defined(NO_MODULES_OBJ)
modules-all modules-depend: modules-obj
.endif
.endif
.if !defined(DEBUG)
FULLKERNEL= ${KERNEL_KO}
.else
FULLKERNEL= ${KERNEL_KO}.debug
${KERNEL_KO}: ${FULLKERNEL}
${OBJCOPY} --strip-debug ${FULLKERNEL} ${KERNEL_KO}
install.debug reinstall.debug: gdbinit
cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG ${.TARGET:R}
gdbinit:
sed < ${S}/../tools/debugscripts/dot.gdbinit > .gdbinit \
"s:MODPATH:${.OBJDIR}/modules:"
cp ${S}/../tools/debugscripts/gdbinit.kernel \
${S}/../tools/debugscripts/gdbinit.vinum ${.CURDIR}
cp ${S}/../tools/debugscripts/gdbinit.${MACHINE_ARCH} \
${.CURDIR}/gdbinit.machine
.endif
${FULLKERNEL}: ${SYSTEM_DEP} vers.o
@rm -f ${.TARGET}
@echo linking ${.TARGET}
${SYSTEM_LD}
${SYSTEM_LD_TAIL}
.if !exists(${.OBJDIR}/.depend)
${SYSTEM_OBJS}: assym.s miidevs.h vnode_if.h ${BEFORE_DEPEND:M*.h} \
${MFILES:T:S/.m$/.h/}
.endif
LNFILES= ${CFILES:T:S/.c$/.ln/}
.for mfile in ${MFILES}
# XXX the low quality .m.o rules gnerated by config are normally used
# instead of the .m.c rules here.
${mfile:T:S/.m$/.c/}: ${mfile}
${AWK} -f $S/tools/makeobjops.awk ${mfile} -c
${mfile:T:S/.m$/.h/}: ${mfile}
${AWK} -f $S/tools/makeobjops.awk ${mfile} -h
.endfor
kernel-clean:
rm -f *.o *.so *.So *.ko *.s eddep errs \
${FULLKERNEL} ${KERNEL_KO} linterrs makelinks tags \
vers.c vnode_if.c vnode_if.h majors.c \
${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \
${CLEAN}
lint: ${LNFILES}
${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC} \
2>&1 | tee -a linterrs
# This is a hack. BFD "optimizes" away dynamic mode if there are no
# dynamic references. We could probably do a '-Bforcedynamic' mode like
# in the a.out ld. For now, this works.
HACK_EXTRA_FLAGS?= -shared
hack.So: Makefile
touch hack.c
${CC} ${FMT} ${HACK_EXTRA_FLAGS} -nostdlib hack.c -o hack.So
rm -f hack.c
# this rule stops ./assym.s in .depend from causing problems
./assym.s: assym.s
assym.s: $S/kern/genassym.sh genassym.o
NM=${NM} sh $S/kern/genassym.sh genassym.o > ${.TARGET}
# XXX used to force -elf after CFLAGS to work around breakage of cc -aout
# (genassym.sh makes some assumptions and cc stopped satisfying them).
genassym.o: $S/$M/$M/genassym.c
${CC} -c ${CFLAGS:N-fno-common} -Wno-inline $S/$M/$M/genassym.c
${SYSTEM_OBJS} genassym.o vers.o: opt_global.h
kernel-depend:
.if defined(EXTRA_KERNELDEP)
${EXTRA_KERNELDEP}
.endif
rm -f .olddep
if [ -f .depend ]; then mv .depend .olddep; fi
${MAKE} _kernel-depend
# XXX this belongs elsewhere (inside GEN_CFILES if possible).
GEN_M_CFILES= ${MFILES:T:S/.m$/.c/}
# The argument list can be very long, so use make -V and xargs to
# pass it to mkdep.
_kernel-depend: assym.s miidevs.h vnode_if.h ${BEFORE_DEPEND} \
${CFILES} ${SYSTEM_CFILES} ${GEN_CFILES} ${GEN_M_CFILES} \
${SFILES} ${MFILES:T:S/.m$/.h/}
if [ -f .olddep ]; then mv .olddep .depend; fi
rm -f .newdep
${MAKE} -V CFILES -V SYSTEM_CFILES -V GEN_CFILES -V GEN_M_CFILES | \
MKDEP_CPP="${CC} -E" CC="${CC}" xargs mkdep -a -f .newdep ${CFLAGS}
${MAKE} -V SFILES | \
MKDEP_CPP="${CC} -E" xargs mkdep -a -f .newdep ${ASM_CFLAGS}
rm -f .depend
mv .newdep .depend
kernel-cleandepend:
rm -f .depend
links:
egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
${MAKE} -V CFILES | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
sort -u | comm -23 - dontlink | \
sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks
sh makelinks; rm -f dontlink
kernel-tags:
@[ -f .depend ] || { echo "you must make depend first"; exit 1; }
sh $S/conf/systags.sh
rm -f tags1
sed -e 's, ../, ,' tags > tags1
kernel-install:
.if exists(${DESTDIR}/boot)
@if [ ! -f ${DESTDIR}/boot/device.hints ] ; then \
echo "You must set up a ${DESTDIR}/boot/device.hints file first." ; \
exit 1 ; \
fi
@if [ x"`grep device.hints ${DESTDIR}/boot/defaults/loader.conf ${DESTDIR}/boot/loader.conf`" = "x" ]; then \
echo "You must activate /boot/device.hints in loader.conf." ; \
exit 1 ; \
fi
.endif
@if [ ! -f ${FULLKERNEL} ] ; then \
echo "You must build a kernel first." ; \
exit 1 ; \
fi
.if exists(${DESTDIR}${KODIR})
-thiskernel=`sysctl -n kern.bootfile` ; \
if [ "`dirname "$$thiskernel"`" != ${DESTDIR}${KODIR} ] ; then \
chflags -R noschg ${DESTDIR}${KODIR} ; \
rm -rf ${DESTDIR}${KODIR} ; \
else \
if [ -d ${DESTDIR}${KODIR}.old ] ; then \
chflags -R noschg ${DESTDIR}${KODIR}.old ; \
rm -rf ${DESTDIR}${KODIR}.old ; \
fi ; \
mv ${DESTDIR}${KODIR} ${DESTDIR}${KODIR}.old ; \
sysctl kern.bootfile=${DESTDIR}${KODIR}.old/"`basename "$$thiskernel"`" ; \
fi
.endif
mkdir -p ${DESTDIR}${KODIR}
.if defined(DEBUG) && defined(INSTALL_DEBUG)
${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
.else
${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
.endif
kernel-reinstall:
@-chflags -R noschg ${DESTDIR}${KODIR}
.if defined(DEBUG) && defined(INSTALL_DEBUG)
${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}
.else
${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR}
.endif
config.o env.o hints.o majors.o vers.o vnode_if.o:
${NORMAL_C}
config.ln env.ln hints.ln majors.ln vers.ln vnode_if.ln:
${NORMAL_LINT}
majors.c: $S/conf/majors $S/conf/majors.awk
${AWK} -f $S/conf/majors.awk $S/conf/majors > ${.TARGET}
vers.c: $S/conf/newvers.sh $S/sys/param.h ${SYSTEM_DEP}
sh $S/conf/newvers.sh ${KERN_IDENT}
vnode_if.c: $S/tools/vnode_if.awk $S/kern/vnode_if.src
${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -c
vnode_if.h: $S/tools/vnode_if.awk $S/kern/vnode_if.src
${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
# XXX strictly, everything depends on Makefile because changes to ${PROF}
# only appear there, but we don't handle that.
.include "kern.mk"