
1: # $NetBSD: Makefile,v 1.246.2.3 2007/10/26 14:23:20 liamjfoy 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/${MACHINE}, 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}/${MACHINE}/binary/sets from ${DESTDIR} 60: # sourcesets: 61: # Populate ${RELEASEDIR}/source/sets from ${NETBSDSRCDIR} 62: # syspkgs: 63: # Populate ${RELEASEDIR}/${MACHINE}/binary/syspkgs from ${DESTDIR} 64: # iso-image: 65: # Create CD-ROM image in RELEASEDIR/iso. 66: # RELEASEDIR must already have been populated by `make release' 67: # or equivalent. 68: # iso-image-source: 69: # Create CD-ROM image with source in RELEASEDIR/iso. 70: # RELEASEDIR must already have been populated by 71: # `make release sourcesets' or equivalent. 72: # 73: # Targets invoked by `make build,' in order: 74: # cleandir: cleans the tree. 75: # obj: creates object directories. 76: # do-tools: builds host toolchain. 77: # do-distrib-dirs: creates the distribution directories. 78: # includes: installs include files. 79: # do-tools-compat: builds the "libnbcompat" library; needed for some 80: # random host tool programs in the source tree. 81: # do-lib-csu: builds and installs prerequisites from lib/csu. 82: # do-gnu-lib-crtstuff3: builds and installs prerequisites from 83: # gnu/lib/crtstuff3 84: # do-gnu-lib-libgcc3: builds and installs prerequisites from gnu/lib/libgcc3 85: # do-lib-libc: builds and installs prerequisites from lib/libc. 86: # do-lib: builds and installs prerequisites from lib. 87: # do-gnu-lib: builds and installs prerequisites from gnu/lib. 88: # do-ld.so: builds and installs prerequisites from libexec/ld.*_so. 89: # do-build: builds and installs the entire system. 90: # do-x11: builds and installs X11R6 from src/x11 if ${MKX11} != "no" 91: # do-obsolete: installs the obsolete sets (for the postinstall-* targets). 92: # 93: 94: .if ${.MAKEFLAGS:M${.CURDIR}/share/mk} == "" 95: .MAKEFLAGS: -m ${.CURDIR}/share/mk 96: .endif 97: 98: # 99: # If _SRC_TOP_OBJ_ gets set here, we will end up with a directory that may 100: # not be the top level objdir, because "make obj" can happen in the *middle* 101: # of "make build" (long after <bsd.own.mk> is calculated it). So, pre-set 102: # _SRC_TOP_OBJ_ here so it will not be added to ${.MAKEOVERRIDES}. 103: # 104: _SRC_TOP_OBJ_= 105: 106: .include <bsd.own.mk> 107: 108: # 109: # Sanity check: make sure that "make build" is not invoked simultaneously 110: # with a standard recursive target. 111: # 112: 113: .if make(build) || make(release) || make(snapshot) 114: .for targ in ${TARGETS:Nobj:Ncleandir} 115: .if make(${targ}) && !target(.BEGIN) 116: .BEGIN: 117: @echo 'BUILD ABORTED: "make build" and "make ${targ}" are mutually exclusive.' 118: @false 119: .endif 120: .endfor 121: .endif 122: 123: _SUBDIR= tools lib include gnu bin games libexec sbin usr.bin 124: _SUBDIR+= usr.sbin share rescue sys etc .WAIT distrib regress 125: 126: # 127: # Weed out directories that don't exist. 128: # 129: 130: .for dir in ${_SUBDIR} 131: .if ("${dir}" == ".WAIT") || exists(${dir}/Makefile) && (${BUILD_${dir}:Uyes} != "no") 132: SUBDIR+= ${dir} 133: .endif 134: .endfor 135: 136: .if exists(regress) 137: regression-tests: .PHONY .MAKE 138: @echo Running regression tests... 139: ${MAKEDIRTARGET} regress regress 140: .endif 141: 142: .if ${MKUNPRIVED} != "no" 143: NOPOSTINSTALL= # defined 144: .endif 145: 146: afterinstall: .PHONY .MAKE 147: .if ${MKMAN} != "no" 148: ${MAKEDIRTARGET} share/man makedb 149: .endif 150: .if (${MKUNPRIVED} != "no" && ${MKINFO} != "no") 151: ${MAKEDIRTARGET} gnu/usr.bin/texinfo/install-info infodir-meta 152: .endif 153: .if !defined(NOPOSTINSTALL) 154: ${MAKEDIRTARGET} . postinstall-check 155: .endif 156: 157: _POSTINSTALL= ${.CURDIR}/usr.sbin/postinstall/postinstall 158: 159: postinstall-check: .PHONY 160: @echo " === Post installation checks ===" 161: ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ check; if [ $$? -gt 1 ]; then exit 1; fi 162: @echo " ================================" 163: 164: postinstall-fix: .NOTMAIN .PHONY 165: @echo " === Post installation fixes ===" 166: ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix 167: @echo " ===============================" 168: 169: postinstall-fix-obsolete: .NOTMAIN .PHONY 170: @echo " === Removing obsolete files ===" 171: ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix obsolete 172: @echo " ===============================" 173: 174: 175: # 176: # Targets (in order!) called by "make build". 177: # 178: .if ${HAVE_GCC} == "3" 179: LIBGCC_EXT=3 180: .else 181: LIBGCC_EXT=4 182: .endif 183: 184: BUILDTARGETS+= check-tools 185: .if ${MKUPDATE} == "no" && !defined(NOCLEANDIR) 186: BUILDTARGETS+= cleandir 187: .endif 188: .if ${MKOBJDIRS} != "no" 189: BUILDTARGETS+= obj 190: .endif 191: .if ${USETOOLS} == "yes" 192: BUILDTARGETS+= do-tools 193: .endif 194: .if !defined(NODISTRIBDIRS) 195: BUILDTARGETS+= do-distrib-dirs 196: .endif 197: .if !defined(NOINCLUDES) 198: BUILDTARGETS+= includes 199: .endif 200: BUILDTARGETS+= do-tools-compat 201: BUILDTARGETS+= do-lib-csu 202: .if ${MKGCC} != "no" 203: .if (${HAVE_GCC} == "3" || ${HAVE_GCC} == "4") 204: BUILDTARGETS+= do-gnu-lib-crtstuff${LIBGCC_EXT} 205: .endif 206: BUILDTARGETS+= do-gnu-lib-libgcc${LIBGCC_EXT} 207: .endif 208: BUILDTARGETS+= do-lib-libc 209: BUILDTARGETS+= do-lib do-gnu-lib 210: BUILDTARGETS+= do-ld.so 211: BUILDTARGETS+= do-build 212: .if ${MKX11} != "no" 213: BUILDTARGETS+= do-x11 214: .endif 215: BUILDTARGETS+= do-obsolete 216: 217: # 218: # Enforce proper ordering of some rules. 219: # 220: 221: .ORDER: ${BUILDTARGETS} 222: includes-lib: .PHONY includes-include includes-sys 223: includes-gnu: .PHONY includes-lib 224: 225: # 226: # Build the system and install into DESTDIR. 227: # 228: 229: START_TIME!= date 230: 231: build: .PHONY .MAKE 232: .if defined(BUILD_DONE) 233: @echo "Build already installed into ${DESTDIR}" 234: .else 235: @echo "Build started at: ${START_TIME}" 236: .for tgt in ${BUILDTARGETS} 237: ${MAKEDIRTARGET} . ${tgt} 238: .endfor 239: ${MAKEDIRTARGET} etc install-etc-release 240: @echo "Build started at: ${START_TIME}" 241: @printf "Build finished at: " && date 242: .endif 243: 244: # 245: # Build a full distribution, but not a release (i.e. no sets into 246: # ${RELEASEDIR}). "buildworld" enforces a build to ${DESTDIR} != / 247: # 248: 249: distribution buildworld: .PHONY .MAKE 250: .if make(buildworld) && \ 251: (!defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/") 252: @echo "Won't make ${.TARGET} with DESTDIR=/" 253: @false 254: .endif 255: ${MAKEDIRTARGET} . build NOPOSTINSTALL=1 256: ${MAKEDIRTARGET} etc distribution INSTALL_DONE=1 257: .if defined(DESTDIR) && ${DESTDIR} != "" && ${DESTDIR} != "/" 258: ${MAKEDIRTARGET} . postinstall-fix-obsolete 259: ${MAKEDIRTARGET} distrib/sets checkflist 260: .endif 261: @echo "make ${.TARGET} started at: ${START_TIME}" 262: @printf "make ${.TARGET} finished at: " && date 263: 264: # 265: # Install the distribution from $DESTDIR to $INSTALLWORLDDIR (defaults to `/') 266: # If installing to /, ensures that the host's operating system is NetBSD and 267: # the host's `uname -m` == ${MACHINE}. 268: # 269: 270: HOST_UNAME_S!= uname -s 271: HOST_UNAME_M!= uname -m 272: 273: installworld: .PHONY .MAKE 274: .if (!defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/") 275: @echo "Can't make ${.TARGET} to DESTDIR=/" 276: @false 277: .endif 278: .if !defined(INSTALLWORLDDIR) || \ 279: ${INSTALLWORLDDIR} == "" || ${INSTALLWORLDDIR} == "/" 280: .if (${HOST_UNAME_S} != "NetBSD") 281: @echo "Won't cross-make ${.TARGET} from ${HOST_UNAME_S} to NetBSD with INSTALLWORLDDIR=/" 282: @false 283: .endif 284: .if (${HOST_UNAME_M} != ${MACHINE}) 285: @echo "Won't cross-make ${.TARGET} from ${HOST_UNAME_M} to ${MACHINE} with INSTALLWORLDDIR=/" 286: @false 287: .endif 288: .endif 289: ${MAKEDIRTARGET} distrib/sets installsets \ 290: INSTALLDIR=${INSTALLWORLDDIR:U/} INSTALLSETS= 291: ${MAKEDIRTARGET} . postinstall-check DESTDIR=${INSTALLWORLDDIR} 292: @echo "make ${.TARGET} started at: ${START_TIME}" 293: @printf "make ${.TARGET} finished at: " && date 294: 295: # 296: # Create sets from $DESTDIR or $NETBSDSRCDIR into $RELEASEDIR 297: # 298: 299: .for tgt in sets sourcesets syspkgs 300: ${tgt}: .PHONY .MAKE 301: ${MAKEDIRTARGET} distrib/sets ${tgt} 302: .endfor 303: 304: # 305: # Build a release or snapshot (implies "make distribution"). Note that 306: # in this case, the set lists will be checked before the tar files 307: # are made. 308: # 309: 310: release snapshot: .PHONY .MAKE 311: ${MAKEDIRTARGET} . distribution 312: ${MAKEDIRTARGET} etc release DISTRIBUTION_DONE=1 313: @echo "make ${.TARGET} started at: ${START_TIME}" 314: @printf "make ${.TARGET} finished at: " && date 315: 316: # 317: # Create a CD-ROM image. 318: # 319: 320: iso-image: .PHONY 321: ${MAKEDIRTARGET} distrib iso_image 322: ${MAKEDIRTARGET} etc iso-image 323: @echo "make ${.TARGET} started at: ${START_TIME}" 324: @printf "make ${.TARGET} finished at: " && date 325: 326: iso-image-source: .PHONY 327: ${MAKEDIRTARGET} distrib iso_image CDSOURCE=true 328: ${MAKEDIRTARGET} etc iso-image 329: @echo "make ${.TARGET} started at: ${START_TIME}" 330: @printf "make ${.TARGET} finished at: " && date 331: 332: # 333: # Special components of the "make build" process. 334: # 335: 336: check-tools: .PHONY 337: .if ${TOOLCHAIN_MISSING} != "no" && !defined(EXTERNAL_TOOLCHAIN) 338: @echo '*** WARNING: Building on MACHINE=${MACHINE} with missing toolchain.' 339: @echo '*** May result in a failed build or corrupt binaries!' 340: .elif defined(EXTERNAL_TOOLCHAIN) 341: @echo '*** Using external toolchain rooted at ${EXTERNAL_TOOLCHAIN}.' 342: .endif 343: .if defined(NBUILDJOBS) 344: @echo '*** WARNING: NBUILDJOBS is obsolete; use -j directly instead!' 345: .endif 346: 347: do-distrib-dirs: .PHONY .MAKE 348: .if !defined(DESTDIR) || ${DESTDIR} == "" 349: ${MAKEDIRTARGET} etc distrib-dirs DESTDIR=/ 350: .else 351: ${MAKEDIRTARGET} etc distrib-dirs DESTDIR=${DESTDIR} 352: .endif 353: 354: .for targ in cleandir obj includes 355: do-${targ}: .PHONY ${targ} 356: @true 357: .endfor 358: 359: .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 360: do-${dir:S/\//-/g}: .PHONY .MAKE 361: .for targ in dependall install 362: ${MAKEDIRTARGET} ${dir} ${targ} 363: .endfor 364: .endfor 365: 366: do-ld.so: .PHONY .MAKE 367: .for targ in dependall install 368: .if (${OBJECT_FMT} == "a.out") 369: ${MAKEDIRTARGET} libexec/ld.aout_so ${targ} 370: .endif 371: .if (${OBJECT_FMT} == "ELF") 372: ${MAKEDIRTARGET} libexec/ld.elf_so ${targ} 373: .endif 374: .endfor 375: 376: do-build: .PHONY .MAKE 377: .for targ in dependall install 378: ${MAKEDIRTARGET} . ${targ} BUILD_tools=no BUILD_lib=no 379: .endfor 380: 381: do-x11: .PHONY .MAKE 382: ${MAKEDIRTARGET} x11 build 383: 384: do-obsolete: .PHONY .MAKE 385: ${MAKEDIRTARGET} etc install-obsolete-lists 386: 387: # 388: # Speedup stubs for some subtrees that don't need to run these rules. 389: # (Tells <bsd.subdir.mk> not to recurse for them.) 390: # 391: 392: .for dir in bin etc distrib games libexec regress sbin usr.sbin tools 393: includes-${dir}: .PHONY 394: @true 395: .endfor 396: .for dir in etc distrib regress 397: install-${dir}: .PHONY 398: @true 399: .endfor 400: 401: # 402: # XXX this needs to change when distrib Makefiles are recursion compliant 403: # XXX many distrib subdirs need "cd etc && make snap_pre snap_kern" first... 404: # 405: dependall-distrib depend-distrib all-distrib: .PHONY 406: @true 407: 408: .include <bsd.sys.mk> 409: .include <bsd.obj.mk> 410: .include <bsd.kernobj.mk> 411: .include <bsd.subdir.mk> 412: 413: build-docs: .PHONY ${.CURDIR}/BUILDING 414: ${.CURDIR}/BUILDING: doc/BUILDING.mdoc 415: ${_MKMSG_CREATE} ${.TARGET} 416: ${TOOL_GROFF} -mdoc -Tascii -P-bou $> >$@ 417: 418: 419: # 420: # Display current make(1) parameters 421: # 422: params: .PHONY .MAKE 423: ${MAKEDIRTARGET} etc params