Makefile revision 217735
197403Sobrien#
297403Sobrien# $FreeBSD: head/Makefile 217735 2011-01-22 23:16:44Z bz $
3169691Skan#
4169691Skan# The user-driven targets are:
597403Sobrien#
697403Sobrien# universe            - *Really* build *everything* (buildworld and
797403Sobrien#                       all kernels on all architectures).
897403Sobrien# tinderbox           - Same as universe, but presents a list of failed build
997403Sobrien#                       targets and exits with an error if there were any.
1097403Sobrien# buildworld          - Rebuild *everything*, including glue to help do
1197403Sobrien#                       upgrades.
1297403Sobrien# installworld        - Install everything built by "buildworld".
1397403Sobrien# world               - buildworld + installworld, no kernel.
1497403Sobrien# buildkernel         - Rebuild the kernel and the kernel-modules.
1597403Sobrien# installkernel       - Install the kernel and the kernel-modules.
1697403Sobrien# installkernel.debug
1797403Sobrien# reinstallkernel     - Reinstall the kernel and the kernel-modules.
1897403Sobrien# reinstallkernel.debug
19169691Skan# kernel              - buildkernel + installkernel.
2097403Sobrien# kernel-toolchain    - Builds the subset of world necessary to build a kernel
2197403Sobrien# doxygen             - Build API documentation of the kernel, needs doxygen.
2297403Sobrien# update              - Convenient way to update your source tree (cvs).
2397403Sobrien# check-old           - List obsolete directories/files/libraries.
2497403Sobrien# check-old-dirs      - List obsolete directories.
2597403Sobrien# check-old-files     - List obsolete files.
2697403Sobrien# check-old-libs      - List obsolete libraries.
2797403Sobrien# delete-old          - Delete obsolete directories/files/libraries.
2897403Sobrien# delete-old-dirs     - Delete obsolete directories.
2997403Sobrien# delete-old-files    - Delete obsolete files.
3097403Sobrien# delete-old-libs     - Delete obsolete libraries.
3197403Sobrien# targets             - Print a list of supported TARGET/TARGET_ARCH pairs.
3297403Sobrien#
3397403Sobrien# This makefile is simple by design. The FreeBSD make automatically reads
3497403Sobrien# the /usr/share/mk/sys.mk unless the -m argument is specified on the
3597403Sobrien# command line. By keeping this makefile simple, it doesn't matter too
3697403Sobrien# much how different the installed mk files are from those in the source
3797403Sobrien# tree. This makefile executes a child make process, forcing it to use
3897403Sobrien# the mk files from the source tree which are supposed to DTRT.
3997403Sobrien#
4097403Sobrien# Most of the user-driven targets (as listed above) are implemented in
4197403Sobrien# Makefile.inc1.  The exceptions are universe, tinderbox and targets.
4297403Sobrien#
4397403Sobrien# If you want to build your system from source be sure that /usr/obj has
4497403Sobrien# at least 1GB of diskspace available.  A complete 'universe' build requires
4597403Sobrien# about 15GB of space.
4697403Sobrien#
4797403Sobrien# For individuals wanting to build from the sources currently on their
4897403Sobrien# system, the simple instructions are:
49132720Skan#
50132720Skan# 1.  `cd /usr/src'  (or to the directory containing your source tree).
5197403Sobrien# 2.  Define `HISTORICAL_MAKE_WORLD' variable (see README).
5297403Sobrien# 3.  `make world'
5397403Sobrien#
5497403Sobrien# For individuals wanting to upgrade their sources (even if only a
5597403Sobrien# delta of a few days):
5697403Sobrien#
57169691Skan#  1.  `cd /usr/src'       (or to the directory containing your source tree).
58169691Skan#  2.  `make buildworld'
59132720Skan#  3.  `make buildkernel KERNCONF=YOUR_KERNEL_HERE'     (default is GENERIC).
60132720Skan#  4.  `make installkernel KERNCONF=YOUR_KERNEL_HERE'   (default is GENERIC).
61132720Skan#       [steps 3. & 4. can be combined by using the "kernel" target]
62132720Skan#  5.  `reboot'        (in single user mode: boot -s from the loader prompt).
63132720Skan#  6.  `mergemaster -p'
64132720Skan#  7.  `make installworld'
6597403Sobrien#  8.  `make delete-old'
66169691Skan#  9.  `mergemaster'                         (you may wish to use -U or -ai).
67169691Skan# 10.  `reboot'
68169691Skan# 11.  `make delete-old-libs' (in case no 3rd party program uses them anymore)
69169691Skan#
70169691Skan# See src/UPDATING `COMMON ITEMS' for more complete information.
71169691Skan#
72169691Skan# If TARGET=machine (e.g. ia64, sparc64, ...) is specified you can
73169691Skan# cross build world for other machine types using the buildworld target,
74169691Skan# and once the world is built you can cross build a kernel using the
75169691Skan# buildkernel target.
76169691Skan#
77169691Skan# Define the user-driven targets. These are listed here in alphabetical
7897403Sobrien# order, but that's not important.
79169691Skan#
80169691Skan# Targets that begin with underscore are internal targets intended for
81169691Skan# developer convenience only.  They are intentionally not documented and
82169691Skan# completely subject to change without notice.
83169691Skan#
84169691Skan# For more information, see the build(7) manual page.
85169691Skan#
86169691SkanTGTS=	all all-man buildenv buildenvvars buildkernel buildworld \
87169691Skan	check-old check-old-dirs check-old-files check-old-libs \
88169691Skan	checkdpadd clean cleandepend cleandir \
89169691Skan	delete-old delete-old-dirs delete-old-files delete-old-libs \
90169691Skan	depend distribute distributeworld distrib-dirs distribution doxygen \
91169691Skan	everything hierarchy install installcheck installkernel \
92169691Skan	installkernel.debug reinstallkernel reinstallkernel.debug \
93169691Skan	installworld kernel-toolchain libraries lint maninstall \
94169691Skan	obj objlink regress rerelease showconfig tags toolchain update \
95169691Skan	_worldtmp _legacy _bootstrap-tools _cleanobj _obj \
96169691Skan	_build-tools _cross-tools _includes _libraries _depend \
97169691Skan	build32 builddtb distribute32 install32 xdev xdev-build xdev-install \
98169691Skan
99169691SkanTGTS+=	${SUBDIR_TARGETS}
100169691Skan
101169691SkanBITGTS=	files includes
102169691SkanBITGTS:=${BITGTS} ${BITGTS:S/^/build/} ${BITGTS:S/^/install/}
103169691SkanTGTS+=	${BITGTS}
104169691Skan
105169691Skan.ORDER: buildworld installworld
106169691Skan.ORDER: buildworld distributeworld
107169691Skan.ORDER: buildworld buildkernel
10897403Sobrien.ORDER: buildkernel installkernel
10997403Sobrien.ORDER: buildkernel installkernel.debug
110169691Skan.ORDER: buildkernel reinstallkernel
11197403Sobrien.ORDER: buildkernel reinstallkernel.debug
11297403Sobrien
113169691SkanPATH=	/sbin:/bin:/usr/sbin:/usr/bin
114169691SkanMAKEOBJDIRPREFIX?=	/usr/obj
115169691Skan_MAKEOBJDIRPREFIX!= /usr/bin/env -i PATH=${PATH} ${MAKE} \
116169691Skan    ${.MAKEFLAGS:MMAKEOBJDIRPREFIX=*} __MAKE_CONF=${__MAKE_CONF} \
117169691Skan    -f /dev/null -V MAKEOBJDIRPREFIX dummy
118169691Skan.if !empty(_MAKEOBJDIRPREFIX)
119169691Skan.error MAKEOBJDIRPREFIX can only be set in environment, not as a global\
120169691Skan	(in make.conf(5)) or command-line variable.
121169691Skan.endif
122169691SkanMAKEPATH=	${MAKEOBJDIRPREFIX}${.CURDIR}/make.${MACHINE}
123169691SkanBINMAKE= \
124169691Skan	`if [ -x ${MAKEPATH}/make ]; then echo ${MAKEPATH}/make; else echo ${MAKE}; fi` \
125169691Skan	-m ${.CURDIR}/share/mk
12697403Sobrien_MAKE=	PATH=${PATH} ${BINMAKE} -f Makefile.inc1
127169691Skan
128169691Skan#
129169691Skan# Make sure we have an up-to-date make(1). Only world and buildworld
130169691Skan# should do this as those are the initial targets used for upgrades.
131169691Skan# The user can define ALWAYS_CHECK_MAKE to have this check performed
132169691Skan# for all targets.
133169691Skan#
134169691Skan.if defined(ALWAYS_CHECK_MAKE)
135169691Skan${TGTS}: upgrade_checks
136169691Skan.else
137169691Skanbuildworld: upgrade_checks
138169691Skan.endif
139169691Skan
140169691Skan#
141169691Skan# This 'cleanworld' target is not included in TGTS, because it is not a
142169691Skan# recursive target.  All of the work for it is done right here.   It is
143169691Skan# expected that BW_CANONICALOBJDIR == the CANONICALOBJDIR as would be
144169691Skan# created by bsd.obj.mk, except that we don't want to .include that file
145169691Skan# in this makefile.  
146169691Skan#
147169691Skan# In the following, the first 'rm' in a series will usually remove all
148169691Skan# files and directories.  If it does not, then there are probably some
14997403Sobrien# files with chflags set, so this unsets them and tries the 'rm' a
150169691Skan# second time.  There are situations where this target will be cleaning
151169691Skan# some directories via more than one method, but that duplication is
152169691Skan# needed to correctly handle all the possible situations.
153169691Skan#
154169691SkanBW_CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
155169691Skancleanworld:
156169691Skan.if ${.CURDIR} == ${.OBJDIR} || ${.CURDIR}/obj == ${.OBJDIR}
157169691Skan.if exists(${BW_CANONICALOBJDIR}/)
158169691Skan	-rm -rf ${BW_CANONICALOBJDIR}/*
15997403Sobrien	-chflags -R 0 ${BW_CANONICALOBJDIR}
16097403Sobrien	rm -rf ${BW_CANONICALOBJDIR}/*
161132720Skan.endif
16297403Sobrien	#   To be safe in this case, fall back to a 'make cleandir'
163169691Skan	${_+_}@cd ${.CURDIR}; ${_MAKE} cleandir
164169691Skan.else
16597403Sobrien	-rm -rf ${.OBJDIR}/*
16697403Sobrien	-chflags -R 0 ${.OBJDIR}
16797403Sobrien	rm -rf ${.OBJDIR}/*
168169691Skan.endif
169169691Skan
170169691Skan#
171169691Skan# Handle the user-driven targets, using the source relative mk files.
172169691Skan#
17397403Sobrien
17497403Sobrien${TGTS}:
175169691Skan	${_+_}@cd ${.CURDIR}; \
176169691Skan		${_MAKE} ${.TARGET}
17797403Sobrien
17897403Sobrien# Set a reasonable default
179169691Skan.MAIN:	all
18097403Sobrien
18197403SobrienSTARTTIME!= LC_ALL=C date
182169691SkanCHECK_TIME!= find ${.CURDIR}/sys/sys/param.h -mtime -0
183169691Skan.if !empty(CHECK_TIME)
18497403Sobrien.error check your date/time: ${STARTTIME}
18597403Sobrien.endif
18697403Sobrien
18797403Sobrien.if defined(HISTORICAL_MAKE_WORLD) || defined(DESTDIR)
188169691Skan#
18997403Sobrien# world
190169691Skan#
191169691Skan# Attempt to rebuild and reinstall everything. This target is not to be
192169691Skan# used for upgrading an existing FreeBSD system, because the kernel is
193169691Skan# not included. One can argue that this target doesn't build everything
194169691Skan# then.
195169691Skan#
196169691Skanworld: upgrade_checks
197169691Skan	@echo "--------------------------------------------------------------"
198169691Skan	@echo ">>> make world started on ${STARTTIME}"
199169691Skan	@echo "--------------------------------------------------------------"
200169691Skan.if target(pre-world)
201169691Skan	@echo
202169691Skan	@echo "--------------------------------------------------------------"
20397403Sobrien	@echo ">>> Making 'pre-world' target"
204169691Skan	@echo "--------------------------------------------------------------"
205169691Skan	${_+_}@cd ${.CURDIR}; ${_MAKE} pre-world
206169691Skan.endif
207169691Skan	${_+_}@cd ${.CURDIR}; ${_MAKE} buildworld
208169691Skan	${_+_}@cd ${.CURDIR}; ${_MAKE} -B installworld
209169691Skan.if target(post-world)
210169691Skan	@echo
211169691Skan	@echo "--------------------------------------------------------------"
212169691Skan	@echo ">>> Making 'post-world' target"
213169691Skan	@echo "--------------------------------------------------------------"
214169691Skan	${_+_}@cd ${.CURDIR}; ${_MAKE} post-world
215169691Skan.endif
216169691Skan	@echo
217169691Skan	@echo "--------------------------------------------------------------"
218169691Skan	@echo ">>> make world completed on `LC_ALL=C date`"
219169691Skan	@echo "                   (started ${STARTTIME})"
220169691Skan	@echo "--------------------------------------------------------------"
221169691Skan.else
222169691Skanworld:
223169691Skan	@echo "WARNING: make world will overwrite your existing FreeBSD"
224169691Skan	@echo "installation without also building and installing a new"
225169691Skan	@echo "kernel.  This can be dangerous.  Please read the handbook,"
226169691Skan	@echo "'Rebuilding world', for how to upgrade your system."
227169691Skan	@echo "Define DESTDIR to where you want to install FreeBSD,"
228169691Skan	@echo "including /, to override this warning and proceed as usual."
229169691Skan	@echo ""
230169691Skan	@echo "Bailing out now..."
231169691Skan	@false
232169691Skan.endif
233169691Skan
234169691Skan#
235169691Skan# kernel
236169691Skan#
237169691Skan# Short hand for `make buildkernel installkernel'
238169691Skan#
239169691Skankernel: buildkernel installkernel
240169691Skan
241169691Skan#
242169691Skan# Perform a few tests to determine if the installed tools are adequate
243169691Skan# for building the world.
24497403Sobrien#
245169691Skanupgrade_checks:
24697403Sobrien	@if ! (cd ${.CURDIR}/tools/build/make_check && \
247169691Skan	    PATH=${PATH} ${BINMAKE} obj >/dev/null 2>&1 && \
248169691Skan	    PATH=${PATH} ${BINMAKE} >/dev/null 2>&1); \
249169691Skan	then \
250169691Skan	    (cd ${.CURDIR} && ${MAKE} make); \
251169691Skan	fi
25297403Sobrien
253169691Skan#
254169691Skan# Upgrade make(1) to the current version using the installed
255169691Skan# headers, libraries and tools.  Also, allow the location of
256169691Skan# the system bsdmake-like utility to be overridden.
25797403Sobrien#
25897403SobrienMMAKEENV=	MAKEOBJDIRPREFIX=${MAKEPATH} \
259169691Skan		DESTDIR= \
260169691Skan		INSTALL="sh ${.CURDIR}/tools/install.sh"
261169691SkanMMAKE=		${MMAKEENV} ${MAKE} \
262169691Skan		-D_UPGRADING \
263169691Skan		-DNOMAN -DNO_MAN -DNOSHARED -DNO_SHARED \
264169691Skan		-DNO_CPU_CFLAGS -DNO_WERROR
265169691Skan
266169691Skanmake: .PHONY
267169691Skan	@echo
268169691Skan	@echo "--------------------------------------------------------------"
269169691Skan	@echo ">>> Building an up-to-date make(1)"
270169691Skan	@echo "--------------------------------------------------------------"
271169691Skan	${_+_}@cd ${.CURDIR}/usr.bin/make; \
272169691Skan		${MMAKE} obj && \
273169691Skan		${MMAKE} depend && \
274169691Skan		${MMAKE} all && \
275169691Skan		${MMAKE} install DESTDIR=${MAKEPATH} BINDIR=
276169691Skan
277169691Skantinderbox:
27897403Sobrien	cd ${.CURDIR} && \
27997403Sobrien		DOING_TINDERBOX=YES ${MAKE} JFLAG=${JFLAG} universe
280169691Skan
281169691Skan#
282169691Skan# universe
283169691Skan#
284169691Skan# Attempt to rebuild *everything* for all supported architectures,
285169691Skan# with a reasonable chance of success, regardless of how old your
286169691Skan# existing system is.
287169691Skan#
288169691Skan.if make(universe) || make(universe_kernels) || make(tinderbox) || make(targets)
289169691SkanTARGETS?=amd64 arm i386 ia64 mips pc98 powerpc sparc64 sun4v
290169691SkanTARGET_ARCHES_arm?=	arm armeb
291169691SkanTARGET_ARCHES_mips?=	mipsel mipseb mips64el mips64eb
292169691SkanTARGET_ARCHES_powerpc?=	powerpc powerpc64
293169691SkanTARGET_ARCHES_pc98?=	i386
29497403SobrienTARGET_ARCHES_sun4v?=	sparc64
29597403Sobrien.for target in ${TARGETS}
296169691SkanTARGET_ARCHES_${target}?= ${target}
297169691Skan.endfor
298169691Skan
299169691Skantargets:
300169691Skan	@echo "Supported TARGETS/TARGET_ARCH pairs"
301169691Skan.for target in ${TARGETS}
302169691Skan.for target_arch in ${TARGET_ARCHES_${target}}
303169691Skan	@echo "    ${target}/${target_arch}"
304169691Skan.endfor
305169691Skan.endfor
306169691Skan
307169691Skan.if defined(DOING_TINDERBOX)
308169691SkanFAILFILE=${.CURDIR}/_.tinderbox.failed
30997403SobrienMAKEFAIL=tee -a ${FAILFILE}
31097403Sobrien.else
311169691SkanMAKEFAIL=cat
312169691Skan.endif
313169691Skan
314169691Skanuniverse: universe_prologue
315169691Skanuniverse_prologue:
316169691Skan	@echo "--------------------------------------------------------------"
31797403Sobrien	@echo ">>> make universe started on ${STARTTIME}"
318169691Skan	@echo "--------------------------------------------------------------"
319169691Skan.if defined(DOING_TINDERBOX)
320169691Skan	rm -f ${FAILFILE}
321169691Skan.endif
322169691Skan.for target in ${TARGETS}
323169691Skanuniverse: universe_${target}
324169691Skan.ORDER: universe_prologue universe_${target} universe_epilogue
32597403Sobrienuniverse_${target}: universe_${target}_prologue
326169691Skanuniverse_${target}_prologue:
327169691Skan	@echo ">> ${target} started on `LC_ALL=C date`"
328169691Skan.if !defined(MAKE_JUST_KERNELS)
329169691Skan.for target_arch in ${TARGET_ARCHES_${target}}
330169691Skanuniverse_${target}: universe_${target}_${target_arch}
331169691Skanuniverse_${target}_${target_arch}: universe_${target}_prologue
332169691Skan	@echo ">> ${target}.${target_arch} buildworld started on `LC_ALL=C date`"
333169691Skan	@(cd ${.CURDIR} && env __MAKE_CONF=/dev/null \
334169691Skan	    ${MAKE} ${JFLAG} buildworld \
335169691Skan	    TARGET=${target} \
336169691Skan	    TARGET_ARCH=${target_arch} \
33797403Sobrien	    > _.${target}.${target_arch}.buildworld 2>&1 || \
33897403Sobrien	    (echo "${target}.${target_arch} world failed," \
33997403Sobrien	    "check _.${target}.${target_arch}.buildworld for details" | \
34097403Sobrien	    ${MAKEFAIL}))
341169691Skan	@echo ">> ${target}.${target_arch} buildworld completed on `LC_ALL=C date`"
342169691Skan.endfor
343169691Skan.endif
344169691Skan.if !defined(MAKE_JUST_WORLDS)
345169691Skan.if exists(${.CURDIR}/sys/${target}/conf/NOTES)
346169691Skan	@(cd ${.CURDIR}/sys/${target}/conf && env __MAKE_CONF=/dev/null \
347169691Skan	    ${MAKE} LINT > ${.CURDIR}/_.${target}.makeLINT 2>&1 || \
348169691Skan	    (echo "${target} 'make LINT' failed," \
349169691Skan	    "check _.${target}.makeLINT for details"| ${MAKEFAIL}))
350169691Skan.endif
351169691Skan	@cd ${.CURDIR} && ${MAKE} ${.MAKEFLAGS} TARGET=${target} \
352169691Skan	    universe_kernels
35397403Sobrien.endif
35497403Sobrien	@echo ">> ${target} completed on `LC_ALL=C date`"
355169691Skan.endfor
356169691Skanuniverse_kernels: universe_kernconfs
357169691Skan.if !defined(TARGET)
358169691SkanTARGET!=	uname -m
359169691Skan.endif
360169691SkanKERNCONFS!=	cd ${.CURDIR}/sys/${TARGET}/conf && \
361169691Skan		find [A-Z0-9]*[A-Z0-9] -type f -maxdepth 0 \
362169691Skan		! -name DEFAULTS ! -name NOTES
363169691Skanuniverse_kernconfs:
364169691Skan.for kernel in ${KERNCONFS}
365169691SkanTARGET_ARCH_${kernel}!=	cd ${.CURDIR}/sys/${TARGET}/conf && \
36697403Sobrien	config -m ${.CURDIR}/sys/${TARGET}/conf/${kernel} 2> /dev/null | \
36797403Sobrien	grep -v WARNING: | cut -f 2
368169691Skan.if empty(TARGET_ARCH_${kernel})
369169691Skan.error "Target architecture for ${TARGET}/conf/${kernel} unknown.  config(8) likely too old."
370169691Skan.endif
371169691Skanuniverse_kernconfs: universe_kernconf_${TARGET}_${kernel}
372169691Skanuniverse_kernconf_${TARGET}_${kernel}:
373169691Skan	@(cd ${.CURDIR} && env __MAKE_CONF=/dev/null \
374169691Skan	    ${MAKE} ${JFLAG} buildkernel \
375169691Skan	    TARGET=${TARGET} \
376169691Skan	    TARGET_ARCH=${TARGET_ARCH_${kernel}} \
377169691Skan	    KERNCONF=${kernel} \
378169691Skan	    > _.${TARGET}.${kernel} 2>&1 || \
379169691Skan	    (echo "${TARGET} ${kernel} kernel failed," \
380169691Skan	    "check _.${TARGET}.${kernel} for details"| ${MAKEFAIL}))
381169691Skan.endfor
382169691Skanuniverse: universe_epilogue
383169691Skanuniverse_epilogue:
384169691Skan	@echo "--------------------------------------------------------------"
385211755Srpaulo	@echo ">>> make universe completed on `LC_ALL=C date`"
386169691Skan	@echo "                      (started ${STARTTIME})"
387169691Skan	@echo "--------------------------------------------------------------"
388169691Skan.if defined(DOING_TINDERBOX)
389169691Skan	@if [ -e ${FAILFILE} ] ; then \
390169691Skan		echo "Tinderbox failed:" ;\
391169691Skan		cat ${FAILFILE} ;\
392169691Skan		exit 1 ;\
393211755Srpaulo	fi
394169691Skan.endif
395169691Skan.endif
396169691Skan