Makefile
author kristerw <kristerw@pkgsrc.org>
Mon, 06 Jun 2005 22:30:19 +0000
branchtrunk
changeset 80688 3b810a80c645
parent 80369 1948bd3b6445
child 82009 044b0b1da623
permissions -rw-r--r--
Add the crosspkgtools category.

# $NetBSD: Makefile,v 1.73 2005/06/06 22:30:19 kristerw Exp $
#

# tools used by this Makefile
PKGSRC_USE_TOOLS+=	[ awk cat cmp echo env expr false fgrep grep mv	\
			rm sed sort wc

# additional tools used by bsd.pkg.subdir.mk
PKGSRC_USE_TOOLS+=	basename touch

# additional tools used by bsd.bulk-pkg.mk
PKGSRC_USE_TOOLS+=	egrep find ls sh tee true tsort

.include "mk/bsd.prefs.mk"

.ifdef SPECIFIC_PKGS
SUBDIR+=	${SITE_SPECIFIC_PKGS}
SUBDIR+=	${HOST_SPECIFIC_PKGS}
SUBDIR+=	${GROUP_SPECIFIC_PKGS}
SUBDIR+=	${USER_SPECIFIC_PKGS}
.else
SUBDIR += archivers
SUBDIR += audio
SUBDIR += benchmarks
SUBDIR += biology
SUBDIR += cad
SUBDIR += chat
SUBDIR += comms
SUBDIR += converters
SUBDIR += cross
SUBDIR += crosspkgtools
SUBDIR += databases
SUBDIR += devel
SUBDIR += editors
SUBDIR += emulators
SUBDIR += finance
SUBDIR += fonts
SUBDIR += games
SUBDIR += geography
SUBDIR += graphics
SUBDIR += ham
SUBDIR += inputmethod
SUBDIR += lang
SUBDIR += mail
SUBDIR += math
SUBDIR += mbone
SUBDIR += meta-pkgs
SUBDIR += misc
SUBDIR += multimedia
SUBDIR += net
SUBDIR += news
SUBDIR += parallel
SUBDIR += pkgtools
SUBDIR += print
#SUBDIR += regress
SUBDIR += security
SUBDIR += shells
SUBDIR += sysutils
SUBDIR += textproc
SUBDIR += time
SUBDIR += wm
SUBDIR += www
SUBDIR += x11
.endif

.ifdef USER_ADDITIONAL_PKGS
SUBDIR+=	${USER_ADDITIONAL_PKGS}
.endif

PKGSRCTOP=	yes


# If PACKAGES is set to the default (${PKGSRCDIR}/packages), the current
# ${MACHINE_ARCH} and "release" (uname -r) will be used. Otherwise a directory
# structure of ...pkgsrc/packages/`uname -r`/${MACHINE_ARCH} is assumed.
# The PKG_URL is set from FTP_PKG_URL_* or CDROM_PKG_URL_*, depending on
# the target used to generate the README.html file.
.PHONY: README.html
_README_TYPE_FLAG?=	none
README.html: .PRECIOUS
.if ${_README_TYPE_FLAG} == "--ftp" || ${_README_TYPE_FLAG} == "--cdrom"
	${SETENV} TMPDIR=${TMPDIR:U/tmp}/mkreadme	 		\
		BMAKE=${MAKE}						\
		./mk/scripts/mkreadme --pkgsrc ${.CURDIR} 		\
		--packages ${PACKAGES} ${_README_TYPE_FLAG}		\
		--prune
.else
	@${ECHO} "ERROR:  please do not use the README.html target directly."
	@${ECHO} "        Instead use either the \"readme\" or \"cdrom-readme\""
	@${ECHO} "        target."
	@${FALSE}
.endif

.include "mk/bsd.pkg.subdir.mk"

# the bulk-cache and clean-bulk-cache targets are a global-pkgsrc
# thing and thus it makes sense to run it from the top level pkgsrc
# directory.
.if make(bulk-cache) || make(clean-bulk-cache)
.include "${.CURDIR}/mk/bulk/bsd.bulk-pkg.mk"
.endif

.PHONY: ${.CURDIR}/PKGDB
${.CURDIR}/PKGDB:
	@${RM} -f ${.CURDIR}/PKGDB
	@${ECHO_MSG} "Extracting complete dependency database.  This may take a while..."
	@DB=${.CURDIR}/PKGDB ; \
	PKGSRCDIR=${.CURDIR} ; \
	npkg=1; \
	list=`${GREP} '^[[:space:]]*'SUBDIR */Makefile | ${SED} 's,/Makefile.*=[[:space:]]*,/,'` ; \
	for pkgdir in $$list ; do \
		if [ ! -d $$pkgdir ]; then  \
			echo " " ; \
			echo "WARNING:  the package directory $$pkgdir is listed in" > /dev/stderr ; \
			echo $$pkgdir | ${SED} 's;/.*;/Makefile;g' > /dev/stderr ; \
			echo "but the directory does not exist.  Please fix this!" > /dev/stderr ; \
		else \
			cd $$pkgdir ; \
			l=`${MAKE} print-summary-data`  ; \
			if [ $$? != 0 ]; then \
				echo "WARNING (printdepends):  the package in $$pkgdir had problem with" \
					> /dev/stderr ; \
				echo "    ${MAKE} print-summary-data" > /dev/stderr ; \
				echo "    database information for this package" > /dev/stderr ; \
				echo "    will be dropped." > /dev/stderr ; \
				${MAKE} print-summary-data  2>&1 > /dev/stderr ; \
			else \
				echo "$$l" >> $$DB ; \
			fi ; \
		fi ; \
		echo -n "." ; \
		if [ `${EXPR} $$npkg % 100 = 0` -eq 1 ]; then \
			echo " " ; \
			echo "$$npkg" ; \
		fi ; \
		npkg=`${EXPR} $$npkg + 1` ; \
		cd $$PKGSRCDIR  ; \
	done

.PHONY: index
index: ${.CURDIR}/INDEX

${.CURDIR}/INDEX: ${.CURDIR}/PKGDB
	@${RM} -f ${.CURDIR}/INDEX
	@${AWK} -f ./mk/scripts/genindex.awk PKGSRCDIR=${.CURDIR} SORT=${SORT} ${.CURDIR}/PKGDB
	@${RM} -f ${.CURDIR}/PKGDB

print-index: ${.CURDIR}/INDEX
	@${AWK} -F\| '{ printf("Pkg:\t%s\nPath:\t%s\nInfo:\t%s\nMaint:\t%s\nIndex:\t%s\nB-deps:\t%s\nR-deps:\t%s\nArch:\t%s\n\n", $$1, $$2, $$4, $$6, $$7, $$8, $$9, $$10); }' < ${.CURDIR}/INDEX

search: ${.CURDIR}/INDEX
.if !defined(key)
	@${ECHO} "The search target requires a keyword parameter,"
	@${ECHO} "e.g.: \"${MAKE} search key=somekeyword\""
.else
	@${GREP} ${key} ${.CURDIR}/INDEX | ${AWK} -F\| '{ printf("Pkg:\t%s\nPath:\t%s\nInfo:\t%s\nMaint:\t%s\nIndex:\t%s\nB-deps:\t%s\nR-deps:\t%s\nArch:\t%s\n\n", $$1, $$2, $$4, $$6, $$7, $$8, $$9, $$10); }'
.endif

#
# Generate list of all packages by extracting information from
# the category/README.html pages
#
readme-all:
	@if [ -f README-all.html ]; then \
		${MV} README-all.html README-all.html.BAK ; \
	fi
	@${MAKE} README-all.html
	@if ${CMP} -s README-all.html README-all.html.BAK ; then \
		${MV} README-all.html.BAK README-all.html ; \
	else \
		${RM} -f README-all.html.BAK ; \
	fi

README-all.html:
	@${RM} -f $@.new
	@${RM} -f $@.newsorted
	@${ECHO} -n "Processing categories for $@:"
.for category in ${SUBDIR}
	@if [ -f ${category}/README.html ]; then \
		${ECHO} -n ' ${category}' ; \
		${GREP} '^<TR>' ${category}/README.html \
		| ${SED} -e 's|"|"${category}/|' \
		      -e 's| <TD>| <TD>(<A HREF="${category}/README.html">${category}</A>) <TD>|' \
		      -e 's|<TR>|<TR VALIGN=TOP>|' \
		      -e 's|<TD VALIGN=TOP>|<TD>|' \
		>> $@.new ; \
	fi
.endfor
	@${ECHO} "."
	@if [ ! -f $@.new ]; then \
		${ECHO} "There are no categories with README.html files available."; \
		${ECHO} "You need to run \`${MAKE} readme' to generate them before running this target."; \
		${FALSE}; \
	fi
	@${SORT} -f -t '">' +2 <$@.new >$@.newsorted
	@${WC} -l $@.newsorted | ${AWK} '{ print $$1 }'  >$@.npkgs
	@${CAT} templates/README.all \
	| ${SED} \
		-e '/%%NPKGS%%/r$@.npkgs' \
		-e '/%%NPKGS%%/d' \
		-e '/%%PKGS%%/r$@.newsorted' \
		-e '/%%PKGS%%/d' \
		> $@
	@${RM} -f $@.npkgs
	@${RM} -f $@.new
	@${RM} -f $@.newsorted

readme-ipv6:
	@if [ -f README-IPv6.html ]; then \
		${MV} README-IPv6.html README-IPv6.html.BAK ; \
	fi
	@${MAKE} README-IPv6.html
	@if ${CMP} -s README-IPv6.html README-IPv6.html.BAK  ; then \
		${MV} README-IPv6.html.BAK README-IPv6.html ; \
	else \
		${RM} -f README-IPv6.html.BAK ; \
	fi

README-IPv6.html:
	@${GREP} -l -e '^BUILD_DEFS.*=.*USE_INET6' -e '^PKG_SUPPORTED_OPTIONS.*=.*inet6' \
		 */*/Makefile */*/options.mk \
	 | ${SED} -e s,Makefile,, -e s,options.mk,, >$@.pkgs
	@${FGREP} -f $@.pkgs README-all.html | ${SORT} -t/ +1 >$@.trs
	@${CAT} templates/README.ipv6 \
	| ${SED} \
		-e '/%%TRS%%/r$@.trs' \
		-e '/%%TRS%%/d' \
		>$@
	@${RM} $@.pkgs $@.trs

show-host-specific-pkgs:
	@${ECHO} "HOST_SPECIFIC_PKGS= \\";					\
	${MAKE} show-pkgsrc-dir | ${AWK} '/^===/ { next; } { printf("%s \\\n", $$1) }'; \
	${ECHO} ""

# list all packages that depend on a particular package; needs the INDEX file
# usage: 'make show-deps PKG=openssl'
# PKG: name of the package
show-deps:
	@if [ ! -f "${.CURDIR}/INDEX" ]; then ${ECHO} "No index available -- please build it with 'make index'" >&2; ${FALSE}; fi
	@if [ -z "${PKG}" ]; then ${ECHO} "PKG variable not set" >&2; ${FALSE}; fi
	@${GREP} -E "^([^|]*\|){7}([^|]* |)${PKG}>=" ${.CURDIR}/INDEX | ${SED} -n "s/^[^|]*|\([^|]*\)|.*/\1/p" | ${SORT}