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