Makefile revision 1.278
1#	$NetBSD: Makefile,v 1.278 2010/07/06 05:59:50 mrg Exp $
2
3#
4# This is the top-level makefile for building NetBSD. For an outline of
5# how to build a snapshot or release, as well as other release engineering
6# information, see http://www.NetBSD.org/developers/releng/index.html
7#
8# Not everything you can set or do is documented in this makefile. In
9# particular, you should review the files in /usr/share/mk (especially
10# bsd.README) for general information on building programs and writing
11# Makefiles within this structure, and see the comments in src/etc/Makefile
12# for further information on installation and release set options.
13#
14# Variables listed below can be set on the make command line (highest
15# priority), in /etc/mk.conf (middle priority), or in the environment
16# (lowest priority).
17#
18# Variables:
19#   DESTDIR is the target directory for installation of the compiled
20#	software. It defaults to /. Note that programs are built against
21#	libraries installed in DESTDIR.
22#   MKMAN, if `no', will prevent building of manual pages.
23#   MKOBJDIRS, if not `no', will build object directories at
24#	an appropriate point in a build.
25#   MKSHARE, if `no', will prevent building and installing
26#	anything in /usr/share.
27#   MKUPDATE, if not `no', will avoid a `make cleandir' at the start of
28#	`make build', as well as having the effects listed in
29#	/usr/share/mk/bsd.README.
30#   NOCLEANDIR, if defined, will avoid a `make cleandir' at the start
31#	of the `make build'.
32#   NOINCLUDES will avoid the `make includes' usually done by `make build'.
33#
34#   See mk.conf(5) for more details.
35#
36#
37# Targets:
38#   build:
39#	Builds a full release of NetBSD in DESTDIR, except for the
40#	/etc configuration files.
41#	If BUILD_DONE is set, this is an empty target.
42#   distribution:
43#	Builds a full release of NetBSD in DESTDIR, including the /etc
44#	configuration files.
45#   buildworld:
46#	As per `make distribution', except that it ensures that DESTDIR
47#	is not the root directory.
48#   installworld:
49#	Install the distribution from DESTDIR to INSTALLWORLDDIR (which
50#	defaults to the root directory).  Ensures that INSTALLWORLDDIR
51#	is the not root directory if cross compiling.
52#   release:
53#	Does a `make distribution', and then tars up the DESTDIR files
54#	into ${RELEASEDIR}/${RELEASEMACHINEDIR}, in release(7) format.
55#	(See etc/Makefile for more information on this.)
56#   regression-tests:
57#	Runs the regression tests in "regress" on this host.
58#   sets:
59#	Populate ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets
60#	from ${DESTDIR}
61#   sourcesets:
62#	Populate ${RELEASEDIR}/source/sets from ${NETBSDSRCDIR}
63#   syspkgs:
64#	Populate ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/syspkgs
65#	from ${DESTDIR}
66#   iso-image:
67#	Create CD-ROM image in RELEASEDIR/iso.
68#	RELEASEDIR must already have been populated by `make release'
69#	or equivalent.
70#   iso-image-source:
71#	Create CD-ROM image with source in RELEASEDIR/iso.
72#	RELEASEDIR must already have been populated by
73#	`make release sourcesets' or equivalent.
74#
75# Targets invoked by `make build,' in order:
76#   cleandir:        cleans the tree.
77#   do-top-obj:      creates the top level object directory.
78#   do-tools-obj:    creates object directories for the host toolchain.
79#   do-tools:        builds host toolchain.
80#   obj:             creates object directories.
81#   do-distrib-dirs: creates the distribution directories.
82#   includes:        installs include files.
83#   do-tools-compat: builds the "libnbcompat" library; needed for some
84#                    random host tool programs in the source tree.
85#   do-lib-csu:      builds and installs prerequisites from lib/csu.
86#   do-libgcc:       builds and installs prerequisites from
87#                    gnu/lib/crtstuff${LIBGCC_EXT} (if necessary) and
88#                    gnu/lib/libgcc${LIBGCC_EXT}.
89#   do-libpcc:       builds and install prerequisites from
90#                    external/bsd/pcc/crtstuff and external/bsd/pcc/libpcc.
91#   do-lib-libc:     builds and installs prerequisites from lib/libc.
92#   do-lib:          builds and installs prerequisites from lib.
93#   do-gnu-lib:      builds and installs prerequisites from gnu/lib.
94#   do-external-lib: builds and installs prerequisites from external/lib.
95#   do-sys-rump-dev-lib: builds and installs prerequisites from sys/rump/dev/lib
96#   do-sys-rump-fs-lib:  builds and installs prerequisites from sys/rump/fs/lib
97#   do-sys-rump-kern-lib:  builds and installs prereq. from sys/rump/kern/lib
98#   do-sys-rump-net-lib: builds and installs prerequisites from sys/rump/net/lib
99#   do-sys-modules:  builds and installs kernel modules (used by rump binaries)
100#   do-ld.so:        builds and installs prerequisites from libexec/ld.*_so.
101#   do-compat-lib-csu: builds and installs prerequisites from compat/lib/csu
102#                    if ${MKCOMPAT} != "no".
103#   do-compat-libgcc: builds and installs prerequisites from
104#                    compat/gnu/lib/crtstuff${LIBGCC_EXT} (if necessary) and
105#                    compat/gnu/lib/libgcc${LIBGCC_EXT} if ${MKCOMPAT} != "no".
106#   do-compat-lib-libc: builds and installs prerequisites from compat/lib/libc
107#                    if ${MKCOMPAT} != "no".
108#   do-build:        builds and installs the entire system.
109#   do-x11:          builds and installs X11 if ${MKX11} != "no"; either
110#                    X11R7 from src/external/mit/xorg if ${X11FLAVOUR} == "Xorg"
111#                    or X11R6 from src/x11
112#   do-extsrc:       builds and installs extsrc if ${MKEXTSRC} != "no".
113#   do-obsolete:     installs the obsolete sets (for the postinstall-* targets).
114#
115
116.if ${.MAKEFLAGS:M${.CURDIR}/share/mk} == ""
117.MAKEFLAGS: -m ${.CURDIR}/share/mk
118.endif
119
120#
121# If _SRC_TOP_OBJ_ gets set here, we will end up with a directory that may
122# not be the top level objdir, because "make obj" can happen in the *middle*
123# of "make build" (long after <bsd.own.mk> is calculated it).  So, pre-set
124# _SRC_TOP_OBJ_ here so it will not be added to ${.MAKEOVERRIDES}.
125#
126_SRC_TOP_OBJ_=
127
128.include <bsd.own.mk>
129
130#
131# Sanity check: make sure that "make build" is not invoked simultaneously
132# with a standard recursive target.
133#
134
135.if make(build) || make(release) || make(snapshot)
136.for targ in ${TARGETS:Nobj:Ncleandir}
137.if make(${targ}) && !target(.BEGIN)
138.BEGIN:
139	@echo 'BUILD ABORTED: "make build" and "make ${targ}" are mutually exclusive.'
140	@false
141.endif
142.endfor
143.endif
144
145#
146# _SUBDIR is used to set SUBDIR, after removing directories that have
147# BUILD_${dir}=no, or that have no ${dir}/Makefile.
148#
149_SUBDIR=	tools lib include gnu external crypto/external bin games
150_SUBDIR+=	libexec sbin usr.bin
151_SUBDIR+=	usr.sbin share rescue sys etc tests compat .WAIT distrib regress
152
153.for dir in ${_SUBDIR}
154.if "${dir}" == ".WAIT" \
155	|| (${BUILD_${dir}:Uyes} != "no" && exists(${dir}/Makefile))
156SUBDIR+=	${dir}
157.endif
158.endfor
159
160.if exists(regress)
161regression-tests: .PHONY .MAKE
162	@echo Running regression tests...
163	${MAKEDIRTARGET} regress regress
164.endif
165
166.if ${MKUNPRIVED} != "no"
167NOPOSTINSTALL=	# defined
168.endif
169
170afterinstall: .PHONY .MAKE
171.if ${MKMAN} != "no"
172	${MAKEDIRTARGET} share/man makedb
173.endif
174.if (${MKUNPRIVED} != "no" && ${MKINFO} != "no")
175	${MAKEDIRTARGET} gnu/usr.bin/texinfo/install-info infodir-meta
176.endif
177.if !defined(NOPOSTINSTALL)
178	${MAKEDIRTARGET} . postinstall-check
179.endif
180
181_POSTINSTALL=	${.CURDIR}/usr.sbin/postinstall/postinstall
182
183postinstall-check: .PHONY
184	@echo "   === Post installation checks ==="
185	AWK=${TOOL_AWK:Q} MAKE=${MAKE:Q} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ check; if [ $$? -gt 1 ]; then exit 1; fi
186	@echo "   ================================"
187
188postinstall-fix: .NOTMAIN .PHONY
189	@echo "   === Post installation fixes ==="
190	AWK=${TOOL_AWK:Q} MAKE=${MAKE:Q} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix
191	@echo "   ==============================="
192
193postinstall-fix-obsolete: .NOTMAIN .PHONY
194	@echo "   === Removing obsolete files ==="
195	AWK=${TOOL_AWK:Q} MAKE=${MAKE:Q} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix obsolete
196	@echo "   ==============================="
197
198
199#
200# Targets (in order!) called by "make build".
201#
202.if defined(HAVE_GCC)
203.if ${HAVE_GCC} == "3"
204LIBGCC_EXT=3
205.else
206LIBGCC_EXT=4
207.endif
208.endif
209
210BUILDTARGETS+=	check-tools
211.if ${MKUPDATE} == "no" && !defined(NOCLEANDIR)
212BUILDTARGETS+=	cleandir
213.endif
214.if ${MKOBJDIRS} != "no"
215BUILDTARGETS+=	do-top-obj
216.endif
217.if ${USETOOLS} == "yes"	# {
218.if ${MKOBJDIRS} != "no"
219BUILDTARGETS+=	do-tools-obj
220.endif
221BUILDTARGETS+=	do-tools
222.endif # USETOOLS		# }
223.if ${MKOBJDIRS} != "no"
224BUILDTARGETS+=	obj
225.endif
226BUILDTARGETS+=	clean_METALOG
227.if !defined(NODISTRIBDIRS)
228BUILDTARGETS+=	do-distrib-dirs
229.endif
230.if !defined(NOINCLUDES)
231BUILDTARGETS+=	includes
232.endif
233BUILDTARGETS+=	do-tools-compat
234BUILDTARGETS+=	do-lib-csu
235.if ${MKGCC} != "no"
236BUILDTARGETS+=	do-libgcc
237.endif
238.if ${MKPCC} != "no"
239BUILDTARGET+=	do-libpcc
240.endif
241BUILDTARGETS+=	do-lib-libc
242BUILDTARGETS+=	do-lib do-gnu-lib do-external-lib
243.if (${MACHINE} != "evbppc") && ${MKKMOD} != "no"
244BUILDTARGETS+=	do-sys-modules
245.endif
246BUILDTARGETS+=	do-sys-rump-dev-lib do-sys-rump-fs-lib
247BUILDTARGETS+=	do-sys-rump-kern-lib do-sys-rump-net-lib
248.if ${MKCOMPAT} != "no"
249BUILDTARGETS+=	do-compat-lib-csu
250BUILDTARGETS+=	do-compat-libgcc
251BUILDTARGETS+=	do-compat-lib-libc
252.endif
253BUILDTARGETS+=	do-ld.so
254BUILDTARGETS+=	do-build
255.if ${MKX11} != "no"
256BUILDTARGETS+=	do-x11
257.endif
258.if ${MKEXTSRC} != "no"
259BUILDTARGETS+=	do-extsrc
260.endif
261BUILDTARGETS+=	do-obsolete
262
263#
264# Enforce proper ordering of some rules.
265#
266
267.ORDER:		${BUILDTARGETS}
268includes-lib:	.PHONY includes-include includes-sys
269includes-gnu:	.PHONY includes-lib
270
271#
272# Build the system and install into DESTDIR.
273#
274
275START_TIME!=	date
276
277build: .PHONY .MAKE
278.if defined(BUILD_DONE)
279	@echo "Build already installed into ${DESTDIR}"
280.else
281	@echo "Build started at: ${START_TIME}"
282.for tgt in ${BUILDTARGETS}
283	${MAKEDIRTARGET} . ${tgt}
284.endfor
285	${MAKEDIRTARGET} etc install-etc-release
286	@echo   "Build started at:  ${START_TIME}"
287	@printf "Build finished at: " && date
288.endif
289
290#
291# Build a full distribution, but not a release (i.e. no sets into
292# ${RELEASEDIR}).  "buildworld" enforces a build to ${DESTDIR} != /
293#
294
295distribution buildworld: .PHONY .MAKE
296.if make(buildworld) && \
297    (!defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/")
298	@echo "Won't make ${.TARGET} with DESTDIR=/"
299	@false
300.endif
301	${MAKEDIRTARGET} . build NOPOSTINSTALL=1
302	${MAKEDIRTARGET} etc distribution INSTALL_DONE=1
303.if defined(DESTDIR) && ${DESTDIR} != "" && ${DESTDIR} != "/"
304	${MAKEDIRTARGET} . postinstall-fix-obsolete
305	${MAKEDIRTARGET} distrib/sets checkflist
306.endif
307	@echo   "make ${.TARGET} started at:  ${START_TIME}"
308	@printf "make ${.TARGET} finished at: " && date
309
310#
311# Install the distribution from $DESTDIR to $INSTALLWORLDDIR (defaults to `/')
312# If installing to /, ensures that the host's operating system is NetBSD and
313# the host's `uname -m` == ${MACHINE}.
314#
315
316HOST_UNAME_S!=	uname -s
317HOST_UNAME_M!=	uname -m
318
319installworld: .PHONY .MAKE
320.if (!defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/")
321	@echo "Can't make ${.TARGET} to DESTDIR=/"
322	@false
323.endif
324.if !defined(INSTALLWORLDDIR) || \
325    ${INSTALLWORLDDIR} == "" || ${INSTALLWORLDDIR} == "/"
326.if (${HOST_UNAME_S} != "NetBSD")
327	@echo "Won't cross-make ${.TARGET} from ${HOST_UNAME_S} to NetBSD with INSTALLWORLDDIR=/"
328	@false
329.endif
330.if (${HOST_UNAME_M} != ${MACHINE})
331	@echo "Won't cross-make ${.TARGET} from ${HOST_UNAME_M} to ${MACHINE} with INSTALLWORLDDIR=/"
332	@false
333.endif
334.endif
335	${MAKEDIRTARGET} distrib/sets installsets \
336	    INSTALLDIR=${INSTALLWORLDDIR:U/} INSTALLSETS=
337	${MAKEDIRTARGET} . postinstall-check DESTDIR=${INSTALLWORLDDIR}
338	@echo   "make ${.TARGET} started at:  ${START_TIME}"
339	@printf "make ${.TARGET} finished at: " && date
340
341#
342# Create sets from $DESTDIR or $NETBSDSRCDIR into $RELEASEDIR
343#
344
345.for tgt in sets sourcesets syspkgs
346${tgt}: .PHONY .MAKE
347	${MAKEDIRTARGET} distrib/sets ${tgt}
348.endfor
349
350#
351# Build a release or snapshot (implies "make distribution").  Note that
352# in this case, the set lists will be checked before the tar files
353# are made.
354#
355
356release snapshot: .PHONY .MAKE
357	${MAKEDIRTARGET} . distribution
358	${MAKEDIRTARGET} etc release DISTRIBUTION_DONE=1
359	@echo   "make ${.TARGET} started at:  ${START_TIME}"
360	@printf "make ${.TARGET} finished at: " && date
361
362#
363# Create a CD-ROM image.
364#
365
366iso-image: .PHONY
367	${MAKEDIRTARGET} distrib iso_image
368	${MAKEDIRTARGET} etc iso-image
369	@echo   "make ${.TARGET} started at:  ${START_TIME}"
370	@printf "make ${.TARGET} finished at: " && date
371
372iso-image-source: .PHONY
373	${MAKEDIRTARGET} distrib iso_image CDSOURCE=true
374	${MAKEDIRTARGET} etc iso-image
375	@echo   "make ${.TARGET} started at:  ${START_TIME}"
376	@printf "make ${.TARGET} finished at: " && date
377
378#
379# Special components of the "make build" process.
380#
381
382check-tools: .PHONY
383.if ${TOOLCHAIN_MISSING} != "no" && !defined(EXTERNAL_TOOLCHAIN)
384	@echo '*** WARNING:  Building on MACHINE=${MACHINE} with missing toolchain.'
385	@echo '*** May result in a failed build or corrupt binaries!'
386.elif defined(EXTERNAL_TOOLCHAIN)
387	@echo '*** Using external toolchain rooted at ${EXTERNAL_TOOLCHAIN}.'
388.endif
389.if defined(NBUILDJOBS)
390	@echo '*** WARNING: NBUILDJOBS is obsolete; use -j directly instead!'
391.endif
392
393# Delete or sanitise a leftover METALOG from a previous build.
394clean_METALOG: .PHONY .MAKE
395.if ${MKUPDATE} != "no"
396	${MAKEDIRTARGET} distrib/sets clean_METALOG
397.endif
398
399do-distrib-dirs: .PHONY .MAKE
400.if !defined(DESTDIR) || ${DESTDIR} == ""
401	${MAKEDIRTARGET} etc distrib-dirs DESTDIR=/
402.else
403	${MAKEDIRTARGET} etc distrib-dirs DESTDIR=${DESTDIR}
404.endif
405
406.for targ in cleandir obj includes
407do-${targ}: .PHONY ${targ}
408	@true
409.endfor
410
411.if defined(HAVE_GCC)
412BUILD_CC_LIB= gnu/lib/crtstuff${LIBGCC_EXT}
413BUILD_CC_LIB+= gnu/lib/libgcc${LIBGCC_EXT}
414.elif defined(HAVE_PCC)
415BUILD_CC_LIB+= external/bsd/pcc/crtstuff
416BUILD_CC_LIB+= external/bsd/pcc/libpcc
417.endif
418
419.for dir in tools tools/compat lib/csu ${BUILD_CC_LIB} lib/libc lib/libdes lib gnu/lib external/lib crypto/external/lib sys/rump/dev/lib sys/rump/fs/lib sys/rump/kern/lib sys/rump/net/lib sys/modules
420do-${dir:S/\//-/g}: .PHONY .MAKE
421.for targ in dependall install
422	${MAKEDIRTARGET} ${dir} ${targ}
423.endfor
424.endfor
425
426.if ${MKCOMPAT} != "no"
427COMPAT_SUBDIR_LIST=lib/csu ${BUILD_CC_LIB} lib/libc
428.for dir in ${COMPAT_SUBDIR_LIST}
429do-compat-${dir:S/\//-/g}: .PHONY .MAKE
430.for targ in obj dependall install
431	${MAKEDIRTARGET} compat ${targ} BOOTSTRAP_SUBDIRS="../../../${dir}"
432.endfor
433.endfor
434.endif
435
436do-top-obj: .PHONY .MAKE
437	${MAKEDIRTARGET} . obj NOSUBDIR=
438
439do-tools-obj: .PHONY .MAKE
440	${MAKEDIRTARGET} tools obj
441
442do-libgcc: .PHONY .MAKE
443.if defined(HAVE_GCC)
444.if ${MKGCC} != "no"
445.if (${HAVE_GCC} == "3" || ${HAVE_GCC} == "4")
446	${MAKEDIRTARGET} . do-gnu-lib-crtstuff${LIBGCC_EXT}
447.endif
448	${MAKEDIRTARGET} . do-gnu-lib-libgcc${LIBGCC_EXT}
449.endif
450.endif
451
452do-compat-libgcc: .PHONY .MAKE
453.if defined(HAVE_GCC)
454.if ${MKGCC} != "no"
455	${MAKEDIRTARGET} . do-compat-gnu-lib-crtstuff${LIBGCC_EXT}
456	${MAKEDIRTARGET} . do-compat-gnu-lib-libgcc${LIBGCC_EXT}
457.endif
458.endif
459
460do-libpcc: .PHONY .MAKE
461.if defined(HAVE_PCC)
462.if ${MKPCC} != "no"
463	${MAKEDIRTARGET} . do-pcc-lib-crtstuff
464	${MAKEDIRTARGET} . do-pcc-lib-libpcc
465.endif
466.endif
467
468do-ld.so: .PHONY .MAKE
469.for targ in dependall install
470	${MAKEDIRTARGET} libexec/ld.elf_so ${targ}
471.endfor
472
473do-build: .PHONY .MAKE
474.for targ in dependall install
475	${MAKEDIRTARGET} . ${targ} BUILD_tools=no BUILD_lib=no
476.endfor
477
478do-x11: .PHONY .MAKE
479.if ${MKX11} != "no"
480.if ${X11FLAVOUR} == "Xorg"
481	${MAKEDIRTARGET} external/mit/xorg build
482.else
483	${MAKEDIRTARGET} x11 build
484.endif
485.else
486	@echo "MKX11 is not enabled"
487	@false
488.endif
489
490do-extsrc: .PHONY .MAKE
491.if ${MKEXTSRC} != "no"
492	${MAKEDIRTARGET} extsrc build
493.else
494	@echo "MKEXTSRC is not enabled"
495	@false
496.endif
497
498do-obsolete: .PHONY .MAKE
499	${MAKEDIRTARGET} etc install-obsolete-lists
500
501#
502# Speedup stubs for some subtrees that don't need to run these rules.
503# (Tells <bsd.subdir.mk> not to recurse for them.)
504#
505
506.for dir in bin etc distrib games libexec regress sbin usr.sbin tools
507includes-${dir}: .PHONY
508	@true
509.endfor
510.for dir in etc distrib regress
511install-${dir}: .PHONY
512	@true
513.endfor
514
515#
516# XXX this needs to change when distrib Makefiles are recursion compliant
517# XXX many distrib subdirs need "cd etc && make snap_pre snap_kern" first...
518#
519dependall-distrib depend-distrib all-distrib: .PHONY
520	@true
521
522.include <bsd.sys.mk>
523.include <bsd.obj.mk>
524.include <bsd.kernobj.mk>
525.include <bsd.subdir.mk>
526
527build-docs: .PHONY ${.CURDIR}/BUILDING
528${.CURDIR}/BUILDING: doc/BUILDING.mdoc
529	${_MKMSG_CREATE} ${.TARGET}
530	${TOOL_GROFF} -mdoc -Tascii -P-bou $> >$@
531
532
533#
534# Display current make(1) parameters
535#
536params: .PHONY .MAKE
537	${MAKEDIRTARGET} etc params
538