Makefile revision 219177
118334Speter#
218334Speter# $FreeBSD: head/Makefile 219177 2011-03-02 14:39:26Z nwhitehorn $
390075Sobrien#
496263Sobrien# The user-driven targets are:
518334Speter#
690075Sobrien# universe            - *Really* build *everything* (buildworld and
718334Speter#                       all kernels on all architectures).
890075Sobrien# tinderbox           - Same as universe, but presents a list of failed build
990075Sobrien#                       targets and exits with an error if there were any.
1090075Sobrien# buildworld          - Rebuild *everything*, including glue to help do
1190075Sobrien#                       upgrades.
1218334Speter# installworld        - Install everything built by "buildworld".
1390075Sobrien# world               - buildworld + installworld, no kernel.
1490075Sobrien# buildkernel         - Rebuild the kernel and the kernel-modules.
1590075Sobrien# installkernel       - Install the kernel and the kernel-modules.
1690075Sobrien# installkernel.debug
1718334Speter# reinstallkernel     - Reinstall the kernel and the kernel-modules.
1818334Speter# reinstallkernel.debug
1990075Sobrien# kernel              - buildkernel + installkernel.
2090075Sobrien# kernel-toolchain    - Builds the subset of world necessary to build a kernel
2190075Sobrien# doxygen             - Build API documentation of the kernel, needs doxygen.
2218334Speter# update              - Convenient way to update your source tree (cvs).
2390075Sobrien# check-old           - List obsolete directories/files/libraries.
2490075Sobrien# check-old-dirs      - List obsolete directories.
2590075Sobrien# check-old-files     - List obsolete files.
2618334Speter# check-old-libs      - List obsolete libraries.
2790075Sobrien# delete-old          - Delete obsolete directories/files/libraries.
2818334Speter# delete-old-dirs     - Delete obsolete directories.
2918334Speter# delete-old-files    - Delete obsolete files.
3018334Speter# delete-old-libs     - Delete obsolete libraries.
3190075Sobrien# targets             - Print a list of supported TARGET/TARGET_ARCH pairs
3218334Speter#                       for world and kernel targets.
3318334Speter# toolchains          - Build a toolchain for all world and kernel targets.
3418334Speter#
3590075Sobrien# This makefile is simple by design. The FreeBSD make automatically reads
3618334Speter# the /usr/share/mk/sys.mk unless the -m argument is specified on the
3718334Speter# command line. By keeping this makefile simple, it doesn't matter too
3818334Speter# much how different the installed mk files are from those in the source
3990075Sobrien# tree. This makefile executes a child make process, forcing it to use
4018334Speter# the mk files from the source tree which are supposed to DTRT.
4190075Sobrien#
4218334Speter# Most of the user-driven targets (as listed above) are implemented in
4318334Speter# Makefile.inc1.  The exceptions are universe, tinderbox and targets.
4490075Sobrien#
4518334Speter# If you want to build your system from source be sure that /usr/obj has
4618334Speter# at least 1GB of diskspace available.  A complete 'universe' build requires
4790075Sobrien# about 15GB of space.
4818334Speter#
4918334Speter# For individuals wanting to build from the sources currently on their
5018334Speter# system, the simple instructions are:
5118334Speter#
5290075Sobrien# 1.  `cd /usr/src'  (or to the directory containing your source tree).
5318334Speter# 2.  Define `HISTORICAL_MAKE_WORLD' variable (see README).
5418334Speter# 3.  `make world'
5518334Speter#
5690075Sobrien# For individuals wanting to upgrade their sources (even if only a
5718334Speter# delta of a few days):
5818334Speter#
5918334Speter#  1.  `cd /usr/src'       (or to the directory containing your source tree).
6018334Speter#  2.  `make buildworld'
6118334Speter#  3.  `make buildkernel KERNCONF=YOUR_KERNEL_HERE'     (default is GENERIC).
6218334Speter#  4.  `make installkernel KERNCONF=YOUR_KERNEL_HERE'   (default is GENERIC).
6390075Sobrien#       [steps 3. & 4. can be combined by using the "kernel" target]
6418334Speter#  5.  `reboot'        (in single user mode: boot -s from the loader prompt).
6518334Speter#  6.  `mergemaster -p'
6618334Speter#  7.  `make installworld'
6718334Speter#  8.  `make delete-old'
6890075Sobrien#  9.  `mergemaster'                         (you may wish to use -U or -ai).
6918334Speter# 10.  `reboot'
7018334Speter# 11.  `make delete-old-libs' (in case no 3rd party program uses them anymore)
7190075Sobrien#
7218334Speter# See src/UPDATING `COMMON ITEMS' for more complete information.
7318334Speter#
7418334Speter# If TARGET=machine (e.g. ia64, sparc64, ...) is specified you can
7518334Speter# cross build world for other machine types using the buildworld target,
7690075Sobrien# and once the world is built you can cross build a kernel using the
7718334Speter# buildkernel target.
7818334Speter#
7918334Speter# Define the user-driven targets. These are listed here in alphabetical
8090075Sobrien# order, but that's not important.
8118334Speter#
8218334Speter# Targets that begin with underscore are internal targets intended for
8318334Speter# developer convenience only.  They are intentionally not documented and
8496263Sobrien# completely subject to change without notice.
8518334Speter#
8618334Speter# For more information, see the build(7) manual page.
8718334Speter#
8890075SobrienTGTS=	all all-man buildenv buildenvvars buildkernel buildworld \
8918334Speter	check-old check-old-dirs check-old-files check-old-libs \
9050397Sobrien	checkdpadd clean cleandepend cleandir \
9150397Sobrien	delete-old delete-old-dirs delete-old-files delete-old-libs \
9250397Sobrien	depend distribute distributekernel distributekernel.debug \
9390075Sobrien	distributeworld distrib-dirs distribution doxygen \
9450397Sobrien	everything hierarchy install installcheck installkernel \
9552284Sobrien	installkernel.debug packagekernel packageworld \
9652284Sobrien	reinstallkernel reinstallkernel.debug \
9790075Sobrien	installworld kernel-toolchain libraries lint maninstall \
9852284Sobrien	obj objlink regress rerelease showconfig tags toolchain update \
9918334Speter	_worldtmp _legacy _bootstrap-tools _cleanobj _obj \
10090075Sobrien	_build-tools _cross-tools _includes _libraries _depend \
10118334Speter	build32 builddtb distribute32 install32 xdev xdev-build xdev-install \
10218334Speter
10318334SpeterTGTS+=	${SUBDIR_TARGETS}
10490075Sobrien
10518334SpeterBITGTS=	files includes
10618334SpeterBITGTS:=${BITGTS} ${BITGTS:S/^/build/} ${BITGTS:S/^/install/}
10718334SpeterTGTS+=	${BITGTS}
10818334Speter
10990075Sobrien.ORDER: buildworld installworld
11018334Speter.ORDER: buildworld distributeworld
11118334Speter.ORDER: buildworld buildkernel
11218334Speter.ORDER: buildkernel installkernel
11390075Sobrien.ORDER: buildkernel installkernel.debug
11418334Speter.ORDER: buildkernel reinstallkernel
11518334Speter.ORDER: buildkernel reinstallkernel.debug
11618334Speter
11790075SobrienPATH=	/sbin:/bin:/usr/sbin:/usr/bin
11818334SpeterMAKEOBJDIRPREFIX?=	/usr/obj
11918334Speter_MAKEOBJDIRPREFIX!= /usr/bin/env -i PATH=${PATH} ${MAKE} \
12090075Sobrien    ${.MAKEFLAGS:MMAKEOBJDIRPREFIX=*} __MAKE_CONF=${__MAKE_CONF} \
12118334Speter    -f /dev/null -V MAKEOBJDIRPREFIX dummy
12290075Sobrien.if !empty(_MAKEOBJDIRPREFIX)
12390075Sobrien.error MAKEOBJDIRPREFIX can only be set in environment, not as a global\
12490075Sobrien	(in make.conf(5)) or command-line variable.
12590075Sobrien.endif
12690075SobrienMAKEPATH=	${MAKEOBJDIRPREFIX}${.CURDIR}/make.${MACHINE}
12718334SpeterBINMAKE= \
12818334Speter	`if [ -x ${MAKEPATH}/make ]; then echo ${MAKEPATH}/make; else echo ${MAKE}; fi` \
12990075Sobrien	-m ${.CURDIR}/share/mk
13018334Speter_MAKE=	PATH=${PATH} ${BINMAKE} -f Makefile.inc1 TARGET=${_TARGET} TARGET_ARCH=${_TARGET_ARCH}
13118334Speter
13218334Speter# Guess machine architecture from machine type, and vice versa.
13390075Sobrien.if !defined(TARGET_ARCH) && defined(TARGET)
13450397Sobrien_TARGET_ARCH=	${TARGET:S/pc98/i386/:S/sun4v/sparc64/:S/mips/mipsel/}
13590075Sobrien.elif !defined(TARGET) && defined(TARGET_ARCH) && \
13690075Sobrien    ${TARGET_ARCH} != ${MACHINE_ARCH}
13790075Sobrien_TARGET=		${TARGET_ARCH:C/mips.*e[lb]/mips/:C/armeb/arm/}
13890075Sobrien.endif
13990075Sobrien# Legacy names, for a transition period mips:mips -> mipsel:mips
14090075Sobrien.if defined(TARGET) && defined(TARGET_ARCH) && \
14190075Sobrien    ${TARGET_ARCH} == "mips" && ${TARGET} == "mips"
14250397Sobrien.warning "TARGET_ARCH of mips is deprecated in favor of mipsel or mipseb"
14390075Sobrien.if defined(TARGET_BIG_ENDIAN)
14490075Sobrien_TARGET_ARCH=mipseb
14590075Sobrien.else
14690075Sobrien_TARGET_ARCH=mipsel
14790075Sobrien.endif
14890075Sobrien.endif
14918334Speter# arm with TARGET_BIG_ENDIAN -> armeb
15018334Speter.if defined(TARGET_ARCH) && ${TARGET_ARCH} == "arm" && defined(TARGET_BIG_ENDIAN)
15118334Speter.warning "TARGET_ARCH of arm with TARGET_BIG_ENDIAN is deprecated.  use armeb"
15218334Speter_TARGET_ARCH=armeb
15318334Speter.endif
15490075Sobrien.if defined(TARGET) && !defined(_TARGET)
15518334Speter_TARGET=${TARGET}
15618334Speter.endif
15790075Sobrien.if defined(TARGET_ARCH) && !defined(_TARGET_ARCH)
15818334Speter_TARGET_ARCH=${TARGET_ARCH}
15952284Sobrien.endif
16090075Sobrien# Otherwise, default to current machine type and architecture.
16152284Sobrien_TARGET?=	${MACHINE}
16218334Speter_TARGET_ARCH?=	${MACHINE_ARCH}
16318334Speter
16490075Sobrien#
16518334Speter# Make sure we have an up-to-date make(1). Only world and buildworld
16690075Sobrien# should do this as those are the initial targets used for upgrades.
16790075Sobrien# The user can define ALWAYS_CHECK_MAKE to have this check performed
16818334Speter# for all targets.
16990075Sobrien#
17090075Sobrien.if defined(ALWAYS_CHECK_MAKE)
17150397Sobrien${TGTS}: upgrade_checks
17250397Sobrien.else
17390075Sobrienbuildworld: upgrade_checks
17490075Sobrien.endif
17590075Sobrien
17690075Sobrien#
17790075Sobrien# This 'cleanworld' target is not included in TGTS, because it is not a
17890075Sobrien# recursive target.  All of the work for it is done right here.   It is
17990075Sobrien# expected that BW_CANONICALOBJDIR == the CANONICALOBJDIR as would be
18090075Sobrien# created by bsd.obj.mk, except that we don't want to .include that file
18190075Sobrien# in this makefile.  
18290075Sobrien#
18390075Sobrien# In the following, the first 'rm' in a series will usually remove all
18490075Sobrien# files and directories.  If it does not, then there are probably some
18590075Sobrien# files with chflags set, so this unsets them and tries the 'rm' a
18690075Sobrien# second time.  There are situations where this target will be cleaning
18790075Sobrien# some directories via more than one method, but that duplication is
18890075Sobrien# needed to correctly handle all the possible situations.
18990075Sobrien#
19090075SobrienBW_CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
19190075Sobriencleanworld:
19290075Sobrien.if ${.CURDIR} == ${.OBJDIR} || ${.CURDIR}/obj == ${.OBJDIR}
19390075Sobrien.if exists(${BW_CANONICALOBJDIR}/)
19490075Sobrien	-rm -rf ${BW_CANONICALOBJDIR}/*
19590075Sobrien	-chflags -R 0 ${BW_CANONICALOBJDIR}
19690075Sobrien	rm -rf ${BW_CANONICALOBJDIR}/*
19790075Sobrien.endif
19890075Sobrien	#   To be safe in this case, fall back to a 'make cleandir'
19990075Sobrien	${_+_}@cd ${.CURDIR}; ${_MAKE} cleandir
20090075Sobrien.else
20190075Sobrien	-rm -rf ${.OBJDIR}/*
20290075Sobrien	-chflags -R 0 ${.OBJDIR}
20390075Sobrien	rm -rf ${.OBJDIR}/*
20490075Sobrien.endif
20590075Sobrien
20690075Sobrien#
20790075Sobrien# Handle the user-driven targets, using the source relative mk files.
20890075Sobrien#
20990075Sobrien
21090075Sobrien${TGTS}:
21190075Sobrien	${_+_}@cd ${.CURDIR}; ${_MAKE} ${.TARGET}
21290075Sobrien
21318334Speter# Set a reasonable default
21418334Speter.MAIN:	all
21518334Speter
21650397SobrienSTARTTIME!= LC_ALL=C date
21750397SobrienCHECK_TIME!= find ${.CURDIR}/sys/sys/param.h -mtime -0
21890075Sobrien.if !empty(CHECK_TIME)
21918334Speter.error check your date/time: ${STARTTIME}
22018334Speter.endif
22190075Sobrien
22218334Speter.if defined(HISTORICAL_MAKE_WORLD) || defined(DESTDIR)
22390075Sobrien#
22490075Sobrien# world
22590075Sobrien#
22650397Sobrien# Attempt to rebuild and reinstall everything. This target is not to be
22790075Sobrien# used for upgrading an existing FreeBSD system, because the kernel is
22890075Sobrien# not included. One can argue that this target doesn't build everything
22990075Sobrien# then.
23090075Sobrien#
23118334Speterworld: upgrade_checks
23250397Sobrien	@echo "--------------------------------------------------------------"
23390075Sobrien	@echo ">>> make world started on ${STARTTIME}"
23496263Sobrien	@echo "--------------------------------------------------------------"
23596263Sobrien.if target(pre-world)
23650397Sobrien	@echo
23750397Sobrien	@echo "--------------------------------------------------------------"
23850397Sobrien	@echo ">>> Making 'pre-world' target"
23990075Sobrien	@echo "--------------------------------------------------------------"
24050397Sobrien	${_+_}@cd ${.CURDIR}; ${_MAKE} pre-world
24118334Speter.endif
24218334Speter	${_+_}@cd ${.CURDIR}; ${_MAKE} buildworld
24318334Speter	${_+_}@cd ${.CURDIR}; ${_MAKE} -B installworld
24418334Speter.if target(post-world)
24518334Speter	@echo
24618334Speter	@echo "--------------------------------------------------------------"
24718334Speter	@echo ">>> Making 'post-world' target"
24890075Sobrien	@echo "--------------------------------------------------------------"
24918334Speter	${_+_}@cd ${.CURDIR}; ${_MAKE} post-world
25050397Sobrien.endif
25118334Speter	@echo
25218334Speter	@echo "--------------------------------------------------------------"
25390075Sobrien	@echo ">>> make world completed on `LC_ALL=C date`"
25418334Speter	@echo "                   (started ${STARTTIME})"
25518334Speter	@echo "--------------------------------------------------------------"
25690075Sobrien.else
25718334Speterworld:
25890075Sobrien	@echo "WARNING: make world will overwrite your existing FreeBSD"
25950397Sobrien	@echo "installation without also building and installing a new"
26018334Speter	@echo "kernel.  This can be dangerous.  Please read the handbook,"
26118334Speter	@echo "'Rebuilding world', for how to upgrade your system."
26290075Sobrien	@echo "Define DESTDIR to where you want to install FreeBSD,"
26318334Speter	@echo "including /, to override this warning and proceed as usual."
26418334Speter	@echo ""
26518334Speter	@echo "Bailing out now..."
26618334Speter	@false
26718334Speter.endif
26890075Sobrien
26918334Speter#
27018334Speter# kernel
27118334Speter#
27290075Sobrien# Short hand for `make buildkernel installkernel'
27318334Speter#
27418334Speterkernel: buildkernel installkernel
27518334Speter
27618334Speter#
27718334Speter# Perform a few tests to determine if the installed tools are adequate
27818334Speter# for building the world.
27918334Speter#
28018334Speterupgrade_checks:
28118334Speter	@if ! (cd ${.CURDIR}/tools/build/make_check && \
28218334Speter	    PATH=${PATH} ${BINMAKE} obj >/dev/null 2>&1 && \
28390075Sobrien	    PATH=${PATH} ${BINMAKE} >/dev/null 2>&1); \
28418334Speter	then \
28518334Speter	    (cd ${.CURDIR} && ${MAKE} make); \
28618334Speter	fi
28718334Speter
28890075Sobrien#
28950397Sobrien# Upgrade make(1) to the current version using the installed
29018334Speter# headers, libraries and tools.  Also, allow the location of
29190075Sobrien# the system bsdmake-like utility to be overridden.
29290075Sobrien#
29390075SobrienMMAKEENV=	MAKEOBJDIRPREFIX=${MAKEPATH} \
29490075Sobrien		DESTDIR= \
29590075Sobrien		INSTALL="sh ${.CURDIR}/tools/install.sh"
29690075SobrienMMAKE=		${MMAKEENV} ${MAKE} \
29790075Sobrien		-D_UPGRADING \
29890075Sobrien		-DNOMAN -DNO_MAN -DNOSHARED -DNO_SHARED \
29990075Sobrien		-DNO_CPU_CFLAGS -DNO_WERROR
30090075Sobrien
30118334Spetermake: .PHONY
30218334Speter	@echo
30390075Sobrien	@echo "--------------------------------------------------------------"
30418334Speter	@echo ">>> Building an up-to-date make(1)"
30518334Speter	@echo "--------------------------------------------------------------"
30618334Speter	${_+_}@cd ${.CURDIR}/usr.bin/make; \
30790075Sobrien		${MMAKE} obj && \
30818334Speter		${MMAKE} depend && \
30918334Speter		${MMAKE} all && \
31090075Sobrien		${MMAKE} install DESTDIR=${MAKEPATH} BINDIR=
31190075Sobrien
31218334Spetertinderbox:
31318334Speter	@cd ${.CURDIR} && ${MAKE} DOING_TINDERBOX=YES universe
31418334Speter
31518334Spetertoolchains:
31618334Speter	@cd ${.CURDIR} && ${MAKE} UNIVERSE_TARGET=toolchain universe
31718334Speter
31890075Sobrien#
31918334Speter# universe
32090075Sobrien#
32190075Sobrien# Attempt to rebuild *everything* for all supported architectures,
32290075Sobrien# with a reasonable chance of success, regardless of how old your
32390075Sobrien# existing system is.
32490075Sobrien#
32590075Sobrien.if make(universe) || make(universe_kernels) || make(tinderbox) || make(targets)
32690075SobrienTARGETS?=amd64 arm i386 ia64 mips pc98 powerpc sparc64 sun4v
32790075SobrienTARGET_ARCHES_arm?=	arm armeb
32890075SobrienTARGET_ARCHES_mips?=	mipsel mipseb mips64el mips64eb
32918334SpeterTARGET_ARCHES_powerpc?=	powerpc powerpc64
33090075SobrienTARGET_ARCHES_pc98?=	i386
33190075SobrienTARGET_ARCHES_sun4v?=	sparc64
33290075Sobrien.for target in ${TARGETS}
33318334SpeterTARGET_ARCHES_${target}?= ${target}
33490075Sobrien.endfor
33590075Sobrien
33618334Speter.if defined(UNIVERSE_TARGET)
33790075SobrienMAKE_JUST_WORLDS=	YES
33890075Sobrien.else
33990075SobrienUNIVERSE_TARGET?=	buildworld
34090075Sobrien.endif
34190075SobrienKERNSRCDIR?=		${.CURDIR}/sys
34290075Sobrien
34390075Sobrientargets:
34490075Sobrien	@echo "Supported TARGET/TARGET_ARCH pairs for world and kernel targets"
34590075Sobrien.for target in ${TARGETS}
34690075Sobrien.for target_arch in ${TARGET_ARCHES_${target}}
34790075Sobrien	@echo "    ${target}/${target_arch}"
34890075Sobrien.endfor
34990075Sobrien.endfor
35018334Speter
35190075Sobrien.if defined(DOING_TINDERBOX)
35290075SobrienFAILFILE=${.CURDIR}/_.tinderbox.failed
35390075SobrienMAKEFAIL=tee -a ${FAILFILE}
35418334Speter.else
35518334SpeterMAKEFAIL=cat
35618334Speter.endif
35718334Speter
35818334Speteruniverse: universe_prologue
35918334Speteruniverse_prologue:
36090075Sobrien	@echo "--------------------------------------------------------------"
36118334Speter	@echo ">>> make universe started on ${STARTTIME}"
36218334Speter	@echo "--------------------------------------------------------------"
36390075Sobrien.if defined(DOING_TINDERBOX)
36418334Speter	@rm -f ${FAILFILE}
36518334Speter.endif
36618334Speter.for target in ${TARGETS}
36790075Sobrienuniverse: universe_${target}
36818334Speter.ORDER: universe_prologue universe_${target} universe_epilogue
36918334Speteruniverse_${target}: universe_${target}_prologue
37090075Sobrienuniverse_${target}_prologue:
37118334Speter	@echo ">> ${target} started on `LC_ALL=C date`"
37290075Sobrien.if !defined(MAKE_JUST_KERNELS)
37390075Sobrien.for target_arch in ${TARGET_ARCHES_${target}}
37490075Sobrienuniverse_${target}: universe_${target}_${target_arch}
37590075Sobrienuniverse_${target}_${target_arch}: universe_${target}_prologue
37618334Speter	@echo ">> ${target}.${target_arch} ${UNIVERSE_TARGET} started on `LC_ALL=C date`"
37718334Speter	@(cd ${.CURDIR} && env __MAKE_CONF=/dev/null \
37890075Sobrien	    ${MAKE} ${JFLAG} ${UNIVERSE_TARGET} \
37918334Speter	    TARGET=${target} \
38090075Sobrien	    TARGET_ARCH=${target_arch} \
38190075Sobrien	    > _.${target}.${target_arch}.${UNIVERSE_TARGET} 2>&1 || \
38290075Sobrien	    (echo "${target}.${target_arch} ${UNIVERSE_TARGET} failed," \
38390075Sobrien	    "check _.${target}.${target_arch}.${UNIVERSE_TARGET} for details" | \
38490075Sobrien	    ${MAKEFAIL}))
38590075Sobrien	@echo ">> ${target}.${target_arch} ${UNIVERSE_TARGET} completed on `LC_ALL=C date`"
38690075Sobrien.endfor
38790075Sobrien.endif
38890075Sobrien.if !defined(MAKE_JUST_WORLDS)
38990075Sobrien.if exists(${KERNSRCDIR}/${target}/conf/NOTES)
39090075Sobrien	@(cd ${KERNSRCDIR}/${target}/conf && env __MAKE_CONF=/dev/null \
39118334Speter	    ${MAKE} LINT > ${.CURDIR}/_.${target}.makeLINT 2>&1 || \
39218334Speter	    (echo "${target} 'make LINT' failed," \
39318334Speter	    "check _.${target}.makeLINT for details"| ${MAKEFAIL}))
39418334Speter.endif
39518334Speter	@cd ${.CURDIR} && ${MAKE} ${.MAKEFLAGS} TARGET=${target} \
39690075Sobrien	    universe_kernels
39790075Sobrien.endif
39890075Sobrien	@echo ">> ${target} completed on `LC_ALL=C date`"
39990075Sobrien.endfor
40090075Sobrienuniverse_kernels: universe_kernconfs
40118334Speter.if !defined(TARGET)
40218334SpeterTARGET!=	uname -m
40318334Speter.endif
40418334SpeterKERNCONFS!=	cd ${KERNSRCDIR}/${TARGET}/conf && \
40518334Speter		find [A-Z0-9]*[A-Z0-9] -type f -maxdepth 0 \
40618334Speter		! -name DEFAULTS ! -name NOTES
40718334Speteruniverse_kernconfs:
40818334Speter.for kernel in ${KERNCONFS}
40918334SpeterTARGET_ARCH_${kernel}!=	cd ${KERNSRCDIR}/${TARGET}/conf && \
41018334Speter	config -m ${KERNSRCDIR}/${TARGET}/conf/${kernel} 2> /dev/null | \
41118334Speter	grep -v WARNING: | cut -f 2
41218334Speter.if empty(TARGET_ARCH_${kernel})
41390075Sobrien.error "Target architecture for ${TARGET}/conf/${kernel} unknown.  config(8) likely too old."
41490075Sobrien.endif
41518334Speteruniverse_kernconfs: universe_kernconf_${TARGET}_${kernel}
41690075Sobrienuniverse_kernconf_${TARGET}_${kernel}:
41790075Sobrien	@(cd ${.CURDIR} && env __MAKE_CONF=/dev/null \
41890075Sobrien	    ${MAKE} ${JFLAG} buildkernel \
41918334Speter	    TARGET=${TARGET} \
42090075Sobrien	    TARGET_ARCH=${TARGET_ARCH_${kernel}} \
42118334Speter	    KERNCONF=${kernel} \
42290075Sobrien	    > _.${TARGET}.${kernel} 2>&1 || \
42390075Sobrien	    (echo "${TARGET} ${kernel} kernel failed," \
42490075Sobrien	    "check _.${TARGET}.${kernel} for details"| ${MAKEFAIL}))
42518334Speter.endfor
42690075Sobrienuniverse: universe_epilogue
42790075Sobrienuniverse_epilogue:
42818334Speter	@echo "--------------------------------------------------------------"
42990075Sobrien	@echo ">>> make universe completed on `LC_ALL=C date`"
43090075Sobrien	@echo "                      (started ${STARTTIME})"
43118334Speter	@echo "--------------------------------------------------------------"
43252284Sobrien.if defined(DOING_TINDERBOX)
43352284Sobrien	@if [ -e ${FAILFILE} ] ; then \
43452284Sobrien		echo "Tinderbox failed:" ;\
43590075Sobrien		cat ${FAILFILE} ;\
43652284Sobrien		exit 1 ;\
43752284Sobrien	fi
43852284Sobrien.endif
43990075Sobrien.endif
44090075Sobrien