Makefile revision 1.241
11.241Sapb#	$NetBSD: Makefile,v 1.241 2006/01/04 15:30:02 apb Exp $
21.95Scjs
31.193Slukem#
41.95Scjs# This is the top-level makefile for building NetBSD. For an outline of
51.95Scjs# how to build a snapshot or release, as well as other release engineering
61.221Ssalo# information, see http://www.NetBSD.org/developers/releng/index.html
71.95Scjs#
81.95Scjs# Not everything you can set or do is documented in this makefile. In
91.95Scjs# particular, you should review the files in /usr/share/mk (especially
101.95Scjs# bsd.README) for general information on building programs and writing
111.95Scjs# Makefiles within this structure, and see the comments in src/etc/Makefile
121.95Scjs# for further information on installation and release set options.
131.95Scjs#
141.95Scjs# Variables listed below can be set on the make command line (highest
151.95Scjs# priority), in /etc/mk.conf (middle priority), or in the environment
161.95Scjs# (lowest priority).
171.95Scjs#
181.95Scjs# Variables:
191.101Ssommerfe#   DESTDIR is the target directory for installation of the compiled
201.101Ssommerfe#	software. It defaults to /. Note that programs are built against
211.101Ssommerfe#	libraries installed in DESTDIR.
221.214Slukem#   MKMAN, if `no', will prevent building of manual pages.
231.214Slukem#   MKOBJDIRS, if not `no', will build object directories at
241.101Ssommerfe#	an appropriate point in a build.
251.214Slukem#   MKSHARE, if `no', will prevent building and installing
261.95Scjs#	anything in /usr/share.
271.214Slukem#   MKUPDATE, if not `no', will avoid a `make cleandir' at the start of
281.178Senami#	`make build', as well as having the effects listed in
291.178Senami#	/usr/share/mk/bsd.README.
301.125Smrg#   NOCLEANDIR, if defined, will avoid a `make cleandir' at the start
311.178Senami#	of the `make build'.
321.119Stoddpw#   NOINCLUDES will avoid the `make includes' usually done by `make build'.
331.95Scjs#
341.214Slukem#   See mk.conf(5) for more details.
351.214Slukem#
361.214Slukem#
371.95Scjs# Targets:
381.137Stv#   build:
391.196Slukem#	Builds a full release of NetBSD in DESTDIR, except for the
401.196Slukem#	/etc configuration files.
411.196Slukem#	If BUILD_DONE is set, this is an empty target.
421.196Slukem#   distribution:
431.196Slukem#	Builds a full release of NetBSD in DESTDIR, including the /etc
441.196Slukem#	configuration files.
451.196Slukem#   buildworld:
461.196Slukem#	As per `make distribution', except that it ensures that DESTDIR
471.196Slukem#	is not the root directory.
481.196Slukem#   installworld:
491.196Slukem#	Install the distribution from DESTDIR to INSTALLWORLDDIR (which
501.196Slukem#	defaults to the root directory).  Ensures that INSTALLWORLDDIR
511.196Slukem#	is the not root directory if cross compiling.
521.137Stv#   release:
531.240Slukem#	Does a `make distribution', and then tars up the DESTDIR files
541.196Slukem#	into RELEASEDIR/${MACHINE}, in release(7) format.
551.196Slukem#	(See etc/Makefile for more information on this.)
561.137Stv#   regression-tests:
571.137Stv#	Runs the regression tests in "regress" on this host.
581.206Slukem#   sets:
591.206Slukem#	Populate ${RELEASEDIR}/${MACHINE}/binary/sets from ${DESTDIR}
601.206Slukem#   sourcesets:
611.206Slukem#	Populate ${RELEASEDIR}/source/sets from ${NETBSDSRCDIR}
621.241Sapb#   syspkgs:
631.241Sapb#	Populate ${RELEASEDIR}/${MACHINE}/binary/syspkgs from ${DESTDIR}
641.123Smrg#
651.137Stv# Targets invoked by `make build,' in order:
661.155Stv#   cleandir:        cleans the tree.
671.137Stv#   obj:             creates object directories.
681.152Stv#   do-tools:        builds host toolchain.
691.208Slukem#   do-distrib-dirs: creates the distribution directories.
701.208Slukem#   includes:        installs include files.
711.202Sthorpej#   do-tools-compat: builds the "libnbcompat" library; needed for some
721.202Sthorpej#                    random host tool programs in the source tree.
731.238Slukem#   do-lib-csu:      builds and installs prerequisites from lib/csu.
741.236Sthorpej#   do-gnu-lib-crtstuff3: builds and installs prerequisites from
751.236Sthorpej#			  gnu/lib/crtstuff3
761.222Slukem#   do-gnu-lib-libgcc3: builds and installs prerequisites from gnu/lib/libgcc3
771.186Sthorpej#   do-lib-libc:     builds and installs prerequisites from lib/libc.
781.143Stv#   do-lib:          builds and installs prerequisites from lib.
791.143Stv#   do-gnu-lib:      builds and installs prerequisites from gnu/lib.
801.189Sitohy#   do-ld.so:        builds and installs prerequisites from libexec/ld.*_so.
811.137Stv#   do-build:        builds and installs the entire system.
821.227Slukem#   do-x11:          builds and installs X11R6 from src/x11 if ${MKX11} != "no"
831.222Slukem#   do-obsolete:     installs the obsolete sets (for the postinstall-* targets).
841.193Slukem#
851.32Scgd
861.146Stv.if ${.MAKEFLAGS:M${.CURDIR}/share/mk} == ""
871.146Stv.MAKEFLAGS: -m ${.CURDIR}/share/mk
881.146Stv.endif
891.163Stv
901.193Slukem#
911.163Stv# If _SRC_TOP_OBJ_ gets set here, we will end up with a directory that may
921.163Stv# not be the top level objdir, because "make obj" can happen in the *middle*
931.163Stv# of "make build" (long after <bsd.own.mk> is calculated it).  So, pre-set
941.163Stv# _SRC_TOP_OBJ_ here so it will not be added to ${.MAKEOVERRIDES}.
951.193Slukem#
961.163Stv_SRC_TOP_OBJ_=
971.148Sjmc
981.146Stv.include <bsd.own.mk>
991.4Scgd
1001.193Slukem#
1011.137Stv# Sanity check: make sure that "make build" is not invoked simultaneously
1021.137Stv# with a standard recursive target.
1031.193Slukem#
1041.137Stv
1051.137Stv.if make(build) || make(release) || make(snapshot)
1061.137Stv.for targ in ${TARGETS:Nobj:Ncleandir}
1071.137Stv.if make(${targ}) && !target(.BEGIN)
1081.137Stv.BEGIN:
1091.137Stv	@echo 'BUILD ABORTED: "make build" and "make ${targ}" are mutually exclusive.'
1101.137Stv	@false
1111.137Stv.endif
1121.137Stv.endfor
1131.137Stv.endif
1141.58Stv
1151.166Ssimonb_SUBDIR=	tools lib include gnu bin games libexec sbin usr.bin
1161.205Sthorpej_SUBDIR+=	usr.sbin share rescue sys etc .WAIT distrib regress
1171.105Sassar
1181.193Slukem#
1191.137Stv# Weed out directories that don't exist.
1201.193Slukem#
1211.36Sexplorer
1221.137Stv.for dir in ${_SUBDIR}
1231.154Stv.if exists(${dir}/Makefile) && (${BUILD_${dir}:Uyes} != "no")
1241.137StvSUBDIR+=	${dir}
1251.36Sexplorer.endif
1261.137Stv.endfor
1271.21Scgd
1281.13Sbrezak.if exists(regress)
1291.228Slukemregression-tests: .PHONY
1301.10Scgd	@echo Running regression tests...
1311.232Slukem	${MAKEDIRTARGET} regress regress
1321.13Sbrezak.endif
1331.20Scgd
1341.214Slukem.if ${MKUNPRIVED} != "no"
1351.179SthorpejNOPOSTINSTALL=	# defined
1361.179Sthorpej.endif
1371.179Sthorpej
1381.228Slukemafterinstall: .PHONY
1391.137Stv.if ${MKMAN} != "no"
1401.232Slukem	${MAKEDIRTARGET} share/man makedb
1411.137Stv.endif
1421.214Slukem.if (${MKUNPRIVED} != "no" && ${MKINFO} != "no")
1431.232Slukem	${MAKEDIRTARGET} gnu/usr.bin/texinfo/install-info infodir-meta
1441.176Slukem.endif
1451.179Sthorpej.if !defined(NOPOSTINSTALL)
1461.232Slukem	${MAKEDIRTARGET} . postinstall-check
1471.159Sperry.endif
1481.170Slukem
1491.239Slukem_POSTINSTALL=	${.CURDIR}/usr.sbin/postinstall/postinstall
1501.239Slukem
1511.228Slukempostinstall-check: .PHONY
1521.169Slukem	@echo "   === Post installation checks ==="
1531.239Slukem	${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ check
1541.171Slukem	@echo "   ================================"
1551.171Slukem
1561.228Slukempostinstall-fix: .NOTMAIN .PHONY
1571.171Slukem	@echo "   === Post installation fixes ==="
1581.239Slukem	${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix
1591.212Slukem	@echo "   ==============================="
1601.212Slukem
1611.228Slukempostinstall-fix-obsolete: .NOTMAIN .PHONY
1621.212Slukem	@echo "   === Removing obsolete files ==="
1631.239Slukem	${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix obsolete
1641.212Slukem	@echo "   ==============================="
1651.169Slukem
1661.108Serh
1671.193Slukem#
1681.137Stv# Targets (in order!) called by "make build".
1691.193Slukem#
1701.220Smrg.if ${USE_TOOLS_TOOLCHAIN} == "no"
1711.220SmrgLIBGCC_EXT=3
1721.220Smrg.else
1731.220SmrgLIBGCC_EXT=
1741.220Smrg.endif
1751.123Smrg
1761.156StvBUILDTARGETS+=	check-tools
1771.214Slukem.if ${MKUPDATE} == "no" && !defined(NOCLEANDIR)
1781.155StvBUILDTARGETS+=	cleandir
1791.155Stv.endif
1801.149Stv.if ${MKOBJDIRS} != "no"
1811.137StvBUILDTARGETS+=	obj
1821.123Smrg.endif
1831.138Stv.if ${USETOOLS} == "yes"
1841.152StvBUILDTARGETS+=	do-tools
1851.131Stv.endif
1861.137Stv.if !defined(NODISTRIBDIRS)
1871.137StvBUILDTARGETS+=	do-distrib-dirs
1881.131Stv.endif
1891.137Stv.if !defined(NOINCLUDES)
1901.137StvBUILDTARGETS+=	includes
1911.131Stv.endif
1921.202SthorpejBUILDTARGETS+=	do-tools-compat
1931.231SskrllBUILDTARGETS+=	do-lib-csu
1941.207Sdrochner.if ${MKGCC} != "no"
1951.237Stacha.if ${HAVE_GCC3} != "no"
1961.236SthorpejBUILDTARGETS+=	do-gnu-lib-crtstuff${LIBGCC_EXT}
1971.237Stacha.endif
1981.220SmrgBUILDTARGETS+=	do-gnu-lib-libgcc${LIBGCC_EXT}
1991.207Sdrochner.endif
2001.231SskrllBUILDTARGETS+=	do-lib-libc
2011.224SlukemBUILDTARGETS+=	do-lib do-gnu-lib
2021.224SlukemBUILDTARGETS+=	do-ld.so
2031.224SlukemBUILDTARGETS+=	do-build
2041.227Slukem.if ${MKX11} != "no"
2051.227SlukemBUILDTARGETS+=	do-x11
2061.227Slukem.endif
2071.200SlukemBUILDTARGETS+=	do-obsolete
2081.131Stv
2091.193Slukem#
2101.137Stv# Enforce proper ordering of some rules.
2111.193Slukem#
2121.123Smrg
2131.137Stv.ORDER:		${BUILDTARGETS}
2141.228Slukemincludes-lib:	.PHONY includes-include includes-sys
2151.228Slukemincludes-gnu:	.PHONY includes-lib
2161.123Smrg
2171.193Slukem#
2181.137Stv# Build the system and install into DESTDIR.
2191.193Slukem#
2201.123Smrg
2211.191SlukemSTART_TIME!=	date
2221.191Slukem
2231.228Slukembuild: .PHONY
2241.137Stv.if defined(BUILD_DONE)
2251.137Stv	@echo "Build already installed into ${DESTDIR}"
2261.137Stv.else
2271.191Slukem	@echo "Build started at: ${START_TIME}"
2281.145Stv.for tgt in ${BUILDTARGETS}
2291.232Slukem	${MAKEDIRTARGET} . ${tgt}
2301.145Stv.endfor
2311.232Slukem	${MAKEDIRTARGET} etc install-etc-release
2321.191Slukem	@echo   "Build started at:  ${START_TIME}"
2331.172Sbjh21	@printf "Build finished at: " && date
2341.71Smycroft.endif
2351.160Sthorpej
2361.193Slukem#
2371.160Sthorpej# Build a full distribution, but not a release (i.e. no sets into
2381.193Slukem# ${RELEASEDIR}).  "buildworld" enforces a build to ${DESTDIR} != /
2391.193Slukem#
2401.160Sthorpej
2411.228Slukemdistribution buildworld: .PHONY
2421.194Slukem.if make(buildworld) && \
2431.194Slukem    (!defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/")
2441.193Slukem	@echo "Won't make ${.TARGET} with DESTDIR=/"
2451.193Slukem	@false
2461.193Slukem.endif
2471.232Slukem	${MAKEDIRTARGET} . build NOPOSTINSTALL=1
2481.232Slukem	${MAKEDIRTARGET} etc distribution INSTALL_DONE=1
2491.181Sthorpej.if defined(DESTDIR) && ${DESTDIR} != "" && ${DESTDIR} != "/"
2501.232Slukem	${MAKEDIRTARGET} . postinstall-fix-obsolete
2511.232Slukem	${MAKEDIRTARGET} distrib/sets checkflist
2521.181Sthorpej.endif
2531.192Slukem	@echo   "make ${.TARGET} started at:  ${START_TIME}"
2541.185Slukem	@printf "make ${.TARGET} finished at: " && date
2551.123Smrg
2561.193Slukem#
2571.193Slukem# Install the distribution from $DESTDIR to $INSTALLWORLDDIR (defaults to `/')
2581.193Slukem# If installing to /, ensures that the host's operating system is NetBSD and
2591.193Slukem# the host's `uname -m` == ${MACHINE}.
2601.193Slukem#
2611.193Slukem
2621.193SlukemHOST_UNAME_S!=	uname -s
2631.193SlukemHOST_UNAME_M!=	uname -m
2641.193Slukem
2651.228Slukeminstallworld: .PHONY
2661.194Slukem.if (!defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/")
2671.193Slukem	@echo "Can't make ${.TARGET} to DESTDIR=/"
2681.193Slukem	@false
2691.193Slukem.endif
2701.193Slukem.if !defined(INSTALLWORLDDIR) || \
2711.193Slukem    ${INSTALLWORLDDIR} == "" || ${INSTALLWORLDDIR} == "/"
2721.193Slukem.if (${HOST_UNAME_S} != "NetBSD")
2731.193Slukem	@echo "Won't cross-make ${.TARGET} from ${HOST_UNAME_S} to NetBSD with INSTALLWORLDDIR=/"
2741.193Slukem	@false
2751.193Slukem.endif
2761.193Slukem.if (${HOST_UNAME_M} != ${MACHINE})
2771.193Slukem	@echo "Won't cross-make ${.TARGET} from ${HOST_UNAME_M} to ${MACHINE} with INSTALLWORLDDIR=/"
2781.193Slukem	@false
2791.193Slukem.endif
2801.193Slukem.endif
2811.232Slukem	${MAKEDIRTARGET} distrib/sets installsets \
2821.232Slukem	    INSTALLDIR=${INSTALLWORLDDIR:U/} INSTALLSETS=
2831.232Slukem	${MAKEDIRTARGET} . postinstall-check DESTDIR=${INSTALLWORLDDIR}
2841.193Slukem	@echo   "make ${.TARGET} started at:  ${START_TIME}"
2851.193Slukem	@printf "make ${.TARGET} finished at: " && date
2861.199Slukem
2871.199Slukem#
2881.206Slukem# Create sets from $DESTDIR or $NETBSDSRCDIR into $RELEASEDIR
2891.199Slukem#
2901.199Slukem
2911.241Sapb.for tgt in sets sourcesets syspkgs
2921.228Slukem${tgt}: .PHONY
2931.232Slukem	${MAKEDIRTARGET} distrib/sets ${tgt}
2941.206Slukem.endfor
2951.193Slukem
2961.193Slukem#
2971.240Slukem# Build a release or snapshot (implies "make distribution").  Note that
2981.181Sthorpej# in this case, the set lists will be checked before the tar files
2991.181Sthorpej# are made.
3001.193Slukem#
3011.123Smrg
3021.228Slukemrelease snapshot: .PHONY
3031.240Slukem	${MAKEDIRTARGET} . distribution
3041.240Slukem	${MAKEDIRTARGET} etc release DISTRIBUTION_DONE=1
3051.192Slukem	@echo   "make ${.TARGET} started at:  ${START_TIME}"
3061.185Slukem	@printf "make ${.TARGET} finished at: " && date
3071.123Smrg
3081.193Slukem#
3091.137Stv# Special components of the "make build" process.
3101.193Slukem#
3111.156Stv
3121.228Slukemcheck-tools: .PHONY
3131.223Slukem.if ${TOOLCHAIN_MISSING} != "no" && !defined(EXTERNAL_TOOLCHAIN)
3141.187Sthorpej	@echo '*** WARNING:  Building on MACHINE=${MACHINE} with missing toolchain.'
3151.187Sthorpej	@echo '*** May result in a failed build or corrupt binaries!'
3161.187Sthorpej.elif defined(EXTERNAL_TOOLCHAIN)
3171.187Sthorpej	@echo '*** Using external toolchain rooted at ${EXTERNAL_TOOLCHAIN}.'
3181.156Stv.endif
3191.173Ssommerfe.if defined(NBUILDJOBS)
3201.173Ssommerfe	@echo '*** WARNING: NBUILDJOBS is obsolete; use -j directly instead!'
3211.173Ssommerfe.endif
3221.123Smrg
3231.228Slukemdo-distrib-dirs: .PHONY
3241.147Sjmc.if !defined(DESTDIR) || ${DESTDIR} == ""
3251.232Slukem	${MAKEDIRTARGET} etc distrib-dirs DESTDIR=/
3261.147Sjmc.else
3271.232Slukem	${MAKEDIRTARGET} etc distrib-dirs DESTDIR=${DESTDIR}
3281.147Sjmc.endif
3291.190Slukem
3301.190Slukem.for targ in cleandir obj includes
3311.228Slukemdo-${targ}: .PHONY ${targ}
3321.190Slukem	@true
3331.190Slukem.endfor
3341.123Smrg
3351.236Sthorpej.for dir in tools tools/compat lib/csu gnu/lib/crtstuff${LIBGCC_EXT} gnu/lib/libgcc${LIBGCC_EXT} lib/libc lib/libdes lib gnu/lib
3361.228Slukemdo-${dir:S/\//-/g}: .PHONY
3371.137Stv.for targ in dependall install
3381.232Slukem	${MAKEDIRTARGET} ${dir} ${targ}
3391.137Stv.endfor
3401.184Slukem.endfor
3411.184Slukem
3421.228Slukemdo-ld.so: .PHONY
3431.184Slukem.for targ in dependall install
3441.189Sitohy.if (${OBJECT_FMT} == "a.out")
3451.232Slukem	${MAKEDIRTARGET} libexec/ld.aout_so ${targ}
3461.189Sitohy.endif
3471.189Sitohy.if (${OBJECT_FMT} == "ELF")
3481.232Slukem	${MAKEDIRTARGET} libexec/ld.elf_so ${targ}
3491.189Sitohy.endif
3501.137Stv.endfor
3511.143Stv
3521.228Slukemdo-build: .PHONY
3531.154Stv.for targ in dependall install
3541.232Slukem	${MAKEDIRTARGET} . ${targ} BUILD_tools=no BUILD_lib=no
3551.154Stv.endfor
3561.200Slukem
3571.228Slukemdo-x11: .PHONY
3581.232Slukem	${MAKEDIRTARGET} x11 build
3591.227Slukem
3601.228Slukemdo-obsolete: .PHONY
3611.232Slukem	${MAKEDIRTARGET} etc install-obsolete-lists
3621.87Scjs
3631.193Slukem#
3641.137Stv# Speedup stubs for some subtrees that don't need to run these rules.
3651.137Stv# (Tells <bsd.subdir.mk> not to recurse for them.)
3661.193Slukem#
3671.129Stv
3681.152Stv.for dir in bin etc distrib games libexec regress sbin usr.sbin tools
3691.228Slukemincludes-${dir}: .PHONY
3701.152Stv	@true
3711.152Stv.endfor
3721.152Stv.for dir in etc distrib regress
3731.228Slukeminstall-${dir}: .PHONY
3741.152Stv	@true
3751.152Stv.endfor
3761.152Stv
3771.193Slukem#
3781.152Stv# XXX this needs to change when distrib Makefiles are recursion compliant
3791.193Slukem# XXX many distrib subdirs need "cd etc && make snap_pre snap_kern" first...
3801.193Slukem#
3811.228Slukemdependall-distrib depend-distrib all-distrib: .PHONY
3821.136Snathanw	@true
3831.130Stv
3841.211Slukem.include <bsd.sys.mk>
3851.151Stv.include <bsd.obj.mk>
3861.209Slukem.include <bsd.kernobj.mk>
3871.146Stv.include <bsd.subdir.mk>
3881.144Stv
3891.228Slukembuild-docs: .PHONY ${.CURDIR}/BUILDING
3901.188Slukem${.CURDIR}/BUILDING: doc/BUILDING.mdoc
3911.230Slukem	${_MKMSG_CREATE} ${.TARGET}
3921.216Slukem	${TOOL_GROFF} -mdoc -Tascii -P-bou $> >$@
3931.209Slukem
3941.209Slukem
3951.209Slukem#
3961.209Slukem# Display current make(1) parameters
3971.209Slukem#
3981.228Slukemparams: .PHONY
3991.232Slukem	${MAKEDIRTARGET} etc params
400