bsd.port.mk revision 5374
1# -*- mode: Fundamental; tab-width: 4; -*- 2# 3# bsd.port.mk - 940820 Jordan K. Hubbard. 4# This file is in the public domain. 5# 6# $Id: bsd.port.mk,v 1.92 1995/01/04 07:35:46 jkh Exp $ 7# 8# Please view me with 4 column tabs! 9 10 11# Supported Variables and their behaviors: 12# 13# Variables that typically apply to all ports: 14# 15# PORTSDIR - The root of the ports tree (default: /usr/ports). 16# DISTDIR - Where to get gzip'd, tarballed copies of original sources 17# (default: ${PORTSDIR}/distfiles). 18# PREFIX - Where to install things in general (default: /usr/local). 19# MASTER_SITES - Primary location(s) for distribution files if not found 20# locally (default: 21# ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles) 22# 23# MASTER_SITE_OVERRIDE - If set, override the MASTER_SITES setting with this 24# value. 25# MASTER_SITE_FREEBSD - If set, only use the FreeBSD master repository for 26# MASTER_SITES. 27# PACKAGES - A top level directory where all packages go (rather than 28# going locally to each port). (default: ${PORTSDIR}/packages). 29# GMAKE - Set to path of GNU make if not in $PATH (default: gmake). 30# XMKMF - Set to path of `xmkmf' if not in $PATH (default: xmkmf). 31# 32# Variables that typically apply to an individual port. Non-Boolean 33# variables without defaults are *mandatory*. 34# 35# 36# WRKDIR - A temporary working directory that gets *clobbered* on clean 37# (default: ${.CURDIR}/work). 38# WRKSRC - A subdirectory of ${WRKDIR} where the distribution actually 39# unpacks to. (Default: ${WRKDIR}/${DISTNAME} unless 40# NO_WRKSUBDIR is set, in which case simply ${WRKDIR}). 41# DISTNAME - Name of port or distribution. 42# DISTFILES - Name(s) of archive file(s) containing distribution 43# (default: ${DISTDIR}/${DISTNAME}${EXTRACT_SUFX}). 44# PKGNAME - Name of the package file to create if the DISTNAME 45# isn't really relevant for the port/package 46# (default: ${DISTNAME}). 47# EXTRACT_ONLY - If defined, a subset of ${DISTFILES} you want to 48# actually extract. 49# PATCHDIR - A directory containing any required patches 50# (default: ${.CURDIR}/patches) 51# SCRIPTDIR - A directory containing any auxilliary scripts 52# (default: ${.CURDIR}/scripes) 53# FILESDIR - A directory containing any miscellaneous additional files. 54# (default: ${.CURDIR}/files) 55# PKGDIR - A direction containing any package creation files. 56# (default: ${.CURDIR}/pkg) 57# 58# NO_EXTRACT - Use a dummy (do-nothing) extract target. 59# NO_CONFIGURE - Use a dummy (do-nothing) configure target. 60# NO_BUILD - Use a dummy (do-nothing) build target. 61# NO_PACKAGE - Use a dummy (do-nothing) package target. 62# NO_INSTALL - Use a dummy (do-nothing) install target. 63# NO_WRKSUBDIR - Assume port unpacks directly into ${WRKDIR}. 64# NO_WRKDIR - There's no work directory at all; port does this someplace 65# else. 66# NO_DEPENDS - Don't verify build of dependencies. 67# USE_GMAKE - Says that the port uses gmake. 68# USE_IMAKE - Says that the port uses imake. 69# NO_INSTALL_MANPAGES - For imake ports that don't like the install.man 70# target. 71# HAS_CONFIGURE - Says that the port has its own configure script. 72# GNU_CONFIGURE - Set if you are using GNU configure (optional). 73# CONFIGURE_ARGS - Pass these args to configure, if ${HAS_CONFIGURE} set. 74# IS_INTERACTIVE - Set this if your port needs to interact with the user 75# during a build. User can then decide to skip this port by 76# setting ${BATCH}, or compiling only the interactive ports 77# by setting ${INTERACTIVE}. 78# DEPENDS - A list of other ports this package depends on being 79# made first, relative to ${PORTSDIR} (e.g. x11/tk, lang/tcl, 80# etc). 81# EXTRACT_CMD - Command for extracting archive (default: tar). 82# EXTRACT_SUFX - Suffix for archive names (default: .tar.gz). 83# EXTRACT_ARGS - Arguments to ${EXTRACT_CMD} (default: -C ${WRKDIR} -xzf). 84# 85# NCFTP - Full path to ncftp command if not in $PATH (default: ncftp). 86# NCFTPFLAGS - Arguments to ${NCFTP} (default: -N). 87# 88# 89# Default targets and their behaviors: 90# 91# fetch - Retrieves ${DISTFILES} into ${DISTDIR} as necessary. 92# extract - Unpacks ${DISTFILES} into ${WRKDIR}. 93# configure - Applies patches, if any, and runs either GNU configure, one 94# or more local configure scripts or nothing, depending on 95# what's available. 96# patch - Apply any provided patches to the source. 97# build - Actually compile the sources. 98# install - Install the results of a build. 99# reinstall - Install the results of a build, ignoring "already installed" 100# flag. 101# package - Create a package from a build. 102# describe - Try to generate a one-line description for each port for 103# use in INDEX files and the like. 104# 105# Default sequence for "all" is: fetch extract configure build 106 107.if exists(${.CURDIR}/../Makefile.inc) 108.include "${.CURDIR}/../Makefile.inc" 109.endif 110 111# These need to be absolute since we don't know how deep in the ports 112# tree we are and thus can't go relative. They can, of course, be overridden 113# by individual Makefiles. 114PORTSDIR?= ${DESTDIR}/usr/ports 115X11BASE?= /usr/X11R6 116DISTDIR?= ${PORTSDIR}/distfiles 117PACKAGES?= ${PORTSDIR}/packages 118.if !defined(NO_WRKDIR) 119WRKDIR?= ${.CURDIR}/work 120.else 121WRKDIR?= ${.CURDIR} 122.endif 123.if defined(NO_WRKSUBDIR) 124WRKSRC?= ${WRKDIR} 125.else 126WRKSRC?= ${WRKDIR}/${DISTNAME} 127.endif 128PATCHDIR?= ${.CURDIR}/patches 129SCRIPTDIR?= ${.CURDIR}/scripts 130FILESDIR?= ${.CURDIR}/files 131PKGDIR?= ${.CURDIR}/pkg 132.if defined(USE_IMAKE) 133PREFIX?= ${X11BASE} 134.else 135PREFIX?= /usr/local 136.endif 137.if defined(USE_GMAKE) 138DEPENDS+= ${PORTSDIR}/devel/gmake 139.endif 140 141.if exists(${PORTSDIR}/../Makefile.inc) 142.include "${PORTSDIR}/../Makefile.inc" 143.endif 144 145 146# Change these if you'd prefer to keep the cookies someplace else. 147EXTRACT_COOKIE?= ${WRKDIR}/.extract_done 148CONFIGURE_COOKIE?= ${WRKDIR}/.configure_done 149INSTALL_COOKIE?= ${WRKDIR}/.install_done 150BUILD_COOKIE?= ${WRKDIR}/.build_done 151PATCH_COOKIE?= ${WRKDIR}/.patch_done 152 153# How to do nothing. Override if you, for some strange reason, would rather 154# do something. 155DO_NADA?= echo -n 156 157# Miscellaneous overridable commands: 158GMAKE?= gmake 159XMKMF?= xmkmf 160MD5?= md5 161MD5_FILE?= ${FILESDIR}/md5 162MAKE_FLAGS?= -f 163MAKEFILE?= Makefile 164 165NCFTP?= ncftp 166NCFTPFLAGS?= -N 167 168TOUCH?= touch 169TOUCH_FLAGS?= -f 170 171PATCH?= patch 172PATCH_STRIP?= -p0 173.if defined(PATCH_DEBUG) 174PATCH_ARGS?= -d ${WRKSRC} -E ${PATCH_STRIP} 175.else 176PATCH_ARGS?= -d ${WRKSRC} --forward --quiet -E ${PATCH_STRIP} 177.endif 178 179EXTRACT_CMD?= tar 180EXTRACT_SUFX?= .tar.gz 181EXTRACT_ARGS?= -C ${WRKDIR} -xzf 182 183PKG_CMD?= pkg_create 184PKG_ARGS?= -v -c ${PKGDIR}/COMMENT -d ${PKGDIR}/DESCR -f ${PKGDIR}/PLIST -p ${PREFIX} 185PKG_SUFX?= .tgz 186 187ALL_TARGET?= all 188INSTALL_TARGET?= install 189 190.if defined(MASTER_SITE_FREEBSD) 191MASTER_SITE_OVERRIDE= ftp://freebsd.cdrom.com/pub/FreeBSD/FreeBSD-current/ports/distfiles/ 192.endif 193 194# I guess we're in the master distribution business! :) As we gain mirror 195# sites for distfiles, add them to this list. 196.if !defined(MASTER_SITE_OVERRIDE) 197MASTER_SITES+= ftp://freebsd.cdrom.com/pub/FreeBSD/FreeBSD-current/ports/distfiles/ 198.else 199MASTER_SITES= ${MASTER_SITE_OVERRIDE} 200.endif 201 202# Derived names so that they're easily overridable. 203DISTFILES?= ${DISTNAME}${EXTRACT_SUFX} 204PKGNAME?= ${DISTNAME} 205 206.if exists(${PACKAGES}) 207PKGFILE?= ${PACKAGES}/${PKGNAME}${PKG_SUFX} 208.else 209PKGFILE?= ${PKGNAME}${PKG_SUFX} 210.endif 211 212.if defined(GNU_CONFIGURE) 213CONFIGURE_ARGS?= --prefix=${PREFIX} 214HAS_CONFIGURE= yes 215.endif 216 217.MAIN: all 218 219# If we're in BATCH mode and the port is interactive, or we're in 220# interactive mode and the port is non-interactive, skip all the important 221# targets. The reason we have two modes is that one might want to leave 222# a build in BATCH mode running overnight, then come back in the morning 223# and do _only_ the interactive ones that required your intervention. 224# This allows you to do both. 225# 226.if (defined(IS_INTERACTIVE) && defined(BATCH)) || (!defined(IS_INTERACTIVE) && defined(INTERACTIVE)) 227all: 228 @${DO_NADA} 229pre-build: 230 @${DO_NADA} 231build: 232 @${DO_NADA} 233pre-install: 234 @${DO_NADA} 235install: 236 @${DO_NADA} 237pre-fetch: 238 @${DO_NADA} 239fetch: 240 @${DO_NADA} 241pre-configure: 242 @${DO_NADA} 243configure: 244 @${DO_NADA} 245.endif 246 247.if !target(all) 248all: extract configure build 249.endif 250 251.if !target(is_depended) 252is_depended: all install 253.endif 254 255# The following are used to create easy dummy targets for disabling some 256# bit of default target behavior you don't want. They still check to see 257# if the target exists, and if so don't do anything, since you might want 258# to set this globally for a group of ports in a Makefile.inc, but still 259# be able to override from an individual Makefile (since you can't _undefine_ 260# a variable in make!). 261.if defined(NO_EXTRACT) && !target(extract) 262extract: 263 @${TOUCH} ${TOUCH_FLAGS} ${EXTRACT_COOKIE} 264check-md5: 265 @${DO_NADA} 266make-md5: 267 @${DO_NADA} 268.endif 269.if defined(NO_CONFIGURE) && !target(configure) 270configure: 271 @${TOUCH} ${TOUCH_FLAGS} ${CONFIGURE_COOKIE} 272.endif 273.if defined(NO_BUILD) && !target(build) 274build: 275 @${TOUCH} ${TOUCH_FLAGS} ${BUILD_COOKIE} 276.endif 277.if defined(NO_PACKAGE) && !target(package) 278package: 279 @${DO_NADA} 280.endif 281.if defined(NO_INSTALL) && !target(install) 282install: 283 @${TOUCH} ${TOUCH_FLAGS} ${INSTALL_COOKIE} 284.endif 285.if defined(NO_PATCH) && !target(patch) 286patch: 287 @${TOUCH} ${TOUCH_FLAGS} ${PATCH_COOKIE} 288.endif 289 290# More standard targets start here. 291 292.if !target(describe) 293describe: 294 @if [ -f ${PKGDIR}/COMMENT ]; then \ 295 echo "${.CURDIR}/${DISTNAME}: `cat ${PKGDIR}/COMMENT`"; \ 296 else \ 297 echo "${.CURDIR}/${DISTNAME}: ** No Description"; \ 298 fi 299.endif 300 301.if !target(reinstall) 302reinstall: pre-reinstall install 303 304pre-reinstall: 305 @rm -f ${INSTALL_COOKIE} 306.endif 307 308.if !target(pre-install) 309pre-install: 310 @${DO_NADA} 311.endif 312 313.if !target(install) 314install: ${INSTALL_COOKIE} 315 316${INSTALL_COOKIE}: 317 @echo "===> Installing for ${DISTNAME}" 318 @${MAKE} ${.MAKEFLAGS} pre-install 319.if defined(USE_GMAKE) 320 @(cd ${WRKSRC}; ${GMAKE} PREFIX=${PREFIX} ${MAKE_FLAGS} ${MAKEFILE} ${INSTALL_TARGET}) 321.if defined(USE_IMAKE) && !defined(NO_INSTALL_MANPAGES) 322 @(cd ${WRKSRC}; ${GMAKE} ${MAKE_FLAGS} ${MAKEFILE} install.man) 323.endif 324.else defined(USE_GMAKE) 325 @(cd ${WRKSRC}; ${MAKE} PREFIX=${PREFIX} ${MAKE_FLAGS} ${MAKEFILE} ${INSTALL_TARGET}) 326.if defined(USE_IMAKE) && !defined(NO_INSTALL_MANPAGES) 327 @(cd ${WRKSRC}; ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} install.man) 328.endif 329.endif 330 @${TOUCH} ${TOUCH_FLAGS} ${INSTALL_COOKIE} 331.endif 332 333.if !target(pre-package) 334pre-package: 335 @${DO_NADA} 336.endif 337 338.if !target(package) 339package: pre-package 340# Makes some gross assumptions about a fairly simple package with no 341# install, require or deinstall scripts. Override the arguments with 342# PKG_ARGS if your package is anything but run-of-the-mill. 343 @if [ -d ${PKGDIR} ]; then \ 344 echo "===> Building package for ${DISTNAME}"; \ 345 ${PKG_CMD} ${PKG_ARGS} ${PKGFILE}; \ 346 fi 347.endif 348 349.if !target(depends) 350depends: 351.if defined(DEPENDS) 352 @echo "===> ${DISTNAME} depends on: ${DEPENDS}" 353.if !defined(NO_DEPENDS) 354 @for i in ${DEPENDS}; do \ 355 echo "===> Verifying build for $$i"; \ 356 if [ ! -d $$i ]; then \ 357 echo ">> No directory for $$i. Skipping.."; \ 358 else \ 359 (cd $$i; ${MAKE} ${.MAKEFLAGS} is_depended) ; \ 360 fi \ 361 done 362 @echo "===> Returning to build of ${DISTNAME}" 363.endif 364.endif 365.endif 366 367.if !target(pre-build) 368pre-build: 369 @${DO_NADA} 370.endif 371 372.if !target(build) 373build: configure depends ${BUILD_COOKIE} 374 375${BUILD_COOKIE}: 376 @echo "===> Building for ${DISTNAME}" 377 @${MAKE} ${.MAKEFLAGS} pre-build 378.if defined(USE_GMAKE) 379 @(cd ${WRKSRC}; ${GMAKE} ${MAKE_FLAGS} ${MAKEFILE} ${ALL_TARGET}) 380.else defined(USE_GMAKE) 381 @(cd ${WRKSRC}; ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} ${ALL_TARGET}) 382.endif 383 @if [ -f ${SCRIPTDIR}/post-build ]; then \ 384 env CURDIR=${.CURDIR} DISTDIR=${DISTDIR} WRKDIR=${WRKDIR} \ 385 WRKSRC=${WRKSRC} PATCHDIR=${PATCHDIR} SCRIPTDIR=${SCRIPTDIR} \ 386 FILESDIR=${FILESDIR} PORTSDIR=${PORTSDIR} PREFIX=${PREFIX} \ 387 DEPENDS="${DEPENDS}" \ 388 sh ${SCRIPTDIR}/post-build; \ 389 fi 390 @${TOUCH} ${TOUCH_FLAGS} ${BUILD_COOKIE} 391.endif 392 393.if !target(pre-patch) 394pre-patch: 395 @${DO_NADA} 396.endif 397 398.if !target(patch) 399patch: ${PATCH_COOKIE} 400 401${PATCH_COOKIE}: 402 @${MAKE} ${.MAKEFLAGS} pre-patch 403.if defined(PATCH_DEBUG) 404 @if [ -d ${PATCHDIR} ]; then \ 405 echo "===> Applying patches for ${DISTNAME}" ; \ 406 for i in ${PATCHDIR}/patch-*; do \ 407 echo "===> Applying patch $$i" ; \ 408 ${PATCH} ${PATCH_ARGS} < $$i; \ 409 done; \ 410 fi 411 @${TOUCH} ${TOUCH_FLAGS} ${PATCH_COOKIE} 412.else 413 @if [ -d ${PATCHDIR} ]; then \ 414 echo "===> Applying patches for ${DISTNAME}" ; \ 415 for i in ${PATCHDIR}/patch-*; \ 416 do ${PATCH} ${PATCH_ARGS} < $$i; \ 417 done;\ 418 fi 419 @${TOUCH} ${TOUCH_FLAGS} ${PATCH_COOKIE} 420.endif 421.endif 422 423.if !target(pre-configure) 424pre-configure: 425 @${DO_NADA} 426.endif 427 428.if !target(configure) 429configure: extract patch ${CONFIGURE_COOKIE} 430 431${CONFIGURE_COOKIE}: 432 @echo "===> Configuring for ${DISTNAME}" 433 @${MAKE} ${.MAKEFLAGS} pre-configure 434 @if [ -f ${SCRIPTDIR}/pre-configure ]; then \ 435 env CURDIR=${.CURDIR} DISTDIR=${DISTDIR} WRKDIR=${WRKDIR} \ 436 WRKSRC=${WRKSRC} PATCHDIR=${PATCHDIR} SCRIPTDIR=${SCRIPTDIR} \ 437 FILESDIR=${FILESDIR} PORTSDIR=${PORTSDIR} PREFIX=${PREFIX} \ 438 DEPENDS="${DEPENDS}" \ 439 sh ${SCRIPTDIR}/pre-configure; \ 440 fi 441 @if [ -f ${SCRIPTDIR}/configure ]; then \ 442 env CURDIR=${.CURDIR} DISTDIR=${DISTDIR} WRKDIR=${WRKDIR} \ 443 WRKSRC=${WRKSRC} PATCHDIR=${PATCHDIR} SCRIPTDIR=${SCRIPTDIR} \ 444 FILESDIR=${FILESDIR} PORTSDIR=${PORTSDIR} PREFIX=${PREFIX} \ 445 DEPENDS="${DEPENDS}" \ 446 sh ${SCRIPTDIR}/configure; \ 447 fi 448.if defined(HAS_CONFIGURE) 449 @(cd ${WRKSRC}; CC="${CC}" ac_cv_path_CC="${CC}" CFLAGS="${CFLAGS}" \ 450 INSTALL="${INSTALL} ${COPY} -o ${BINOWN} -g ${BINGRP}" \ 451 INSTALL_PROGRAM="${INSTALL} ${COPY} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE}" \ 452 ./configure ${CONFIGURE_ARGS}) 453.endif 454.if defined(USE_IMAKE) 455.if defined(USE_GMAKE) 456 @(cd ${WRKSRC}; ${XMKMF} && ${GMAKE} Makefiles) 457.else 458 @(cd ${WRKSRC}; ${XMKMF} && ${MAKE} Makefiles) 459.endif 460.endif 461 @if [ -f ${SCRIPTDIR}/post-configure ]; then \ 462 env CURDIR=${.CURDIR} DISTDIR=${DISTDIR} WRKDIR=${WRKDIR} \ 463 WRKSRC=${WRKSRC} PATCHDIR=${PATCHDIR} SCRIPTDIR=${SCRIPTDIR} \ 464 FILESDIR=${FILESDIR} PORTSDIR=${PORTSDIR} PREFIX=${PREFIX} \ 465 DEPENDS="${DEPENDS}" \ 466 sh ${SCRIPTDIR}/post-configure; \ 467 fi 468 @${TOUCH} ${TOUCH_FLAGS} ${CONFIGURE_COOKIE} 469.endif 470 471.if !target(pre-fetch) 472pre-fetch: 473 @${DO_NADA} 474.endif 475 476.if !target(fetch) 477fetch: pre-fetch 478 @if [ ! -d ${DISTDIR} ]; then mkdir -p ${DISTDIR}; fi 479 @(cd ${DISTDIR}; \ 480 for file in ${DISTFILES}; do \ 481 if [ ! -f $$file ]; then \ 482 echo ">> $$file doesn't seem to exist on this system."; \ 483 echo ">> Attempting to fetch it from a master site."; \ 484 for site in ${MASTER_SITES}; do \ 485 if ${NCFTP} ${NCFTPFLAGS} $${site}$${file}; then \ 486 break; \ 487 fi \ 488 done; \ 489 if [ ! -f $$file ]; then \ 490 echo ">> Couldn't fetch it - please try to retreive this";\ 491 echo ">> port manually into ${DISTDIR} and try again."; \ 492 exit 1; \ 493 fi; \ 494 fi \ 495 done) 496.endif 497 498.if !target(make-md5) 499make-md5: fetch 500 @if [ ! -d ${FILESDIR} ]; then mkdir -p ${FILESDIR}; fi 501 @if [ -f ${MD5_FILE} ]; then rm -f ${MD5_FILE}; fi 502 503 @(cd ${DISTDIR}; \ 504 for file in ${DISTFILES}; do \ 505 ${MD5} $$file >> ${MD5_FILE}; \ 506 done) 507.endif 508 509.if !target(check-md5) 510check-md5: fetch 511 @if [ ! -f ${MD5_FILE} ]; then \ 512 echo ">> No MD5 checksum file."; \ 513 exit 1; \ 514 fi 515 @(cd ${DISTDIR}; \ 516 for file in ${DISTFILES}; do \ 517 CKSUM=`${MD5} $$file | awk '{print $$4}'`; \ 518 CKSUM2=`grep "($$file)" ${MD5_FILE} | awk '{print $$4}'`; \ 519 if [ "$$CKSUM" != "$$CKSUM2" ]; then \ 520 echo ">> Checksum mismatch for $$file"; \ 521 exit 1; \ 522 fi; \ 523 done) 524 @echo "Checksums OK." 525.endif 526 527.if !target(pre-extract) 528pre-extract: 529 @${DO_NADA} 530.endif 531 532.if !target(extract) 533# We need to depend on .extract_done rather than the presence of ${WRKDIR} 534# because if the user interrupts the extract in the middle (and it's often 535# a long procedure), we get tricked into thinking that we've got a good dist 536# in ${WRKDIR}. 537extract: fetch pre-extract ${EXTRACT_COOKIE} 538 539${EXTRACT_COOKIE}: 540 @echo "===> Extracting for ${DISTNAME}" 541 @rm -rf ${WRKDIR} 542 @mkdir -p ${WRKDIR} 543.if defined(EXTRACT_ONLY) 544 @for file in ${EXTRACT_ONLY}; do \ 545 ${EXTRACT_CMD} ${EXTRACT_ARGS} ${DISTDIR}/$$file ; \ 546 done 547.else 548 @for file in ${DISTFILES}; do \ 549 ${EXTRACT_CMD} ${EXTRACT_ARGS} ${DISTDIR}/$$file ; \ 550 done 551.endif 552 @${TOUCH} ${TOUCH_FLAGS} ${EXTRACT_COOKIE} 553.endif 554 555.if !target(pre-clean) 556pre-clean: 557 @${DO_NADA} 558.endif 559 560.if !target(clean) 561clean: pre-clean 562 @echo "===> Cleaning for ${DISTNAME}" 563 @rm -f ${EXTRACT_COOKIE} ${CONFIGURE_COOKIE} ${INSTALL_COOKIE} \ 564 ${BUILD_COOKIE} ${PATCH_COOKIE} 565.if !defined(NO_WRKDIR) 566 @rm -rf ${WRKDIR} 567.endif 568.endif 569 570# No pre-targets for depend or tags. It would be silly. 571 572# Depend is generally meaningless for arbitrary ports, but if someone wants 573# one they can override this. This is just to catch people who've gotten into 574# the habit of typing `make depend all install' as a matter of course. 575# 576.if !target(depend) 577depend: 578.endif 579 580# Same goes for tags 581.if !target(tags) 582tags: 583.endif 584