1 # $NetBSD: Makefile,v 1.253 2008/05/22 14:13:58 lukem 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 # obj: creates object directories. 78 # do-tools: builds host toolchain. 79 # do-distrib-dirs: creates the distribution directories. 80 # includes: installs include files. 81 # do-tools-compat: builds the "libnbcompat" library; needed for some 82 # random host tool programs in the source tree. 83 # do-lib-csu: builds and installs prerequisites from lib/csu. 84 # do-libgcc: builds and installs prerequisites from 85 # gnu/lib/crtstuff${LIBGCC_EXT} (if necessary) and 86 # gnu/lib/libgcc${LIBGCC_EXT}. 87 # do-lib-libc: builds and installs prerequisites from lib/libc. 88 # do-lib: builds and installs prerequisites from lib. 89 # do-gnu-lib: builds and installs prerequisites from gnu/lib. 90 # do-external-lib: builds and installs prerequisites from external/lib. 91 # do-ld.so: builds and installs prerequisites from libexec/ld.*_so. 92 # do-build: builds and installs the entire system. 93 # do-x11: builds and installs X11R6 from src/x11 if ${MKX11} != "no" 94 # do-obsolete: installs the obsolete sets (for the postinstall-* targets). 95 # 96 97 .if ${.MAKEFLAGS:M${.CURDIR}/share/mk} == "" 98 .MAKEFLAGS: -m ${.CURDIR}/share/mk 99 .endif 100 101 # 102 # If _SRC_TOP_OBJ_ gets set here, we will end up with a directory that may 103 # not be the top level objdir, because "make obj" can happen in the *middle* 104 # of "make build" (long after <bsd.own.mk> is calculated it). So, pre-set 105 # _SRC_TOP_OBJ_ here so it will not be added to ${.MAKEOVERRIDES}. 106 # 107 _SRC_TOP_OBJ_= 108 109 .include <bsd.own.mk> 110 111 # 112 # Sanity check: make sure that "make build" is not invoked simultaneously 113 # with a standard recursive target. 114 # 115 116 .if make(build) || make(release) || make(snapshot) 117 .for targ in ${TARGETS:Nobj:Ncleandir} 118 .if make(${targ}) && !target(.BEGIN) 119 .BEGIN: 120 @echo 'BUILD ABORTED: "make build" and "make ${targ}" are mutually exclusive.' 121 @false 122 .endif 123 .endfor 124 .endif 125 126 _SUBDIR= tools lib include gnu external bin games libexec sbin usr.bin 127 _SUBDIR+= usr.sbin share rescue sys etc tests .WAIT distrib regress 128 129 # 130 # Weed out directories that don't exist. 131 # 132 133 .for dir in ${_SUBDIR} 134 .if ("${dir}" == ".WAIT") || exists(${dir}/Makefile) && (${BUILD_${dir}:Uyes} != "no") 135 SUBDIR+= ${dir} 136 .endif 137 .endfor 138 139 .if exists(regress) 140 regression-tests: .PHONY .MAKE 141 @echo Running regression tests... 142 ${MAKEDIRTARGET} regress regress 143 .endif 144 145 .if ${MKUNPRIVED} != "no" 146 NOPOSTINSTALL= # defined 147 .endif 148 149 afterinstall: .PHONY .MAKE 150 .if ${MKMAN} != "no" 151 ${MAKEDIRTARGET} share/man makedb 152 .endif 153 .if (${MKUNPRIVED} != "no" && ${MKINFO} != "no") 154 ${MAKEDIRTARGET} gnu/usr.bin/texinfo/install-info infodir-meta 155 .endif 156 .if !defined(NOPOSTINSTALL) 157 ${MAKEDIRTARGET} . postinstall-check 158 .endif 159 160 _POSTINSTALL= ${.CURDIR}/usr.sbin/postinstall/postinstall 161 162 postinstall-check: .PHONY 163 @echo " === Post installation checks ===" 164 ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ check; if [ $$? -gt 1 ]; then exit 1; fi 165 @echo " ================================" 166 167 postinstall-fix: .NOTMAIN .PHONY 168 @echo " === Post installation fixes ===" 169 ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix 170 @echo " ===============================" 171 172 postinstall-fix-obsolete: .NOTMAIN .PHONY 173 @echo " === Removing obsolete files ===" 174 ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix obsolete 175 @echo " ===============================" 176 177 178 # 179 # Targets (in order!) called by "make build". 180 # 181 .if ${HAVE_GCC} == "3" 182 LIBGCC_EXT=3 183 .else 184 LIBGCC_EXT=4 185 .endif 186 187 BUILDTARGETS+= check-tools 188 .if ${MKUPDATE} == "no" && !defined(NOCLEANDIR) 189 BUILDTARGETS+= cleandir 190 .endif 191 .if ${MKOBJDIRS} != "no" 192 BUILDTARGETS+= obj 193 .endif 194 .if ${USETOOLS} == "yes" 195 BUILDTARGETS+= do-tools 196 .endif 197 .if !defined(NODISTRIBDIRS) 198 BUILDTARGETS+= do-distrib-dirs 199 .endif 200 .if !defined(NOINCLUDES) 201 BUILDTARGETS+= includes 202 .endif 203 BUILDTARGETS+= do-tools-compat 204 BUILDTARGETS+= do-lib-csu 205 .if ${MKGCC} != "no" 206 BUILDTARGETS+= do-libgcc 207 .endif 208 BUILDTARGETS+= do-lib-libc 209 BUILDTARGETS+= do-lib do-gnu-lib do-external-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 external/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-libgcc: .PHONY .MAKE 367 .if ${MKGCC} != "no" 368 .if (${HAVE_GCC} == "3" || ${HAVE_GCC} == "4") 369 ${MAKEDIRTARGET} . do-gnu-lib-crtstuff${LIBGCC_EXT} 370 .endif 371 ${MAKEDIRTARGET} . do-gnu-lib-libgcc${LIBGCC_EXT} 372 .endif 373 374 do-ld.so: .PHONY .MAKE 375 .for targ in dependall install 376 .if (${OBJECT_FMT} == "a.out") 377 ${MAKEDIRTARGET} libexec/ld.aout_so ${targ} 378 .endif 379 .if (${OBJECT_FMT} == "ELF") 380 ${MAKEDIRTARGET} libexec/ld.elf_so ${targ} 381 .endif 382 .endfor 383 384 do-build: .PHONY .MAKE 385 .for targ in dependall install 386 ${MAKEDIRTARGET} . ${targ} BUILD_tools=no BUILD_lib=no 387 .endfor 388 389 do-x11: .PHONY .MAKE 390 ${MAKEDIRTARGET} x11 build 391 392 do-obsolete: .PHONY .MAKE 393 ${MAKEDIRTARGET} etc install-obsolete-lists 394 395 # 396 # Speedup stubs for some subtrees that don't need to run these rules. 397 # (Tells <bsd.subdir.mk> not to recurse for them.) 398 # 399 400 .for dir in bin etc distrib games libexec regress sbin usr.sbin tools 401 includes-${dir}: .PHONY 402 @true 403 .endfor 404 .for dir in etc distrib regress 405 install-${dir}: .PHONY 406 @true 407 .endfor 408 409 # 410 # XXX this needs to change when distrib Makefiles are recursion compliant 411 # XXX many distrib subdirs need "cd etc && make snap_pre snap_kern" first... 412 # 413 dependall-distrib depend-distrib all-distrib: .PHONY 414 @true 415 416 .include <bsd.sys.mk> 417 .include <bsd.obj.mk> 418 .include <bsd.kernobj.mk> 419 .include <bsd.subdir.mk> 420 421 build-docs: .PHONY ${.CURDIR}/BUILDING 422 ${.CURDIR}/BUILDING: doc/BUILDING.mdoc 423 ${_MKMSG_CREATE} ${.TARGET} 424 ${TOOL_GROFF} -mdoc -Tascii -P-bou $> >$@ 425 426 427 # 428 # Display current make(1) parameters 429 # 430 params: .PHONY .MAKE 431 ${MAKEDIRTARGET} etc params 432